Vault 密钥管理系统部署教程
HashiCorp Vault 是一款企业级的密钥管理工具,用于安全地存储和访问密码、API 密钥、证书等敏感数据。Vault 提供了统一的接口来管理密钥,支持动态凭据生成、加密即服务、密钥轮换等功能。本文将介绍如何在搬瓦工 VPS 上部署和使用 Vault。
一、Vault 核心概念
- Secret Engine:密钥存储引擎,支持 KV、数据库动态凭据、PKI 等多种类型。
- Auth Method:认证方式,决定谁可以访问 Vault。
- Policy:策略,控制 Token 可以访问哪些路径。
- Token:访问 Vault 的凭证。
- Seal/Unseal:Vault 启动后处于封印状态,需要解封后才能使用。
二、安装 Vault
2.1 包管理器安装
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/hashicorp.list
apt update
apt install vault -y
2.2 验证安装
vault version
2.3 Docker 安装
docker run -d \
--name vault \
--restart=always \
--cap-add=IPC_LOCK \
-p 8200:8200 \
-v vault_data:/vault/data \
-e VAULT_ADDR=http://0.0.0.0:8200 \
hashicorp/vault:latest server -config=/vault/config
三、配置与启动
3.1 创建配置文件
mkdir -p /etc/vault.d /opt/vault/data
cat > /etc/vault.d/vault.hcl <<EOF
ui = true
storage "file" {
path = "/opt/vault/data"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 1
}
api_addr = "http://127.0.0.1:8200"
cluster_addr = "https://127.0.0.1:8201"
EOF
3.2 配置系统服务
cat > /etc/systemd/system/vault.service <<EOF
[Unit]
Description=HashiCorp Vault
After=network.target
[Service]
ExecStart=/usr/bin/vault server -config=/etc/vault.d/vault.hcl
ExecReload=/bin/kill -HUP \$MAINPID
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl enable vault
systemctl start vault
3.3 设置环境变量
export VAULT_ADDR='http://127.0.0.1:8200'
echo 'export VAULT_ADDR="http://127.0.0.1:8200"' >> ~/.bashrc
四、初始化与解封
4.1 初始化 Vault
vault operator init
此命令会输出 5 个解封密钥和 1 个 Root Token。务必安全保存这些密钥,丢失将无法恢复 Vault 数据。
4.2 解封 Vault
需要使用 3 个(默认阈值)解封密钥:
vault operator unseal KEY_1
vault operator unseal KEY_2
vault operator unseal KEY_3
4.3 登录
vault login ROOT_TOKEN
4.4 查看状态
vault status
五、KV 密钥存储
5.1 启用 KV v2 引擎
vault secrets enable -version=2 -path=secret kv
5.2 存储密钥
# 写入密钥
vault kv put secret/myapp/database \
host=192.168.1.20 \
port=3306 \
username=admin \
password=secure_password
# 写入 API 密钥
vault kv put secret/myapp/api \
key=sk-xxxxxxxxxxxx \
endpoint=https://api.example.com
5.3 读取密钥
# 读取所有字段
vault kv get secret/myapp/database
# 读取特定字段
vault kv get -field=password secret/myapp/database
# JSON 格式输出
vault kv get -format=json secret/myapp/database
5.4 版本管理
# 查看密钥版本历史
vault kv metadata get secret/myapp/database
# 读取特定版本
vault kv get -version=2 secret/myapp/database
# 删除特定版本(软删除)
vault kv delete -versions=3 secret/myapp/database
# 恢复删除的版本
vault kv undelete -versions=3 secret/myapp/database
六、策略管理
6.1 创建策略
cat > myapp-policy.hcl <<EOF
# 允许读取 myapp 下的密钥
path "secret/data/myapp/*" {
capabilities = ["read", "list"]
}
# 允许读取数据库凭据
path "database/creds/myapp-role" {
capabilities = ["read"]
}
EOF
vault policy write myapp myapp-policy.hcl
6.2 查看策略
vault policy list
vault policy read myapp
6.3 创建关联策略的 Token
vault token create -policy=myapp -ttl=24h
七、认证方式
7.1 AppRole 认证(适合应用程序)
# 启用 AppRole
vault auth enable approle
# 创建 Role
vault write auth/approle/role/myapp \
token_policies="myapp" \
token_ttl=1h \
token_max_ttl=24h
# 获取 Role ID
vault read auth/approle/role/myapp/role-id
# 生成 Secret ID
vault write -f auth/approle/role/myapp/secret-id
应用程序使用 Role ID 和 Secret ID 登录:
vault write auth/approle/login \
role_id=YOUR_ROLE_ID \
secret_id=YOUR_SECRET_ID
7.2 Token 认证
# 创建有限权限的 Token
vault token create \
-policy=myapp \
-ttl=8h \
-use-limit=10 \
-display-name="cicd-token"
八、应用集成
8.1 Shell 脚本中使用
#!/bin/bash
export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN='your-token'
DB_PASS=$(vault kv get -field=password secret/myapp/database)
API_KEY=$(vault kv get -field=key secret/myapp/api)
echo "Database password retrieved"
echo "API key retrieved"
8.2 在 Docker 中使用
version: '3.8'
services:
app:
image: myapp:latest
environment:
- VAULT_ADDR=http://vault:8200
- VAULT_TOKEN=${VAULT_TOKEN}
networks:
- app-net
vault:
image: hashicorp/vault:latest
cap_add:
- IPC_LOCK
ports:
- "8200:8200"
volumes:
- vault_data:/vault/data
networks:
- app-net
networks:
app-net:
volumes:
vault_data:
九、Web UI
访问 http://你的IP:8200/ui 可以使用 Vault Web 界面进行密钥管理。建议在生产环境中通过反向代理启用 HTTPS。
十、常见问题
Vault 处于 Sealed 状态
每次 Vault 重启都需要重新解封。可以使用 vault operator unseal 解封,或配置自动解封(需额外配置 KMS)。
Token 过期
# 查看 Token 信息
vault token lookup
# 续期 Token
vault token renew
权限不足
# 检查当前 Token 的策略
vault token lookup
vault policy read POLICY_NAME
总结
Vault 为应用程序和基础设施提供了集中化的密钥管理方案,避免了在配置文件和环境变量中明文存储敏感数据。搭配 Consul 可以构建完整的服务发现和配置管理平台。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 享受 6.77% 折扣。