OpenBao control groups for dual approval

OpenBao control groups can hold a request for sensitive secrets or certificates until a second approver signs off. This page covers how the 2.7.0 policy stanza works, what you must build for approver notification, and what to confirm before relying on it.

On this page

When OpenBao control groups for dual approval are worth the friction

Control groups fit a team that needs a second person to approve the release of a production database credential or a signing certificate before the secret leaves OpenBao. A control group is a policy condition that holds a request until the approvals it names have been given, so the requester cannot finish the read alone. The control group policy stanza was added in OpenBao 2.7.0, which means earlier releases cannot use it. Before you design around it, confirm the stanza's exact fields, the approver counting rules and what the requester sees while a request is pending in the 2.7.0 documentation, because those details determine how your approval flow behaves.

The friction lands on people and on time. Every approved release now depends on an approver being reachable, so the team has to decide which paths need a second person at all. Production database roles and signing certificate issuance are typical candidates, while low-risk development reads usually are not. Plan for incidents too. An on-call engineer who needs a production credential at 3 a.m. will wait for an approver unless you have written a break-glass path with its own controls and audit trail. Those decisions belong in the design before any policy is written.

OpenBao does not send approver notifications. When a request enters a control group, nobody is told automatically, so the team must build that part. A workable design routes a pending-approval event to the people on the approver roster through chat, email or a ticketing queue, and it records who was notified and when. Decide early whether the notification carries the secret path, the requester identity and the stated reason for access, since that content may itself be sensitive. Test the path end to end with a non-production policy, because a control group that nobody sees will stall every release until someone notices.

Use these questions to decide whether control groups are worth the friction for your team. How many sensitive releases happen each week, and how many of them are urgent? Who approves outside business hours, and do approvers have enough context to judge a request without opening the secret itself? Who owns the approver roster and the notification integration after go-live? When you request a quote, ask for the policy design, the notification build, testing and a runbook as separate line items, and ask which parts recur, such as roster changes and upgrades to the notification path. A scoped quote follows from those answers.

Which control group settings fit which sensitive secret or certificate

This table compares the four choices a policy author makes when adding a control group: which paths or capabilities are gated, how many approvers must sign off, who may approve, and how long a request stays open. Read each row for the situations where the option fits and the delay or operating load it adds. Confirm the exact stanza field names against the 2.7.0 documentation before writing policy, because they are not listed here.

SettingWhen it fitsCost in delay or operational load
Gated paths or capabilitiesNarrow scope to paths that release high-value material, such as root-level key material or certificate issuance roles with broad reach.Each gated path adds a queue for requesters. Gating broadly trains teams to wait on routine reads and erodes the control.
Number of approversOne approver fits when a second person's review is the control. Require more only for the most sensitive paths, where collusion is a real concern for your assessor.Each added approver raises the chance a request stalls during leave or on-call gaps. Confirm the minimum headcount your on-call model can support.
Eligible approversA small named group fits tightly scoped secrets. A broader group fits shared services where more than one team must be able to respond.A small pool becomes a single point of unavailability. Group membership must be reviewed, because stale approvers keep the control looking active when it is not.
Request lifetimeA short window fits urgent, single-use releases. A longer window fits planned rotations where the approver may need time to verify the change.A short window forces requesters to re-submit. A long window leaves stale requests that approvers may accept without current context.
Requester and approver separationRequired wherever the same person could both request and approve, which is the common case for small platform teams.Enforcing separation needs clean identity mapping across auth methods. Test it with each method your operators use before relying on it.
Approver notificationNeeded for every control group, because OpenBao does not send approver notifications itself. Pending requests must reach approvers through a channel you build.Your team builds, secures and monitors the bridge from pending requests to on-call approvers. Budget that work as recurring operations, not a one-time task.
Emergency access pathFits outages where the normal approver pool cannot respond in time. Decide up front whether any bypass exists and who can invoke it.Any bypass must be logged, reviewed and tested. Ask your implementation partner to confirm how the 2.7.0 release handles this case before you design around it.

How a held request reaches an approver and who can release it

A requester's call to a path covered by a control group policy is held until an approver acts on it. As we read the OpenBao documentation, the lifecycle has four steps: the call is held, an approver is identified, approval or denial is recorded, and the outcome returns to the requester. Each step below is marked where the behavior must be confirmed against the 2.7.0 documentation before your design depends on it. Treat those marks as a test plan for a staging cluster, not as settled behavior.

