如何在单个GitLab CI/CD作业中从两个HashiCorp Vault获取密钥?
在单个CI/CD作业中从两个HashiCorp Vault获取密钥的实现方法
可以在同一个CI/CD作业中从两个不同的HashiCorp Vault实例获取密钥,GitLab CI支持通过配置多组认证令牌和独立的密钥参数来实现。以下是具体实现步骤和示例代码:
核心实现思路
通过定义多个ID Token分别完成两个Vault的OIDC认证,再为每个来自不同Vault的密钥单独指定对应的服务器地址、认证令牌和密钥路径,确保密钥从目标Vault实例获取。
修改后的示例代码
read_secrets_from_two_vaults: stage: get_secret image: vault:1.13.3 variables: # 第一个Vault的配置变量 VAULT_SERVER_URL_1: <vault-server-url-1> VAULT_AUTH_ROLE_1: <role-1> # 第二个Vault的配置变量 VAULT_SERVER_URL_2: <vault-server-url-2> VAULT_AUTH_ROLE_2: <role-2> id_tokens: # 对应第一个Vault的ID Token,aud需匹配Vault OIDC客户端配置的受众 VAULT_ID_TOKEN_1: aud: <gitlab-url-or-vault-audience-1> # 对应第二个Vault的ID Token,aud需匹配Vault OIDC客户端配置的受众 VAULT_ID_TOKEN_2: aud: <gitlab-url-or-vault-audience-2> secrets: # 从第一个Vault获取的密钥 POSTGRES_USERNAME: vault: database/postgres/postgres_username@kv2 server: $VAULT_SERVER_URL_1 token: $VAULT_ID_TOKEN_1 file: false # 从第一个Vault获取的密钥 POSTGRES_PASSWORD: vault: database/postgres/postgres_password@kv2 server: $VAULT_SERVER_URL_1 token: $VAULT_ID_TOKEN_1 file: false # 从第二个Vault获取的密钥(示例:Redis密码) REDIS_PASSWORD: vault: cache/redis/redis_password@kv2 server: $VAULT_SERVER_URL_2 token: $VAULT_ID_TOKEN_2 file: false script: - echo "已从两个Vault获取密钥" - echo $POSTGRES_USERNAME | base64 - echo $POSTGRES_PASSWORD | base64 - echo $REDIS_PASSWORD | base64
关键配置说明
- 多ID Token配置:每个Vault需要独立的
id_tokens条目,aud字段必须与对应Vault中OIDC客户端配置的受众(Audience)一致,否则认证会失败。 - Vault变量区分:用带后缀的变量(如
VAULT_SERVER_URL_1、VAULT_SERVER_URL_2)区分两个Vault的服务器地址和角色,避免配置混淆。 - 密钥独立指定参数:每个
secrets条目通过server指定目标Vault地址,token绑定对应的认证令牌,确保密钥从正确的实例获取。
注意事项
- 确保两个Vault都已完成GitLab OIDC认证配置,允许对应的角色(
VAULT_AUTH_ROLE_1、VAULT_AUTH_ROLE_2)访问指定的密钥路径。 - 如果不使用OIDC ID Token认证,也可以直接设置两个独立的
VAULT_TOKEN_1、VAULT_TOKEN_2变量,在secrets中通过token字段引用,但ID Token认证安全性更高。 - 作业使用的镜像需支持Vault相关操作,官方
vault镜像已满足需求。
内容的提问来源于stack exchange,提问作者Karan Kumar
相关产品推荐
相关产品推荐

