Linux - Vault
这里写目录标题
- 🧭 一、Vault 安装流程
- 1️⃣ 环境准备
- 2️⃣ 下载并安装 Vault
- 3️⃣ 创建配置目录与数据目录
- 4️⃣ 创建 Vault 配置文件
- 5️⃣ 创建 systemd 服务(可选)
- 6️⃣ 初始化 Vault
- 7️⃣ 解封 Vault
- 8️⃣ 登录 Vault
- 9️⃣ 启用 HTTPS 访问(可选)
- ✅ 验证
- 二、Vault 配置与管理
- 1️⃣ 登录与状态检查
- 2️⃣ 创建管理员策略(Admin Policy)
- 3️⃣ 启用 UserPass 认证方法
- 4️⃣ 启用审计日志
- 5️⃣ 删除 Root Token(推荐)
- 6️⃣ 紧急恢复(重新生成 Root Token)
- 三、项目接入与使用
- 1️⃣ 启用 KV 引擎(v2 版本)
- 2️⃣ 创建项目专属路径
- 3️⃣ 为项目创建独立策略
- 4️⃣ 增删改查密钥
- 5️⃣ 增删改查策略对应的 token
- 6️⃣ 增删改查 AppRole
- 7️⃣ Python 使用示例
🧭 一、Vault 安装流程
1️⃣ 环境准备
适用于:CentOS / RHEL / Ubuntu 等 Linux 系统
系统依赖
sudo yum install -y unzip
2️⃣ 下载并安装 Vault
下载官方二进制包(这里以 Linux x86_64 为例):
wget https://releases.hashicorp.com/vault/1.21.0/vault_1.21.0_linux_amd64.zip
解压并移动到可执行路径:
unzip vault_1.21.0_linux_amd64.zip
sudo mv vault /usr/local/bin/
检查是否安装成功:
vault version
3️⃣ 创建配置目录与数据目录
sudo mkdir -p /etc/vault /opt/vault/data
4️⃣ 创建 Vault 配置文件
编辑配置文件 /etc/vault/vault.hcl:
# 存储后端:Raft(推荐用于单机或小集群)
storage "raft" {path = "/opt/vault/data"node_id = "node1"
}
# 网络监听配置
listener "tcp" {address = "127.0.0.1:8982"tls_disable = true
}
cluster_addr = "http://127.0.0.1:8983"
api_addr = "http://127.0.0.1:8982"
# 启用 Web UI
ui = true
# 允许内存交换(低内存系统建议开启)
disable_mlock = false
5️⃣ 创建 systemd 服务(可选)
文件路径:/etc/systemd/system/vault.service
[Unit]
Description=Vault
After=network.target[Service]
User=root
Group=root
ExecStart=/usr/local/bin/vault server -config=/etc/vault/vault.hcl
Restart=on-failure
LimitNOFILE=65536
LimitMEMLOCK=infinity
CapabilityBoundingSet=CAP_IPC_LOCK
WorkingDirectory=/opt/vault/data[Install]
WantedBy=multi-user.target
加载并启动:
systemctl daemon-reload
systemctl enable vault
systemctl start vault
systemctl status vault
6️⃣ 初始化 Vault
# 可以写入/root/.bashrc
export VAULT_ADDR='http://127.0.0.1:8982'
vault operator init -key-shares=1 -key-threshold=1
输出示例:
Unseal Key 1: uDfw5b...X1u
Initial Root Token: hvs.zA5...6bP
⚠️ 保存好这两个值:
Unseal Key用于解封(Vault 重启后必须)Root Token是最高权限账户
7️⃣ 解封 Vault
vault operator unseal <你的 Unseal Key>
如果只设置了 -key-shares=1,执行一次即可。
8️⃣ 登录 Vault
vault login <Initial Root Token>
验证状态:
vault status
9️⃣ 启用 HTTPS 访问(可选)
如果 Vault 与 Nginx 在同一台机器上:
server {listen 443 ssl;server_name xxx.xxx.com;ssl_certificate /usr/local/web/server/cert/xxx.xxx.com.crt;ssl_certificate_key /usr/local/web/server/cert/xxx.xxx.com.key;location /vault/ {proxy_pass http://127.0.0.1:8982/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}
然后在系统环境变量中指定:
export VAULT_ADDR='https://xxx.xxx.com/vault'
export VAULT_CACERT='/usr/local/web/server/cert/xxx.xxx.com.crt'
✅ 验证
curl http://127.0.0.1:8982/v1/sys/health
二、Vault 配置与管理
1️⃣ 登录与状态检查
# 确认 Vault 状态
vault status# 确认你已经使用 root token 登录
vault token lookup
2️⃣ 创建管理员策略(Admin Policy)
cat > /tmp/admin-policy.hcl <<'EOF'
# 管理所有密钥
path "secret/*" {capabilities = ["create", "read", "update", "delete", "list"]
}path "secret/data/*" {capabilities = ["create", "read", "update", "delete", "list"]
}path "secret/metadata/*" {capabilities = ["list", "read", "delete"]
}# 管理认证方法
path "auth/*" {capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}path "sys/auth" {capabilities = ["read", "list", "sudo"]
}path "sys/auth/*" {capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}# 管理策略
path "sys/policies/*" {capabilities = ["create", "read", "update", "delete", "list"]
}# 管理 Secrets Engines
path "sys/mounts/*" {capabilities = ["create", "read", "update", "delete", "list"]
}# 管理 Token
path "auth/token/*" {capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}# 管理审计设备
path "sys/audit" {capabilities = ["read", "list", "sudo"]
}path "sys/audit/*" {capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}# 系统状态与能力查看
path "sys/health" { capabilities = ["read"] }
path "sys/capabilities-self" { capabilities = ["read"] }
path "sys/seal-status" { capabilities = ["read"] }# 管理租约
path "sys/leases/*" {capabilities = ["create", "read", "update", "delete", "list"]
}
EOF
💡 说明:此策略允许管理员对密钥、认证方法、策略、租约、审计、系统状态等拥有完全控制权限。
写入 Vault:
vault policy write admin /tmp/admin-policy.hcl
vault policy read admin
3️⃣ 启用 UserPass 认证方法
vault auth enable userpass
创建管理员用户(安全方式输入密码):
read -s -p "请输入管理员密码: " ADMIN_PASSWORD
vault write auth/userpass/users/admin password="$ADMIN_PASSWORD" policies=admin
unset ADMIN_PASSWORD
验证登录:
vault login -method=userpass username=admin
测试创建 token:
vault token create -policy=default -ttl=1h
查看当前策略:
vault policy list
4️⃣ 启用审计日志
mkdir -p /var/log/vault
chmod 750 /var/log/vault# 确认当前用户为管理员
vault token lookup | grep display_name# 启用审计日志
vault audit enable file file_path=/var/log/vault/audit.log# 查看启用的审计设备
vault audit list
⚙️ 说明:审计日志默认写入
/var/log/vault/audit.log,重启 Vault 后会自动加载,无需重复启用。
5️⃣ 删除 Root Token(推荐)
# 撤销 root token
vault token revoke <root-token># 验证 root token 是否失效
vault login <root-token> # 应该失败
6️⃣ 紧急恢复(重新生成 Root Token)
当 root token 丢失或被删除时,可以通过已保存的 Unseal Key 恢复:
# 初始化 Root Token 生成过程
vault operator generate-root -init
# 输出:
# Nonce: 1a2b3c4d-5678-90ab-cdef-1234567890ab
# OTP: W3DFkR1qZApG9WzLmfVt# 使用 Unseal Key 继续生成
vault operator generate-root -nonce=1a2b3c4d-5678-90ab-cdef-1234567890ab <unseal-key>
# 输出:
# Encoded root token: DxhHaVUGYQZBLQYyPTEfcSlkJxIXLyFhACohBw# 解码生成 Root Token
vault operator generate-root -decode=DxhHaVUGYQZBLQYyPTEfcSlkJxIXLyFhACohBw -otp=W3DFkR1qZApG9WzLmfVt
# 输出:
# Root Token: hvs.xxxxxxx....
三、项目接入与使用
1️⃣ 启用 KV 引擎(v2 版本)
在项目开始前,我们为项目启用一个独立的 KV v2 密钥引擎,用于管理配置或密钥。
vault secrets enable -path=secret kv-v2
💡 说明:
-path=secret表示在secret/路径启用 KV 引擎。- 如果之前已经存在
secret/,会提示已启用,可跳过此步骤。
2️⃣ 创建项目专属路径
假设项目名称为 test,我们约定存储结构如下:
- 密钥路径:
secret/test/config
# 创建项目路径
vault kv put secret/test/config username=admin password=123456
# 列出根目录
vault list secret/metadata/
# 列出 test 下的路径
vault list secret/metadata/test/
3️⃣ 为项目创建独立策略
# 创建策略文件 test-policy.hcl
cat > test-policy.hcl <<'EOF'
path "secret/data/test/*" {capabilities = ["create", "read", "update", "delete", "list"]
}
EOF# 写入策略
vault policy write test test-policy.hcl
# 查询所有策略
vault policy list
# 查看策略
vault policy read <policy_name>
# 删除策略
vault policy delete <policy_name>
4️⃣ 增删改查密钥
# 创建/更新
vault kv put secret/test/config password=abc123# 查询最新版本
vault kv get secret/test/config# 查询指定版本
vault kv get -version=2 secret/test/config# 查询指定key
vault kv get -field=password secret/test/config# 删除(软删除,保留历史版本)
vault kv delete secret/test/config# 元数据删除(metadata delete)
vault kv metadata delete secret/test/config
5️⃣ 增删改查策略对应的 token
# 创建 token
vault token create -policy=test -ttl=1h# 查看 token
vault list auth/token/accessors
vault token lookup <token>
vault token lookup -accessor <accessors># 删除 token
vault token revoke <token>
vault token revoke -accessor <accessors>
6️⃣ 增删改查 AppRole
AppRole 常用于服务器端程序安全访问 Vault,无需人工交互。
启用 AppRole 认证:
vault auth enable approle
# 创建 AppRole 并绑定策略
vault write auth/approle/role/test token_policies="test" token_ttl=30m token_max_ttl=1h token_num_uses=3 secret_id_ttl=24h secret_id_num_uses=10
# 查看 AppRole 信息
vault read auth/approle/role/test
# 获取 role_id
vault read auth/approle/role/test/role-id
# 生成 secret_id
vault write -f auth/approle/role/test/secret-id
# 通过 role_id + secret_id 获取 token
vault write auth/approle/login role_id="<role_id>" secret_id="<secret_id>"
# 删除 AppRole
vault delete auth/approle/role/test
7️⃣ Python 使用示例
使用 Token 方式
import hvacclient = hvac.Client(url='https://wycl.ggjtfw.com/vault',token='hvs.YourTokenHere',verify='/usr/local/web/server/cert/wycl.ggjtfw.com.crt'
)secret = client.secrets.kv.v2.read_secret_version(path='test/dev')
print(secret['data']['data'])
使用 AppRole 动态获取 Token
import hvacVAULT_ADDR = "https://wycl.ggjtfw.com/vault"
ROLE_ID = "your-role-id"
SECRET_ID = "your-secret-id"
CA_CERT = "/usr/local/web/server/cert/wycl.ggjtfw.com.crt"# 初始化客户端
client = hvac.Client(url=VAULT_ADDR, verify=CA_CERT)# 登录 Vault
login = client.auth.approle.login(role_id=ROLE_ID, secret_id=SECRET_ID)
client.token = login['auth']['client_token']# 读取密钥
secret = client.secrets.kv.v2.read_secret_version(path='test/dev')
print(secret['data']['data'])
💡 建议:
- 在生产环境中,不直接将
ROLE_ID与SECRET_ID写入代码;- 可以通过环境变量、Vault Agent 注入等安全方式传入。
