HashiCorp Vault是面向现代基础设施的密钥管理系统,提供动态密钥生成、密钥轮换、访问审计、加密即服务等功能。应用程序将数据库密码、API Key、TLS证书等敏感信息硬编码在配置文件或环境变量中,面临泄露风险且轮换困难。Vault通过统一密钥存储和动态分发机制解决这些问题。本文讲解Vault部署、密钥管理与访问策略配置实践。
Vault架构设计与密钥存储引擎
Vault采用client-server架构,支持HA集群部署。服务器端使用Raft共识协议保证数据一致性,所有密钥经AES-256-GCM加密后存储在Raft日志中。Vault启动时处于sealed状态,需提供unseal key解密主密钥后才能提供服务。
Vault支持多种secrets engine,每种引擎管理特定类型的密钥:
kv引擎:存储静态键值对,适合API Key、TLS证书等静态密钥。database引擎:连接数据库后端,按需生成临时数据库账号,过期自动回收。transit引擎:提供加密即服务,应用调用Vault API完成加解密,密钥不离开Vault。pki引擎:管理CA证书颁发与吊销。
Vault服务器部署与初始化配置
使用Docker快速部署Vault开发环境:
# 开发模式启动(仅测试用,数据不持久化)
docker run --rm -p 8200:8200 -e VAULT_DEV_ROOT_TOKEN_ID=root hashicorp/vault server -dev
# 生产环境配置(单节点Raft存储)
cat > vault-config.json << 'EOF'
{
"api_addr": "http://0.0.0.0:8200",
"listener": {
"tcp": {
"address": "0.0.0.0:8200",
"tls_disable": true
}
},
"storage": {
"raft": {
"path": "/vault/data",
"node_id": "node1"
}
},
"ui": true
}
EOF
docker run -d --name vault \
-p 8200:8200 \
-v ./vault-config.json:/vault/config/vault.json \
-v ./vault-data:/vault/data \
-e VAULT_ADDR=http://0.0.0.0:8200 \
hashicorp/vault server -config=/vault/config/vault.json
初始化Vault,生成unseal key和root token:
export VAULT_ADDR=http://127.0.0.1:8200
# 初始化(3个unseal key,2个即可解封)
vault operator init -key-shares=3 -key-threshold=2
# 解封
vault operator unseal
vault operator unseal
# 登录
vault login
静态密钥存储与动态密钥生成
启用KV引擎存储静态密钥:
# 启用KV v2引擎
vault secrets enable -path=secret kv-v2
# 存储数据库配置
vault kv put secret/db/mysql \
username="app_user" \
password="S3cur3P@ss" \
host="10.0.1.20" \
port=3306
# 读取密钥
vault kv get secret/db/mysql
# 读取特定字段
vault kv get -field=password secret/db/mysql
启用数据库引擎生成动态临时账号:
# 启用database引擎
vault secrets enable database
# 配置MySQL连接
vault write database/config/mysql \
plugin_name=mysql-database-plugin \
connection_url="root:admin@tcp(10.0.1.20:3306)/" \
allowed_roles="app-role"
# 创建角色:生成临时账号,TTL 1小时,最大TTL 24小时
vault write database/roles/app-role \
db_name=mysql \
creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; GRANT SELECT ON appdb.* TO '{{name}}'@'%';" \
default_ttl=1h \
max_ttl=24h
# 生成临时账号
vault read database/creds/app-role
# 输出: username=v-token-app-role-xxx, password=随机密码, ttl=1h
每次调用vault read database/creds/app-role生成新的临时账号,1小时后自动回收。应用每次启动或连接池刷新时获取新账号,密码不再硬编码。
策略配置与访问权限控制
Vault通过HCL策略文件控制客户端对密钥路径的访问权限:
# 应用策略:只能读取特定路径
cat > app-policy.hcl << 'EOF'
path "secret/data/db/mysql" {
capabilities = ["read"]
}
path "database/creds/app-role" {
capabilities = ["read"]
}
path "secret/data/app/*" {
capabilities = ["read", "list"]
}
EOF
vault policy write app app-policy.hcl
# 创建token供应用使用
vault token create -policy=app -period=24h
capabilities包括create、read、update、delete、list、deny。deny优先级最高,匹配deny的路径一律拒绝。period参数设置token最大TTL,token到期后需续约。
密钥自动轮换与审计日志
Vault审计日志记录所有API请求,包括谁在什么时间访问了什么密钥:
# 启用审计日志
vault audit enable file file_path=/vault/audit/audit.log
# 查看审计日志
tail -f /vault/audit/audit.log | jq .
审计日志中敏感数据(密钥值、token)自动hash脱敏,只保留可追溯的请求路径和客户端身份。
KV v2引擎支持密钥版本管理和自动轮换:
# 写入新版本
vault kv put secret/db/mysql password="NewS3cur3P@ss"
# 查看历史版本
vault kv metadata get secret/db/mysql
# 回滚到旧版本
vault kv rollback -version=1 secret/db/mysql
Vault的动态密钥机制将密钥管理从"分发后无法控制"变为"按需生成、到期自动回收"。应用通过Vault API获取临时凭证,密钥泄露窗口从永久缩短到TTL周期。结合审计日志,实现密钥使用的完整可追溯性。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/hashicorpvault-mi-yao-guan-li-shi-zhan-dong-tai-mi-yao-lun/