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 拒绝、证书过期、审计磁盘满和节点重启行为。
  • 完成一次快照恢复和数据库凭据更新演练,再接受生产流量。
  • 不在一个三节点集群上同时停止两台,升级和替换均需保持多数派。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