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.