在 HashiCorp Vault 中管理密钥
HashiCorp Vault 是一个用于跨不同环境和应用程序管理密钥和加密的集中式平台。它为存储和访问(例如 API 密钥、密码、证书等)提供了统一的密钥管理。
APISIX 支持在配置文件中将敏感数据存储为密钥,例如 admin_key、etcd username、password。
本指南将向你展示如何配置 HashiCorp Vault 作为密钥管理器,然后将 APISIX admin_key 存储在 Vault 中,并在 APISIX 配置文件中引用该密钥。

前置条件
- 安装 Docker。
- 安装 cURL 以向服务发送请求进行验证。
- 安装 ZIP 以从 官方分发的压缩文件 中解压缩 Vault 二进制文件。
- 按照 快速入门教程 在 Docker 中启动一个新的 APISIX 实例。
配置 Vault 服务器
在 Docker 中以开发模式启动一个名为 apisix-quickstart-vault 的 Vault 实例,令牌为 apisix-quickstart-vault-token。暴露的端口映射到主机上的 8200:
docker run -d --cap-add=IPC_LOCK \
-e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200' \
-e 'VAULT_ADDR=http://127.0.0.1:8200' \
-e 'VAULT_DEV_ROOT_TOKEN_ID=apisix-quickstart-vault-token' \
-e 'VAULT_TOKEN=apisix-quickstart-vault-token' \
--network=apisix-quickstart-net \
--name apisix-quickstart-vault \
-p 8200:8200 vault:1.13.0
APISIX 需要访问 Vault 并检索密钥的权限。你应该使用 HashiCorp 配置语言 (HCL) 创建一个策略文件,以为 APISIX 生成 Vault 访问令牌。
在 Vault 实例中创建一个名为 apisix-policy.hcl 的 Vault 策略文件,以授予 APISIX 对路径 secret/ 的读取权限。你可以将密钥放在路径 secret/ 下,以允许 APISIX 读取它们:
docker exec apisix-quickstart-vault /bin/sh -c "echo '
path \"secret/data/*\" {
capabilities = [\"read\"]
}
' > /etc/apisix-policy.hcl"
将策略文件应用到 Vault 实例:
docker exec apisix-quickstart-vault vault policy write apisix-policy /etc/apisix-policy.hcl
接下来,生成附加到新定义策略的访问令牌,以便 APISIX 访问 Vault:
docker exec apisix-quickstart-vault vault token create -policy="apisix-policy"
每次执行上述命令都会生成一个不同的令牌。如果成功,输出应类似于以下内容:
Key Value
--- -----
token hvs.CAESIHUznrV4wgcifUia0FROd6iprK7NjipAiHBYwiZDQP9TGh4KHGh2cy5ndHc5dzBPbXd5Y1pzblZXd2ZuQXA3ZHI
token_accessor YY4iCj2lICDNd50ZJDsBjvZK
token_duration 768h
token_renewable true
token_policies ["apisix-policy" "default"]
identity_policies []
policies ["apisix-policy" "default"]
复制令牌的值并创建一个名为 apisix-vault-token 的文件以将其存储在 APISIX 实例中:
docker exec apisix-quickstart /bin/sh -c "echo '
hvs.CAESIHUznrV4wgcifUia0FROd6iprK7NjipAiHBYwiZDQP9TGh4KHGh2cy5ndHc5dzBPbXd5Y1pzblZXd2ZuQXA3ZHI
' > /usr/local/apisix/conf/apisix-vault-token"
Vault Agent 在下一步中使用令牌 apisix-vault-token 向 Vault 进行身份验证。
配置 Vault Agent
Vault Agent 是一个客户端守护程序,它与你的应用程序一起运行,并自动执行 Vault 身份验证和令牌续订。它充当 Vault API 的代理并将 Vault 密钥呈现为文件。
APISIX 中的敏感配置可以存储在 Vault 中,然后 Vault Agent 读取它们并将它们注入到 APISIX 配置文件中,例如 admin_key。
下载 Vault 二进制文件并将其复制到 APISIX 实例中:
wget https://releases.hashicorp.com/vault/1.13.0/vault_1.13.0_linux_amd64.zip
unzip vault_1.13.0_linux_amd64.zip
docker cp vault apisix-quickstart:/usr/local/bin/
在 APISIX 实例中创建一个名为 vault-agent-apisix.hcl 的文件,以配置 Vault Agent 如何访问服务器并呈现密钥。
docker exec apisix-quickstart /bin/sh -c "echo '
pid_file = \"./pidfile\"
vault {
address = \"http://apisix-quickstart-vault:8200\"
retry {
num_retries = 5
}
}
auto_auth {
method {
type = \"token_file\"
config = {
token_file_path = \"/usr/local/apisix/conf/apisix-vault-token\"
}
}
}
listener \"tcp\" {
address = \"127.0.0.1:8100\"
tls_disable = true
}
template {
source = \"/usr/local/apisix/conf/config.ctmpl\"
destination = \"/usr/local/apisix/conf/config.yaml\"
}
' > /usr/local/apisix/conf/vault-agent-apisix.hcl"
❶ Vault 地址
❷ 用于身份验证的令牌
❸ Vault Agent 守护程序监听属性
❹ 用于渲染的模板文件
❺ 渲染后的 APISIX 配置文件
Vault Agent 启动后,根据模板文件 config.ctmpl 将密钥注入到 APISIX 配置文件 config.yaml 中。这两个文件都存储在 APISIX 默认配置路径 /usr/local/apisix/conf/ 中。