Secrets Management

The open-source secrets plane: backends, provider reference URIs, and rotation

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.secrets block: 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, or env) 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.