Configure operator authorization

Keep controller, backup, restore, and upgrade capabilities on separate OpenBao policies and identities.

Updated 9 August 2026 · 3 min read

On this page

Give each controller or lifecycle Job only the OpenBao capabilities needed for its operation. Authentication proves the actor’s identity; these policies decide what that actor can do.

Separate the policy surfaces

PolicyActorRequired capabilitiesReason for separation
ControllerController DeploymentHealth, step-down, Raft configuration, peer removal, and AutopilotRoutine reconciliation must not receive restore authority
BackupBackup JobRead sys/storage/raft/snapshotSnapshot streaming is independent of storage credentials
RestoreRestore JobUpdate sys/storage/raft/snapshot-forceRestore can replace the complete cluster state
Rolling upgradeUpgrade JobHealth, step-down, snapshot read, and Autopilot stateUpgrade authority exists only on the executor
BlueGreen upgradeUpgrade JobRolling capabilities plus join and peer managementParallel cutover needs wider, temporary orchestration authority

Define the backup and restore policies

configure

Backup policy

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

Restore policy

path "sys/storage/raft/snapshot-force" {
  capabilities = ["update"]
}

Backup and restore can use explicit token Secrets as a fallback. That does not make the controller or main OpenBao ServiceAccount the correct identity for either operation.

Define the upgrade policy

Rolling upgrades require snapshot read as well as health, step-down, and Autopilot state:

configure

RollingUpdate policy

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

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

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

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

BlueGreen uses the same baseline and adds these peer-management paths:

configure

Additional BlueGreen capabilities

path "sys/storage/raft/join" {
  capabilities = ["update"]
}

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

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

path "sys/storage/raft/promote" {
  capabilities = ["update"]
}

path "sys/storage/raft/demote" {
  capabilities = ["update"]
}

Built-in upgrade orchestration uses JWT. When an initialized cluster changes from RollingUpdate to BlueGreen, self-init does not update the existing role. Add the peer-management capabilities before requesting the new strategy.

Maintain policies after bootstrap

Self-init creates the initial policies only during initialization. For an existing cluster:

  1. Review operator release notes for new OpenBao capabilities.
  2. Compare the implemented policy with the cluster’s current policy.
  3. Apply the narrow policy change through an authenticated human administration path.
  4. Verify the affected condition or operation before proceeding with other changes.

Missing controller capabilities can produce Unknown conditions or permission errors. The operator does not widen the policy automatically.

Troubleshoot authorization

SymptomLikely boundaryCheck first
JWT login succeeds but the request is deniedPolicy lacks the required path or capabilityIdentify the actor and compare its exact policy
Backup works but restore failsRestore role or snapshot-force policy is missingRestore ServiceAccount, role, and policy binding
Rolling works but BlueGreen stallsPeer-management paths were not addedAccepted strategy and upgrade policy
Controller has restore or broad upgrade powersJob policies were merged into the controllerRemove the shortcut and restore separate roles
Upgrade fails before changing a PodSnapshot-read capability is missingsys/storage/raft/snapshot on the upgrade policy

Return to operator authentication when the failure occurs before a policy decision.

Search the handbook

Try “install”, “threat model”, or “compatibility”.