如何通过Vault命令行将密钥从一个HashiCorp Vault导出并导入至另一个?
绝对有简洁的命令行方案搞定跨Vault的密钥迁移!我平时处理这类需求都是用Vault CLI结合简单的shell脚本实现,不用复杂工具,下面一步步来:
前提准备
首先得确保你能通过CLI访问源Vault和目标Vault,最方便的方式是用环境变量切换(可以开两个终端分别处理,避免来回切换):
# 终端1:配置源Vault环境 export VAULT_ADDR=https://source-vault.example.com:8200 export VAULT_TOKEN=你的源Vault管理员/有权限的Token # 终端2:配置目标Vault环境 export VAULT_ADDR=https://target-vault.example.com:8200 export VAULT_TOKEN=你的目标Vault管理员/有权限的Token
1. 导出源Vault的密钥数据
分两种情况处理,取决于你的密钥用的是KV v1还是KV v2引擎(Vault 1.10+默认创建的是KV v2):
KV v2引擎(推荐)
Vault 1.11+原生支持vault kv export命令,能直接导出单个路径或整个引擎的所有密钥(包括子路径和版本历史):
# 导出整个secret引擎下的所有密钥到json文件 vault kv export -format=json -path=secret/ > vault-secrets-export.json # 仅导出指定路径(比如secret/my-app)下的密钥 vault kv export -format=json -path=secret/my-app > my-app-secrets.json
KV v1引擎
KV v1没有原生导出命令,我们可以用shell脚本+jq工具(需要提前安装jq)递归遍历并导出:
# 定义要导出的KV引擎路径和输出文件 ENGINE_PATH="secret" OUTPUT_FILE="vault-secrets-v1-export.json" # 初始化空JSON文件 echo "{}" > $OUTPUT_FILE # 递归遍历所有密钥路径 vault kv list -format=json $ENGINE_PATH | jq -r '.[]' | while read path; do # 判断当前路径是目录还是密钥 if [[ $path == */ ]]; then # 递归处理子目录 vault kv list -format=json "$ENGINE_PATH/$path" | jq -r '.[]' | while read subpath; do secret_data=$(vault kv get -format=json "$ENGINE_PATH/$path$subpath") jq --arg key "$ENGINE_PATH/$path$subpath" '. + {($key): $secret_data}' $OUTPUT_FILE > temp.json && mv temp.json $OUTPUT_FILE done else # 导出单个密钥数据 secret_data=$(vault kv get -format=json "$ENGINE_PATH/$path") jq --arg key "$ENGINE_PATH/$path" '. + {($key): $secret_data}' $OUTPUT_FILE > temp.json && mv temp.json $OUTPUT_FILE fi done
2. 导入到目标Vault
同样分KV v2和KV v1两种情况:
KV v2引擎
直接用vault kv import命令导入之前导出的JSON文件,非常省心:
# 导入整个引擎的密钥到目标Vault的secret路径 vault kv import -format=json secret/ @vault-secrets-export.json # 仅导入指定路径的密钥 vault kv import -format=json secret/my-app @my-app-secrets.json
KV v1引擎
用shell脚本读取导出的JSON文件,逐个写入目标Vault:
INPUT_FILE="vault-secrets-v1-export.json" ENGINE_PATH="secret" # 遍历JSON中的每个密钥路径 jq -r 'keys[]' $INPUT_FILE | while read key; do # 提取密钥的实际值(注意KV v1的JSON结构) secret_value=$(jq -r --arg key "$key" '.[$key].data' $INPUT_FILE) # 写入目标Vault vault kv put "$key" $secret_value done
关键注意事项
- 目标Vault需要提前创建好对应的KV引擎:比如KV v2用
vault secrets enable -path=secret kv,KV v1用vault secrets enable -path=secret kv-v1 - 权限检查:源Vault的Token需要有密钥读取权限,目标Vault的Token需要有密钥写入权限
- 敏感数据处理:导出的JSON文件包含明文密钥,处理完成后务必及时删除,不要留在服务器或本地
- 版本保留:KV v2导出会包含版本历史,导入时默认会创建新版本,如果需要指定版本可以添加
-version参数
内容的提问来源于stack exchange,提问作者Brad Parks
相关产品推荐
相关产品推荐