Step 1 and 2: hold and identify. Confirm what the requester receives when the call is held, such as a status code, a handle or a token that must be presented again later. Confirm how an approver learns that a request is waiting. OpenBao does not send approver notifications, so the approver is found by polling or by a notification path you build. Confirm whether the approver set is defined in the policy stanza itself and whether a group or entity can be referenced there. Plan the notification path before go-live, because an approval that nobody sees leaves the workflow stalled.

Approver identity and separation. The approver must authenticate to OpenBao as a distinct identity from the requester. Confirm which identity types the 2.7.0 control group logic accepts, such as entities, aliases or tokens, and whether two tokens issued to the same person count as two approvers. Check separation in both directions: the requester's policy must not allow the approval action, and the approver's policy must not allow the original read of the secret. Verify this with two separate test accounts before any production policy is written.

Release, denial and expiry. Confirm whether an approved request is replayed automatically or whether the requester must repeat the original call, and how long an approval stays valid. Confirm the behavior on denial and on expiry, since a requester who is told nothing will retry in ways that create noise. Decide who may approve outside business hours and whether any break-glass path sits outside the control group. Finally, check that each approval and denial, along with the approver's identity, appears in the audit log, because that log is the evidence that a second person approved the release.

Setting up a control group policy on OpenBao 2.7.0 or later

This sequence takes a cluster from version confirmation to a documented approval runbook. Each step ends with a check, so the team can show that a sensitive read stays pending until a second approver acts and then releases the secret once. The result is a control group policy on target paths that operations staff can run and explain.

  1. Confirm the cluster runs 2.7.0 or later

    The platform team reads the version reported by each node and confirms that every node runs v2.7.0 or a later patch. The latest patch supplied for this line is v2.7.1, released October 1, 2026, so the team should plan its test against that release or newer. Control groups are introduced in 2.7.0, so policy work should wait until no node is on an earlier minor line. Done when every node reports 2.7.0 or later and the version record for each node is filed with the change ticket.

  2. Define approver identities and their auth method

    The security owner names the people who may approve releases and the auth method each one uses to sign in. Confirm which method your directory supports, such as OIDC or LDAP from the supported auth methods list. OpenBao recommends Userpass for developer machines and AppRole for servers, so approvers should not share a login. Create an entity for each approver, place them in one approver group, and keep requesters out of that group. Done when each approver completes a test login and their identity and group membership appear in the cluster.

  3. Write the control group policy on target paths

    The security engineer writes the control group stanza in the policy attached to the paths that hold sensitive secrets or certificate issuance. Use the syntax in the documentation for the exact release in use, and confirm it against your own cluster before reuse. Keep the requester policy separate from the approver policy so one person cannot approve a request they made. Confirm the approver group and the number of approvals the stanza requires. Done when the policy is loaded in a non-production cluster and reading it back shows the stanza on the intended paths.

  4. Test with a non-production secret

    The platform team writes a dummy secret at a path covered by the new policy, then reads it with a requester token. The expected result is a pending response that holds the request open for approval and returns no secret value. Each approver then approves in turn, and the requester's next read should release the secret once. Confirm the exact response shape in your own test, since the release documentation governs the behavior. Done when a read stays pending, one approval releases the secret one time, and a repeat read starts a new request.

  5. Build the approver notification

    OpenBao does not send approver notifications, so the team must build them. Choose a small service or script that detects pending requests using the mechanism your release exposes, and confirm that mechanism in the documentation before building on it. Route the message to the channel your approvers already watch, such as chat, email or a ticketing queue. Keep the message to the request path and requester identity, without any secret value. Done when a test request sends a message that reaches every member of the approver group.

  6. Document the approval runbook

    The team writes a runbook that states who may request access, who may approve, how each approval is recorded, and what happens when an approver is unavailable. Include the steps for removing an approver's access and for handling a request that nobody approves. Link each test step to the audit log entries for the request, approval and release so reviewers can trace the sequence. Done when the security owner signs off on the runbook and the on-call team has walked through one test release from request to release.

Building the approver notification OpenBao does not send

OpenBao does not notify approvers when a control group request is waiting, so your team has to build a channel that tells the right people a request needs their action. Without one, a request can sit unseen until the requester chases someone by hand, and a dual approval control only protects the secret if approvers respond in a reasonable time. Decide before the build starts who owns this channel, which approver groups it must reach, which chat or ticket system they already watch, and what happens when a request goes unanswered. Treat the notification as a convenience layer on top of the control group, never as the approval itself. The approval still has to be recorded by an authorized identity inside OpenBao.

