You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:09:10