Overview
SBproxy keeps sensitive values out of plain-text config. Secrets resolve from a backend at config load time and are available in templates, CEL, and Lua as {{ secrets.name }}. The whole plane ships in the open-source binary.
Capabilities
- Top-level
proxy.secretsblock: pick a backend (env,local,hashicorp), map logical names to backend paths, tune rotation - Provider reference URIs on secret-bearing fields:
vault://,awssm://,gcpsm://,k8ssecret://,secretfile://,secret:// ${ENV}interpolation anywhere in the YAML- Boot-time resolution that fails loudly: a reference that cannot resolve stops the load instead of starting with a missing credential
- Rotation with a grace period, periodic re-resolution, and a fallback strategy (
cache,reject, orenv) when the backend is unreachable
Example
proxy:
secrets:
backend: hashicorp
hashicorp:
addr: https://vault.example.com:8200
mount: secret
map:
openai_key: secret/data/prod/openai_key
rotation:
grace_period_secs: 300
re_resolve_interval_secs: 60
fallback: cache
origins:
"ai.example.com":
action:
type: ai_proxy
providers:
- name: openai
api_key: "{{ secrets.openai_key }}"
Secret-bearing fields also accept provider URIs directly, for example api_key: awssm://primary/openai-keys?version=3&key=api_key. AWS Secrets Manager, GCP Secret Manager, HashiCorp Vault, and Kubernetes Secret backends all ship in the open-source binary.
See Variables and Secrets for the full picture of how secrets, variables, and template scopes work together.