Three general designs are worth comparing. The simplest is polling: a scheduled job queries the pending control group requests and posts any new ones to the approver channel. A second design is a watcher that reads OpenBao's audit output, so it reacts to the events the cluster already records and can be checked against the audit trail. A third design watches request state directly through the control group interface and compares it with what it has already announced. Polling is easy to reason about but adds latency equal to its interval. Audit-driven watchers give a clearer record of what was sent, but they depend on the audit devices running and on the event fields you can parse. Each design needs a deduplication step so approvers are not flooded with repeats for the same request.

The main risk is putting approval details into notifications. Chat channels and ticket systems are usually retained for long periods, searchable by many people, and copied into other tools, so a message that names the secret path, the requester, and the target system can leak operational detail to people who should not see it. Keep the message to what an approver needs to decide: a request identifier, the approver group, the time it was raised, and a link that opens the request only after the approver authenticates to OpenBao. Do not place secret values, tokens or wrapping details in any message. Plan for lookalike messages as well, because an attacker who can post in the channel can imitate a genuine request, so approvers should verify each request inside OpenBao before acting on it.

Confirm the exact integration against the audit and control group interfaces of the OpenBao version you run, since the control group stanza was added in 2.7.0 and later patch releases may change the fields and endpoints involved. Ask the implementation team to demonstrate which request states and audit events are available, what the audit output contains for a waiting request, and whether a request can be listed by approver group. Give the watcher its own identity with the narrowest policy that allows it to read pending requests, and monitor the watcher itself, because a silent failure means approvers are never told. Test the full path with a non-production request, including a missed notification, a duplicate, and a request that expires without approval. Assign an owner for the watcher's code, its credentials and its upgrades.

Security risks of dual approval: self-approval, shared accounts and audit gaps

A second approver adds control only if the approver is a different, identifiable person who reads the request and cannot quietly change the rules. The cards below cover the identity, approval behavior, notification and governance gaps that most often undo a control group design.

Approver holds the requester's token

If the approver's identity is the same entity as the requester, or the approver can act with the requester's token, the second approval is not independent. Check that each approver authenticates with their own identity and that the requester's entity is excluded from approving the same request. Test this with a deliberate self-approval attempt before go-live, and confirm the exact behavior in the control group documentation for your OpenBao version.

Shared approver accounts

A single login used by several people means an approval cannot be tied to one person, and a departing employee's access cannot be removed cleanly. Issue one identity per approver through your chosen auth method, such as OIDC, LDAP or Kerberos, and map each to its own entity. Review the approver group membership regularly so that every approving identity has a named owner.

Approvals given without reading the request

When approvers receive a request with no context, they tend to approve everything to clear the queue, which turns the second step into a formality. Require that the request shows the secret path or certificate role, the requester, the stated reason and the requested lifetime. Sample approved requests on a schedule and ask approvers to explain a few of their decisions.

Notifications that leak secret material

OpenBao does not send approver notifications, so the team building that path decides what it contains. A chat message or email that includes the secret value, a wrapping token or a full certificate private key moves the exposure to a less protected system. Send only request metadata such as the request identifier, requester, path and time, and direct approvers to the OpenBao interface to review the request.

Who can edit the control group policy

Anyone who can write or change the control group policy can remove the second approver, lower the required approvals or widen the paths it covers, often without anyone noticing. Limit policy write capability to a small administrator group that is separate from the people who request and approve secrets. Track policy changes in your change process and check them against the audit log.

Approval events without audit review

Approval and request events appear in the audit log only if audit devices are configured and their output is kept. Without a review step, approvals by the same entity, approvals outside business hours or unusual request volumes go unnoticed. Confirm which control group events your audit devices record in your version, forward them to your SIEM and assign an owner and review cadence for the approval records.

How to test the approval path before production

Before any production secret or certificate sits behind a control group, run a test plan that shows the gate works as written. Treat the plan as five pass or fail cases, each tied to a requirement in your policy design: a requester can trigger the hold, an unauthorized identity cannot approve, the designated approvers can approve or deny, a denied request does not release the secret, and every step appears in the audit trail. Run the plan on a non-production OpenBao cluster that uses the same version, the same control group stanza and the same approver identity source as production. Record the OpenBao version, the policy version and the identity used for each run, so a failed case can be traced to the exact configuration that produced it.

