Vault Production Considerations📜
Vault holds security-critical state and should be designed and operated using the upstream production guidance and the Big Bang Vault package’s production configuration.
At minimum, a production deployment should:
- Disable Big Bang’s development-only
autoInitautomation. It writes the root token and unseal material to a Kubernetes Secret. - Run Vault in high-availability mode with integrated Raft storage or another supported production storage backend.
- Use auto-unseal and protect recovery keys outside the cluster.
- Terminate TLS at Vault. Big Bang’s passthrough gateway can pass encrypted traffic directly to the Vault pods.
- Size persistent storage and resources for the environment, retain volumes during cluster or release recovery, and back up Raft state regularly.
- Enable and retain audit devices appropriate for the environment. The package enables audit storage by default, but operators must configure and monitor Vault audit devices.
Configure High Availability with Raft📜
The following Big Bang example shows the relevant value paths for a three-node Raft deployment using AWS KMS auto-unseal. Replace the domain, certificate, storage, resource, and KMS settings for the environment.
addons:
vault:
enabled: true
ingress:
gateway: passthrough
key: |
-----BEGIN PRIVATE KEY-----
<private-key>
-----END PRIVATE KEY-----
cert: |
-----BEGIN CERTIFICATE-----
<certificate-chain>
-----END CERTIFICATE-----
values:
autoInit:
enabled: false
upstream:
global:
tlsDisable: false
server:
dataStorage:
enabled: true
size: 50Gi
mountPath: /vault/data
accessMode: ReadWriteOnce
auditStorage:
enabled: true
resources:
requests:
cpu: 2000m
memory: 8Gi
limits:
cpu: 2000m
memory: 8Gi
ingress:
enabled: false
extraEnvironmentVars:
VAULT_LOG_FORMAT: json
ha:
enabled: true
replicas: 3
apiAddr: https://vault.dev.bigbang.mil
raft:
enabled: true
setNodeId: true
config: |
ui = true
listener "tcp" {
tls_disable = false
address = "[::]:8200"
cluster_address = "[::]:8201"
tls_cert_file = "/vault/tls/tls.crt"
tls_key_file = "/vault/tls/tls.key"
telemetry {
unauthenticated_metrics_access = true
}
}
storage "raft" {
path = "/vault/data"
retry_join {
leader_api_addr = "https://vault-vault-0.vault-vault-internal:8200"
leader_client_cert_file = "/vault/tls/tls.crt"
leader_client_key_file = "/vault/tls/tls.key"
leader_tls_servername = "vault.dev.bigbang.mil"
}
retry_join {
leader_api_addr = "https://vault-vault-1.vault-vault-internal:8200"
leader_client_cert_file = "/vault/tls/tls.crt"
leader_client_key_file = "/vault/tls/tls.key"
leader_tls_servername = "vault.dev.bigbang.mil"
}
retry_join {
leader_api_addr = "https://vault-vault-2.vault-vault-internal:8200"
leader_client_cert_file = "/vault/tls/tls.crt"
leader_client_key_file = "/vault/tls/tls.key"
leader_tls_servername = "vault.dev.bigbang.mil"
}
}
seal "awskms" {
region = "us-gov-west-1"
kms_key_id = "<kms-key-id>"
endpoint = "https://kms.us-gov-west-1.amazonaws.com"
}
telemetry {
prometheus_retention_time = "24h"
disable_hostname = true
}
service_registration "kubernetes" {}
The certificate must be valid for the name used by apiAddr and leader_tls_servername. The example intentionally does not set VAULT_SKIP_VERIFY; disabling TLS verification is not an appropriate production default. Configure VAULT_LICENSE only for a licensed Vault Enterprise deployment.
Initialize and Protect Recovery Material📜
After installation, initialize Vault manually with vault operator init, store the recovery keys and initial root token in an approved system outside Kubernetes, and validate Raft snapshots and restore procedures.