Skip to main content
Version: next

Diagram

Default operator auth path

Kubernetes issues a projected token for the controller. OpenBao validates that token against the configured JWT auth method and returns a scoped operator token for maintenance work.

Decision matrix

JWT default path

JWT default path.
PropertyWhat you getWhy it matters
Automatic rotationKubernetes rotates the projected token on its own schedule.Controller auth ages out naturally instead of depending on manual token rotation discipline.
Audience bindingThe token is scoped to OPENBAO_JWT_AUDIENCE, which defaults to openbao-internal.A token issued for OpenBao auth should not be replayable against unrelated services.
Scoped maintenance policyThe JWT role returns a token with the operator maintenance policy, not blanket admin privileges.The controller gets the capabilities it needs for health checks, step-down, and autopilot without widening normal access.
Controller and human authentication are separate

spec.selfInit.oidc.enabled: true bootstraps the controller auth path only. It does not create a human login method by itself. If you use self-init, create human access in the same bootstrap contract through selfInit.requests so the cluster has an operator path and a human path from the start.

Bootstrap does not mean ongoing policy reconciliation

spec.selfInit.oidc.enabled: true bootstraps the controller JWT auth method, policy, and role. After bootstrap, the operator uses that auth surface but does not continue mutating OpenBao policies on its own. When a later operator release needs an additional controller capability, the human operator must update the openbao-operator policy explicitly.

Decision matrix

Bootstrap authentication surfaces

Bootstrap authentication surfaces.
SurfaceWhere it is definedWhy it exists
Human login pathspec.selfInit.requests or another deliberate bootstrap path in the same cluster bring-up planEnsures someone can actually sign in after the root token is revoked.

Self-init and manual bootstrap

Decision matrix

Choose the bootstrap path

Choose the bootstrap path.
PathUse it whenOperator behaviorWatch for
Manual JWT configurationYou are carrying a compatibility workflow, a custom install shape, or a controlled bootstrap sequence.You create the JWT auth method, policy, and role binding yourself.Rendered ServiceAccount name, namespace, and audience drift are the usual breakpoints.

Reference table

Who owns policy changes after bootstrap

Who owns policy changes after bootstrap.
Install shapeWho creates the initial policyWho updates it later
Manual JWT configurationThe cluster administrator.The cluster administrator.

Configure

Controller policy scope

hcl

path "sys/health" {
capabilities = ["read"]
}

path "sys/step-down" {
capabilities = ["sudo", "update"]
}

path "sys/storage/raft/configuration" {
capabilities = ["read"]
}

path "sys/storage/raft/remove-peer" {
capabilities = ["update"]
}

path "sys/storage/raft/autopilot/configuration" {
capabilities = ["read", "update"]
}

path "sys/storage/raft/autopilot/state" {
capabilities = ["read"]
}

Keep the controller policy focused on maintenance work. Backup, restore, and upgrade jobs authenticate through their own roles instead of inheriting the controller scope.

Configure

Manual JWT role example for a custom controller identity

bash

bao write auth/jwt-operator/role/openbao-operator \
role_type="jwt" \
bound_audiences="openbao-internal" \
user_claim="sub" \
bound_subject="system:serviceaccount:platform-security:demo-openbao-operator-controller" \
token_policies="openbao-operator" \
token_ttl="1h"

Replace the namespace, ServiceAccount name, and audience with the values from your rendered install, not the example defaults.

What must stay aligned

Reference table

Custom-install checks

Custom-install checks.
SurfaceMust matchWhat breaks when it drifts
Projected token mountThe controller Deployment still mounts the openbao-token projected volumeThe controller loses its default path to authenticate to OpenBao at all.
JWT audienceOPENBAO_JWT_AUDIENCE, the projected token audience, and the OpenBao role bound_audiencesA valid ServiceAccount token is rejected because it was issued for a different audience contract.
Discovery accessThe controller can reach /.well-known/openid-configuration and the JWKS endpointOpenBao cannot validate the projected token even though the controller identity itself is correct.

Reference table

Typical auth failures

Typical auth failures.
SymptomMost likely causeCheck first
Self-init completes but controller auth never settlesOIDC discovery is unreachable or incompleteKubernetes API discovery reachability and cluster condition output
Backup or restore auth fails even though controller auth worksExecutor jobs use separate roles and ServiceAccountsOperator authorization and the job-specific auth path

Continue the support path

Official OpenBao background

Next release documentation

You are reading the unreleased main docs. Use the version menu for the newest published release, or check the release notes for what is already out.

Was this page helpful?

Use Needs work to open a structured GitHub issue for this page. The Yes button only acknowledges the signal locally.