The first two cases test the hold itself. Use a requester identity that has read access to the target path and confirm that the read returns the waiting state instead of the secret value. Check that the pending request is visible to the approvers, and that the requester cannot obtain the value through a second read, a different token or a repeated request. The unauthorized case needs more care. Attempt approval with an identity outside the approver set, including a teammate of the requester, an operator with broad administrative rights and any service identity near the workflow. Each attempt should fail and the failure should be recorded. If an identity you did not expect can approve, stop and review the policy before going further.

The approver cases confirm that the people you named can act on the hold. Each designated approver should approve one request and deny another, in separate runs, so you can see both outcomes. Confirm that approval releases the secret only after the number of approvals the policy requires has been met, and that a single approval does not release it when two are needed. Compare the approver list in the policy with the roles your change records say should hold that authority. A mismatch found in a test cluster is far cheaper to fix than one found after release. Also confirm that a requester cannot approve their own request, since self-approval is a common gap in dual approval designs.

A denied request must leave the secret locked. After a denial, have the requester retry retrieval with the same token and again after a fresh login, and confirm that neither attempt returns the value. Repeat the check after the request expires if your policy sets an expiry, because an expired hold should also fail closed. Review response bodies as well as status codes, and make sure test output does not write the secret to a log file or terminal history. Use a clearly marked dummy secret for these runs so that a leak in the test harness cannot expose production material.

The last case confirms that events are recorded. Enable the audit devices you plan to use in production and check that the request, each approval, each denial and each retrieval attempt appear with the identity and timestamp. Confirm that sensitive values are hashed or absent in those entries, consistent with your audit configuration. Because OpenBao does not send approver notifications, test the notification process you build separately and record it as its own case. Keep the scripts, inputs, outputs, versions and dates from every run together as evidence. Repeat the full plan after each OpenBao upgrade and after any policy change. Retained results support a compliance review, but they do not pass one; an independent auditor decides what the evidence shows.

Limits to confirm in your OpenBao version before you rely on it

Control groups add a second approval step to requests, but the behavior depends on the secrets engine, the OpenBao version you run and the storage backend underneath it. The items below are the ones to verify in the OpenBao documentation for your exact version before you place approvals in front of production secrets or certificates.

Engine and path coverage

Confirm which secrets engines and request paths support control groups in your version, since support can vary by engine and by path. List each secret or certificate path you intend to gate, then test one request per path in a non-production cluster and record whether the approval step fires. Treat any path you have not tested as unprotected until it is verified.

Timeout and retry behavior

Confirm how long a pending request waits for approval, what the requester receives when the window closes, and whether a retry starts a new approval or reuses the earlier one. Write these answers into your runbook, because on-call engineers and approvers will depend on them during an incident. Test expiry with a short window before you rely on it.

Dynamic credentials and leases

Confirm whether approval gates only the issuance of a dynamic credential or also its renewal, and when the lease clock starts relative to approval. Check how revocation and bulk revocation behave for credentials issued after an approval, since leasing with automatic revocation is central to how dynamic secrets limit exposure. Test a full issue, renew and revoke cycle.

Approvals across leader failover

Confirm whether pending and granted approvals persist when the active node changes in your HA backend. Integrated storage (Raft) and PostgreSQL are the officially supported HA backends, and the documentation describes PostgreSQL as easier to operate safely than Raft, so the answer may depend on your choice. Force a leader step-down during a pending approval, and confirm whether approvers can act through standby nodes in your version.

Migrated Vault configuration

If the cluster came from Vault, confirm that control group policies and related settings carried over unchanged after the in-place replacement. The migration guide was tested only against Vault 1.14.1 community edition, so Vault Enterprise features need separate verification. Also remove disable_mlock, which OpenBao no longer uses, and check whether a rekey applies to clusters bootstrapped before Vault 1.3.

Approver notification path

Confirm which API calls list pending approval requests and identify the approvers, so your notification service can query them. OpenBao does not send approver notifications, so the channel, the escalation rule and the audit trail of who was notified all belong to your build. Confirm the response fields in the API reference for your version before you write the integration.

What does dual approval cost to set up, and how long does it take?

What drives the cost of setting up OpenBao dual approval?

The cost rises with the number of protected secrets and certificate paths, the number of approver groups, and how much custom notification work is needed. DeployOpen does not publish a price list. A quote follows from a written, fixed scope that breaks the work into policy design, identity setup, notification build, testing and runbook. Policy design and identity setup are usually one-time. Notification build, testing and the runbook also happen once, but they need revisiting whenever the approval flow changes. OpenBao is licensed under MPL-2.0, so ask the quote to show which costs are services and which are infrastructure or licenses you already hold. Ask for each component to be priced separately so you can see what changes if the scope shrinks.

