Vault Production Deployment
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| AWS | Amazon Web Services | 亚马逊云服务 |
| AZ | Availability Zone | 可用区 |
| CA | Certificate Authority | 证书颁发机构 |
| DNS | Domain Name System | 域名系统 |
| EBS | Elastic Block Store | AWS 块存储服务 |
| EC2 | Elastic Compute Cloud | AWS 云服务器服务 |
| HCL | HashiCorp Configuration Language | HashiCorp 配置语言 |
| HTTPS | Hypertext Transfer Protocol Secure | 使用 TLS 加密的 HTTP |
| IAM | Identity and Access Management | 身份与访问管理 |
| KMS | Key Management Service | 密钥管理服务 |
| NLB | Network Load Balancer | 网络负载均衡器 |
| PGP | Pretty Good Privacy | 一种加密与数字签名体系 |
| SSO | Single Sign-On | 单点登录 |
| TCP | Transmission Control Protocol | 传输控制协议 |
| TLS | Transport Layer Security | 传输层安全协议 |
1. 部署模型#
参考环境:一个 AWS Region、三个 AZ、三台独立 EC2、每台独立加密 EBS、Integrated Storage/Raft、TLS、AWS KMS auto-unseal。三节点多数派为两票;容量及节点数按负载和容错目标验证。
| 项目 | 准备要求 |
|---|---|
| 节点 | vault-1/2/3.internal,私有 DNS、固定可解析地址、时间同步 |
| 入口 | 内部 NLB TCP 8200,端到端 TLS;业务域名 vault.internal |
| 8200 | 仅应用、管理终端和集群加入需要的网络可访问 |
| 8201 | 只允许 Vault 节点互通,不能暴露给应用或公网 |
| TLS | 每节点证书覆盖自身 DNS 与公共服务域名,完整链,受信 CA |
| 数据 | /opt/vault/data,独立持久磁盘,用户 vault 拥有,禁用 swap |
| 审计 | 独立磁盘/容量预算,所有节点准备相同路径,日志外送 |
| AWS 身份 | 实例角色 + IMDSv2,不把静态 access key 写入 HCL |
本页假定上述网络、EC2、KMS、证书已由平台部署;不在事故时临时创建。节点安装同一审核过的 Vault 版本,并验证供应链签名/校验和。
2. KMS 权限#
使用专用对称 KMS key,实例角色仅允许该 key 的 kms:Encrypt、kms:Decrypt、kms:DescribeKey。IAM 和 key policy 都需要允许实际实例角色访问;使用私有 endpoint 时同步检查 endpoint policy。
开启 key 删除保护流程;保留解密旧数据所需的 key。Recovery keys 不能替代丢失的 KMS key,备份也不能解除该依赖。AWS KMS seal
3. 节点配置#
每台机器准备 vault 系统用户和目录,证书由企业证书流程交付:
sudo install -d -o vault -g vault -m 0700 /opt/vault/data /var/log/vault
sudo install -d -o root -g vault -m 0750 /etc/vault.d /etc/vault.d/tls/etc/vault.d/vault.hcl 示例为节点 1;节点 2/3 修改 node_id、api_addr、cluster_addr 和自身证书。retry_join 写其他两个节点,不分别初始化多个集群。
ui = true
disable_mlock = true
api_addr = "https://vault-1.internal:8200"
cluster_addr = "https://vault-1.internal:8201"
listener "tcp" {
address = "0.0.0.0:8200"
cluster_address = "0.0.0.0:8201"
tls_cert_file = "/etc/vault.d/tls/server.crt"
tls_key_file = "/etc/vault.d/tls/server.key"
}
storage "raft" {
path = "/opt/vault/data"
node_id = "vault-1"
retry_join {
leader_api_addr = "https://vault-2.internal:8200"
leader_ca_cert_file = "/etc/vault.d/tls/ca.crt"
}
retry_join {
leader_api_addr = "https://vault-3.internal:8200"
leader_ca_cert_file = "/etc/vault.d/tls/ca.crt"
}
}
seal "awskms" {
region = "ap-southeast-1"
kms_key_id = "REPLACE_WITH_KMS_KEY_ARN"
}
telemetry {
prometheus_retention_time = "60s"
disable_hostname = true
}Raft 使用内存映射存储,本文关闭 mlock 并要求禁用 swap、保护宿主机与磁盘;不要直接复制其他 storage backend 的内存设置。TLS 私钥设为 root:vault 0640,HCL 不放凭据。Raft 配置
示例 systemd unit,确认二进制实际安装在 /usr/local/bin/vault:
[Unit]
Description=HashiCorp Vault
Wants=network-online.target
After=network-online.target
[Service]
User=vault
Group=vault
ExecStart=/usr/local/bin/vault server -config=/etc/vault.d/vault.hcl
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
UMask=0077
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target保存为 /etc/systemd/system/vault.service,依次启动:
sudo systemctl daemon-reload
sudo systemctl enable --now vault
sudo journalctl -u vault --since '10 minutes ago'4. 初始化与自动加入#
从受控管理终端直连节点 1:
export VAULT_ADDR=https://vault-1.internal:8200
export VAULT_CACERT=/secure/platform/vault-ca.crt
vault status确认 Initialized=false 后,只对节点 1 初始化一次。建议事先取得五名保管人的 PGP 公钥及临时 root token 接收人的公钥:
umask 077
vault operator init -recovery-shares=5 -recovery-threshold=3 -recovery-pgp-keys=ops1.asc,ops2.asc,ops3.asc,ops4.asc,ops5.asc -root-token-pgp-key=bootstrap.asc -format=json > bootstrap-encrypted.json将加密 recovery share 分交保管人,离线验证恢复流程。临时 root token 由授权接收者解密,通过 vault login 的交互提示输入;不要放在命令参数或共享日志。
三个节点使用同一 KMS seal,另外两台通过 retry_join 加入。检查:
vault operator raft list-peers
vault operator raft autopilot state验收三个不同节点、一个 leader、健康多数派;逐台 vault status 为 initialized 且 unsealed。不要为了解决加入失败给其他节点再次 operator init。
5. 入口、审计与权限交接#
NLB 使用 HTTPS 健康检查 /v1/sys/health?standbyok=true,让未 sealed 且可转发请求的 standby 参与服务;sealed/uninitialized 节点不能进入健康目标。TCP listener 保持端到端 TLS,客户端信任 CA,禁止 VAULT_SKIP_VERIFY=true。
启用审计前确认所有节点都有相同可写路径:
vault audit enable file file_path=/var/log/vault/audit.json
vault audit list随后完成 SSO 和运维 policy、应用 policy、备份与监控。用非 root 身份验证必要权限后,撤销 bootstrap root token,关闭 bootstrap 会话;不要把 root token 作为服务账号保存。
配置审计、认证和 secrets engine 是 cluster 级操作,不需要每台重复启用;本地证书、文件目录和外部权限则必须逐节点准备。
6. 上线验收#
- 从实际应用网络登录、读取授权 secret;其他业务路径必须拒绝。
- 停止一台 follower 仍可服务,恢复后追上 Raft;再单独演练 leader 故障与客户端重试。
- 在隔离演练环境验证 KMS 拒绝、证书过期、审计磁盘满和节点重启行为。
- 完成一次快照恢复和数据库凭据更新演练,再接受生产流量。
- 不在一个三节点集群上同时停止两台,升级和替换均需保持多数派。