Skip to content

Server Configuration

jitsudod is configured via an optional YAML file and JITSUDOD_* environment variables. Environment variables always take precedence over the config file, making them suitable for Kubernetes Secrets and twelve-factor deployments.

Terminal window
# Pass the config file path as a flag
jitsudod --config /etc/jitsudo/config.yaml
# Or via environment variable
JITSUDOD_CONFIG=/etc/jitsudo/config.yaml jitsudod
# Environment-only (no config file required)
JITSUDOD_DATABASE_URL=postgres://... jitsudod

Network listener addresses for the two APIs.

FieldYAML keyEnv varDefaultDescription
HTTP addressserver.http_addrJITSUDOD_HTTP_ADDR:8080REST gateway (grpc-gateway) listen address
gRPC addressserver.grpc_addrJITSUDOD_GRPC_ADDR:8443Native gRPC API listen address
server:
http_addr: ":8080"
grpc_addr: ":8443"

PostgreSQL connection settings. jitsudo requires PostgreSQL — SQLite is not supported.

FieldYAML keyEnv varDefaultDescription
Connection URLdatabase.urlJITSUDOD_DATABASE_URLLocal dev defaultPostgreSQL DSN (postgres://user:pass@host:port/db?sslmode=require)
database:
url: "postgres://jitsudo:password@localhost:5432/jitsudo?sslmode=require"

OIDC token validation settings.

FieldYAML keyEnv varDefaultDescription
OIDC issuerauth.oidc_issuerJITSUDOD_OIDC_ISSUERhttp://localhost:5556/dexMust match the iss claim in tokens issued by your IdP
Client IDauth.client_idJITSUDOD_OIDC_CLIENT_IDjitsudo-cliOIDC client ID registered with your IdP for the server
auth:
oidc_issuer: "https://your-idp.example.com"
client_id: "jitsudo-server"

Token validation flow: jitsudod fetches JWKS from {oidc_issuer}/.well-known/openid-configuration, verifies the JWT signature, and validates iss, aud, and exp claims.


TLS configuration for the gRPC listener.

FieldYAML keyEnv varDefaultDescription
Certificate filetls.cert_fileJITSUDOD_TLS_CERT_FILE""Path to PEM-encoded TLS certificate
Key filetls.key_fileJITSUDOD_TLS_KEY_FILE""Path to PEM-encoded TLS private key
CA filetls.ca_fileJITSUDOD_TLS_CA_FILE""Path to CA certificate; non-empty enables mTLS

TLS modes:

cert_filekey_fileca_fileMode
emptyemptyemptyInsecure (local development only)
setsetemptyServer-only TLS
setsetsetMutual TLS (mTLS)
tls:
cert_file: "/etc/jitsudo/tls.crt"
key_file: "/etc/jitsudo/tls.key"
ca_file: "" # set to enable mTLS

Each provider is optional. Omit or comment out sections you don’t use. A nil provider section means the provider is not registered at startup.

FieldYAML keyDefaultDescription
Modeproviders.aws.modests_assume_rolests_assume_role or identity_center
Regionproviders.aws.regionus-east-1Primary AWS region
Role ARN templateproviders.aws.role_arn_templateARN template with {scope} and {role} variables
Max durationproviders.aws.max_durationno capMaximum elevation window (STS hard max: 12h)
Identity Center instance ARNproviders.aws.identity_center_instance_arnRequired for identity_center mode
Identity Center store IDproviders.aws.identity_center_store_idRequired for identity_center mode
Endpoint URLproviders.aws.endpoint_url""Override AWS endpoint (LocalStack testing only)
providers:
aws:
mode: "sts_assume_role"
region: "us-east-1"
role_arn_template: "arn:aws:iam::{scope}:role/jitsudo-{role}"
max_duration: "4h"
FieldYAML keyDefaultDescription
Organization IDproviders.gcp.organization_idGCP organization ID (numeric string)
Credentials sourceproviders.gcp.credentials_sourceapplication_defaultworkload_identity_federation, application_default, or service_account_key
Max durationproviders.gcp.max_durationno capMaximum elevation window
Condition title prefixproviders.gcp.condition_title_prefixjitsudoPrefix for IAM condition titles
providers:
gcp:
organization_id: "123456789012"
credentials_source: "workload_identity_federation"
max_duration: "8h"
condition_title_prefix: "jitsudo"
FieldYAML keyDefaultDescription
Tenant IDproviders.azure.tenant_idEntra ID (Azure AD) tenant ID
Default subscription IDproviders.azure.default_subscription_idFallback subscription for requests without a scope
Client IDproviders.azure.client_idService principal or managed identity client ID
Credentials sourceproviders.azure.credentials_sourceworkload_identityworkload_identity or client_secret
Max durationproviders.azure.max_durationno capMaximum elevation window
providers:
azure:
tenant_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
default_subscription_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
client_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
credentials_source: "workload_identity"
max_duration: "4h"
FieldYAML keyDefaultDescription
Kubeconfig pathproviders.kubernetes.kubeconfig"" (in-cluster)Path to kubeconfig; empty uses in-cluster service account
Default namespaceproviders.kubernetes.default_namespace""Default namespace for RoleBindings
Max durationproviders.kubernetes.max_durationno capMaximum elevation window
Managed labelproviders.kubernetes.managed_labeljitsudo.dev/managedLabel applied to all managed bindings
providers:
kubernetes:
kubeconfig: ""
default_namespace: "default"
max_duration: "1h"
managed_label: "jitsudo.dev/managed"

FieldYAML keyEnv varDefaultDescription
Webhook URLnotifications.slack.webhook_urlJITSUDOD_SLACK_WEBHOOK_URLSlack incoming webhook URL
Channelnotifications.slack.channel""Override the webhook’s default channel
Break-glass mentionnotifications.slack.mention_on_break_glass""Prepended to break-glass alerts (e.g. <!channel>)
notifications:
slack:
webhook_url: "https://hooks.slack.com/services/..."
channel: "#sre-access-requests"
mention_on_break_glass: "<!channel>"
FieldYAML keyEnv varDefaultDescription
Hostnotifications.smtp.hostJITSUDOD_SMTP_HOSTSMTP server hostname
Portnotifications.smtp.port587SMTP port (587=STARTTLS, 465=TLS)
Usernamenotifications.smtp.usernameSMTP auth username
Passwordnotifications.smtp.passwordJITSUDOD_SMTP_PASSWORDSMTP auth password
Fromnotifications.smtp.fromSender email address
Tonotifications.smtp.toList of recipient email addresses
notifications:
smtp:
host: "smtp.example.com"
port: 587
username: "jitsudo@example.com"
password: "" # supply via JITSUDOD_SMTP_PASSWORD
from: "jitsudo@example.com"
to:
- "sre-team@example.com"
- "security@example.com"

FieldYAML keyEnv varDefaultDescription
Levellog.levelJITSUDOD_LOG_LEVELinfoMinimum log level: debug, info, warn, error
Formatlog.formatjsonOutput format: json (structured) or text (human-readable)
log:
level: "info"
format: "json"

A full annotated config file is available in the repository at deploy/config/config.example.yaml.

Additional example configs: