Secret Vault
The Secret Vault stores encrypted API credentials and injects them into configured outbound requests through the Proxy Gateway. Supported agent callers receive the provider response, not the stored credential. Steward does not restrict arbitrary egress outside configured routes.How It Works
Instead of giving agents plaintext API keys:Encryption
SecretVault uses the secret-vault domain of the same KeyStore primitive as the Wallet Vault. The implemented derivation and encryption path is:
STEWARD_MASTER_PASSWORD or STEWARD_KDF_SALT changes the derivation root, so operators must stop writers and use the root secret key rotation runbook to authenticate and re-encrypt the complete supported ciphertext inventory before cutting every consumer over. Rotation cost follows the encrypted record inventory, not the tenant count.
Two legacy compatibility paths are deliberately separate:
- Secrets written before KDF domain separation may require the old undomained root. Production enables that temporary path only with
STEWARD_SECRET_VAULT_LEGACY_ROOT_FALLBACK=true; migrate the full secret inventory and remove the flag as described in the rotation runbook. - Ciphertext written before context AAD may require a no-AAD decrypt retry.
STEWARD_ALLOW_LEGACY_KEYSTORE_DECRYPT_FALLBACK=trueenables that retry only outside production; production ignores the flag and fails closed. Re-encrypt legacy records with context rather than treating this as a tenant-key mechanism.
Secret Lifecycle
- Create
- Rotate
- Delete
Credential Injection
When the proxy forwards a request, it:- Decrypts the credential for the bounded outbound operation
- Injects it according to the route config (header, query param, or body)
- Forwards the request to the real API
- Drops the plaintext reference after the outbound operation (JavaScript strings cannot be reliably zeroed in place)
Security Properties
- Secrets never leave the vault in API responses — list/get endpoints return metadata only
- Plaintext lifetime is bounded to the use callback or pinned injection path — references are dropped afterward, but JavaScript strings cannot be reliably zeroed in place
- Auditing is enforced by governed callers, not by the cipher primitive — new consumers use the pre-decrypt audit chokepoint, and the remaining direct-decrypt caller inventory is CI-pinned
- Tenant isolation — secrets are scoped to tenants; agents can only trigger decryption of their tenant’s secrets
Related
- Proxy Gateway — How the proxy routes and injects credentials
- Secrets API Reference — Full CRUD API
- Routes API Reference — Route configuration API
- Managing Secrets Guide — Step-by-step guide
- Root Secret Key Rotation — Offline full-inventory root and legacy migration procedure