如何为Terraform代码配置Vault身份验证且不硬编码凭证
解决方案
以下两种方案均可避免Vault凭证硬编码,你可以根据自己的实际场景选择:
方案1:使用Vault AWS Auth认证(推荐)
该方案利用EC2实例自带的IAM身份完成Vault认证,全程不需要配置任何静态用户名密码,完全规避凭证泄露风险。
- 提前在Vault端配置AWS Auth能力(该操作可在本地运维端执行,不要写入Terraform代码)
- 启用AWS Auth方法:
vault auth enable aws - 配置Vault对接AWS的访问凭证:
vault write auth/aws/config/client secret_key=<AWS管理员访问密钥> access_key=<AWS管理员访问ID> - 创建EC2专属访问角色,绑定EC2使用的IAM角色ARN,关联对应密钥访问权限:
vault write auth/aws/role/ec2-app-role auth_type=iam bound_iam_principal_arn=arn:aws:iam::<你的AWS账号ID>:role/<EC2绑定的IAM角色名> policies=<应用所需的Vault权限策略名> max_ttl=24h
- 启用AWS Auth方法:
- 修改Terraform配置,给
aws_instance资源绑定对应IAM实例配置文件,给EC2授予调用AWS Auth的基础权限:
新增iam_instance_profile资源绑定上述IAM角色后,在aws_instance参数中增加配置:iam_instance_profile = aws_iam_instance_profile.ec2_vault_access.name - 更新user_data中的Vault登录逻辑,执行以下命令即可完成认证:
vault login -method=aws role=ec2-app-role
登录成功后会自动生成~/.vault-token凭证文件,后续直接执行vault kv get <密钥路径>即可拉取所需密钥。
方案2:保留userpass认证的适配方案
如果暂时无法调整Vault端的认证配置,必须使用userpass方式登录,可通过AWS Secrets Manager托管凭证,避免硬编码:
- 提前在AWS Secrets Manager中创建机密,存入Vault的用户名和密码,仅给EC2绑定的IAM角色开放该机密的读取权限。
- 在user_data中先调用AWS CLI拉取凭证,再执行登录操作:
# 拉取Vault凭证 VAULT_USER=$(aws secretsmanager get-secret-value --secret-id <你存储Vault凭证的机密名称> --query SecretString --output text | jq -r '.vault_username') VAULT_PASS=$(aws secretsmanager get-secret-value --secret-id <你存储Vault凭证的机密名称> --query SecretString --output text | jq -r '.vault_password') # 执行Vault登录,屏蔽输出避免凭证泄露到日志 vault login -method=userpass username=${VAULT_USER} password=${VAULT_PASS} > /dev/null 2>&1 # 清除内存中的敏感变量 unset VAULT_USER VAULT_PASS
注意:需确保user_data执行环境中已经安装
jq工具,同时关闭user_data的命令输出日志,避免敏感信息泄露。
无论使用哪种方案,都需要确认你提前配置的VAULT_ADDR、VAULT_SKIP_VERIFY、VAULT_NAMESPACE三个环境变量在执行登录命令的用户上下文内有效,建议在执行登录前重新export一遍变量避免失效。
内容的提问来源于stack exchange,提问作者Tate_87
相关产品推荐
相关产品推荐

