Frequently asked questions¶
Short answers to common questions about Secrets Bridge. Each answer links to the page with the full detail.
What is Secrets Bridge?¶
Secrets Bridge is a secrets control plane. It governs who may use the secrets your team already keeps in AWS Secrets Manager or HashiCorp Vault, and adds access requests, approval workflows, RBAC, audit and agent execution around them. The control plane makes decisions and keeps metadata, an agent inside your boundary executes, and the provider holds the values. See the Overview and the Architecture.
Does Secrets Bridge store secret values?¶
No. The control plane keeps requests, approvals and audit metadata, and the values stay in your provider. A value in flight exists only as a KMS-encrypted wrap that is consumed once and has a short TTL. Values never appear in Redis, audit metadata, control-plane logs or browser storage, and request responses carry key names only. The one response that returns a value is the reveal itself, once, to the person who asked. See the Threat model & hard rules and Product status.
Does it replace HashiCorp Vault or AWS Secrets Manager?¶
No. Your provider stays the source of truth for secret values, and Secrets Bridge governs access, approvals, audit and agent execution around it. The agent uses only the credentials configured inside its own network boundary, and the control plane never holds provider master credentials. See What's intentionally out of scope.
Which secret providers does it support?¶
HashiCorp Vault (KV v2, with token or Kubernetes auth) and AWS Secrets Manager (the standard AWS SDK credential chain, such as IRSA or an instance role) work today through the agent. Azure Key Vault and GCP Secret Manager are on the roadmap: their agent resolvers are placeholders, as is the Kubernetes Secret resolver. See Providers supported and Product status.
Does the agent need an inbound port?¶
No. The agent only opens outbound connections, to the control plane and to
its local provider, and has no Postgres, Redis or Kubernetes API access to
Secrets. Its only listener serves /healthz, /readyz and /metrics; the
agent Helm chart binds it on the pod IP for kubelet probes, creates no
Service for it and denies all ingress with its default NetworkPolicy. See the
Agent page and
Network posture.
How does an agent get its credentials?¶
An admin creates a one-time enrollment token bound to one provider
connection. The token is short-lived, stored only as a hash and returned
once. An operator runs secrets-bridge-agent enroll inside their boundary:
it generates the agent's X25519 key locally, exchanges the token for
agent_id and agent_secret, and the operator stores all three in AWS
Secrets Manager, Vault or a Kubernetes Secret. The agent reads them from a
read-only Secret and keeps no state of its own. The control plane stores
only the public key and a hash of the secret. An admin can revoke the agent
at any time, and its heartbeats and job polls stop being accepted
immediately. See Agent onboarding.
How do approvals work?¶
When you submit a request, the policy rules are matched in priority order and
the first match picks a workflow. The workflow sets the approval ceremony:
the minimum number of approvers, whether a justification is required, and the
TTLs. Approvers with secret.approve approve or reject from the Requests
page, which needs a fresh second factor, and a requester can never approve
their own request (the api answers 403 separation_of_duties_violated and
audits the attempt). See Policy templates,
the Glossary and
Bootstrap & first sign-in.
Can a secret be revealed directly in production?¶
No. Direct reveal needs the caller to hold secret.reveal.direct, a matched
policy rule with direct_reveal_allowed=true, and an environment whose kind
is non_prod. The PolicyEngine zeroes direct_reveal_allowed for prod
environments whatever the policy says, and the refusal is audited. See
Project environments and
Direct reveal permission.
How is a secret value delivered to the person who asked for it?¶
After approval, the agent claims the read job, fetches the value from the
provider and posts it to the control plane as an encrypted wrap, one per key.
When you click Reveal, the api consumes the wrap atomically and decrypts it
with the KMS backend, so a second fetch of the same wrap gets 410 Gone. The console shows the
value once and clears it when the reveal closes; a
reveal session also ends after a TTL of 10
to 300 seconds set by the matched policy rule. See the read flow in the
Architecture.
What is a cross-team request?¶
It is a value handoff between two teams that don't share access to each
other's secrets. Team A submits the request, a Team B member with
secret.value.provide fills in the values, a Team A approver (and a security
approver when the workflow requires one) verifies, and the agent writes the
value into Team A's provider. No user can play more than one of these roles on
the same request. See Cross-team requests.
What is audited?¶
Audit events record actions, IDs, statuses, reasons and timestamps, and a
correlation ID links every event in one request's lifecycle. They never carry
plaintext values, tokens or wrap bodies. The audit_events table is
append-only: Postgres triggers reject UPDATE and DELETE. See the
Glossary and
Append-only audit.
Does it support SSO, OIDC and MFA?¶
Yes. You can sign in through an OIDC provider set with the SB_OIDC_*
variables (PKCE, group-claim to role mapping, back-channel logout), through
Google configured from the console (merged, not yet through QA), or with a
local password kept as break-glass. MFA uses TOTP authenticator apps or
WebAuthn security keys: approve, reject and reveal need a fresh second
factor, and login-time MFA is on by default outside SB_ENV=dev. See
Authentication and
OIDC with Authentik.
How do I try it locally?¶
Clone the api repo, start Postgres and Redis with
docker compose up -d postgres redis, and run the api with SB_ENV=dev and
the local KMS backend; the UI runs from the ui repo with npm run dev. On first boot
against an empty database the api seeds three dev users and logs their
passwords once, and the guide then enrolls an agent against a HashiCorp Vault
dev server. The setup uses dev-only switches, so keep it on your machine and
never load real secrets into it. See
Running locally with docker compose.
How do I deploy it in production?¶
Install the Helm charts published on GHCR: secrets-bridge for the api, ui,
worker and controller, and secrets-bridge-agent for one agent per workload
cluster or account. You provide Postgres and Redis on a private network, a
real KMS backend (vault-transit or aws-kms) and an ingress with TLS. The
chart refuses kms.backend=local with env=production, and
Operations has the hardening checklist to work
through before you expose the install.
How mature is it?¶
Secrets Bridge is open source and pre-1.0, and the first release has not been tagged yet. Product status keeps what is implemented, what is QA-certified (such as project access, direct reveal with TTL, prod reveal refusal and the cross-team flow), what is in progress and what is on the roadmap apart. Features listed as in progress, such as the Gateway and Google sign-in, have not passed QA.