How long does a working dual approval gate take to build?

No duration is fixed for this work, and the timeline depends on scope, your identity readiness and the notification channel you choose. The usual sequence is policy design, identity mapping of approvers, building the notification path, testing in a non-production cluster, writing the runbook and then a controlled go-live. Identity mapping often sets the pace because approver groups must exist and be correct before the gate can be tested. The control group policy stanza was added in OpenBao 2.7.0, so if you run an older line, an upgrade may come first and should be counted in the plan. Ask the proposal for milestones, dependencies and the acceptance test that closes each one.

What does our team need to provide for dual approval work?

Your team supplies the decisions and access that only your organization can give. Expect to provide the list of secrets and certificate paths that need a second approver, the approver groups and their members, and the identity provider groups that map to them. You also need a non-production OpenBao environment for testing, a named contact for the notification channel and someone to own the runbook after handover. Security or compliance staff should confirm the approval rules and evidence needs. Ask the written scope to name each input, the person responsible for it and the date it is needed, so delays show up early rather than at go-live.

Can our own engineers set up control groups without outside help?

Your engineers can set up the policy stanza themselves if they already operate OpenBao and understand its policies and auth methods. The part OpenBao does not provide is the approver notification, so your team must design and build that path, test it and keep it working. That means choosing a channel, handling failures and making sure requests are not lost or approved by the wrong person. Check whether your team has skills in policy authoring, identity integration and the notification tooling, and whether it has time to test failure cases. A written scope from a partner can serve as a checklist even if your team does the build.

What recurring work follows go-live for dual approval?

Dual approval is not finished at go-live because it depends on people and software that keep changing. Recurring work includes applying OpenBao upgrades and retesting the gate afterward, since OpenBao v2.7.1 followed v2.7.0 on October 1, 2026, and later releases may change behavior. Approver changes are the most frequent task, covering joiners, leavers and role moves in the identity provider. The notification path needs upkeep when chat tools, endpoints or certificates change. Schedule periodic tests of the gate and reviews of the runbook. Ongoing support, upgrades and testing can be covered by a retainer, which you should price from a separate written scope.

Which OpenBao version do we need for the control group stanza?

The control group policy stanza was added in OpenBao 2.7.0, which was released on September 23, 2026. If your cluster runs an earlier line, you need to plan an upgrade before the gate can be built on the stanza. Confirm the exact behavior on your target version against the OpenBao documentation and release notes before you finalize the design. Upgrading a production cluster is a change with its own test and rollback plan, so the upgrade should be part of the written scope or a separate scope with its own timeline. Ask for the version assumption to be stated in the proposal.

What should a written scope for dual approval include?

A useful written scope names the protected paths, the approver groups and the number of approvals required for each, the notification channel and its failure handling, and the identity integration. It should list test cases, including denied and expired requests, and the acceptance criteria that show the gate works. Include the runbook, the handover owner, the upgrade assumptions and any exclusions. Milestones, dates and change control belong in the scope so both sides know what triggers a change request. Ask for the quote to be tied directly to this scope so that adding paths or channels produces a visible cost change.

How DeployOpen works on this

DeployOpen scopes OpenBao control groups for dual approval as a written, fixed-scope engagement inside your own infrastructure. The control group policy stanza added in OpenBao 2.7.0 is only part of the work, because OpenBao does not send approver notifications, so that piece is built and tested separately.

How we scope

  • The written scope names which secret paths, certificate roles or policies need a second approver.
  • Scope records who may approve each protected path, and who is excluded from approving their own request.
  • Fixed-scope terms mean scope, deliverables and timelines are agreed in writing before any build starts.

How we build

  • Control group policy stanzas are written, version-controlled and applied to a test cluster first.
  • The approver notification service is built separately, because OpenBao does not send approval requests to approvers.
  • Test cases cover approved, denied and pending requests, plus attempts by a requester to approve their own.

How we hand over

  • Handover includes the policy files, notification service code, runbooks and a record of test results.
  • Your team receives documentation for approver onboarding, removal and emergency access decisions.
  • Runbooks explain how to retest the approval flow after each OpenBao upgrade.

How we support

  • Ongoing support, upgrades and continuous testing are available as retainers.
  • Retainers can cover re-testing approval flows when OpenBao releases a new patch version.
  • DeployOpen prepares approval records as evidence for your compliance assessors, who issue any opinion.

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.