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

如何为Terraform代码配置Vault身份验证且不硬编码凭证

解决方案

以下两种方案均可避免Vault凭证硬编码,你可以根据自己的实际场景选择:


方案1:使用Vault AWS Auth认证(推荐)

该方案利用EC2实例自带的IAM身份完成Vault认证,全程不需要配置任何静态用户名密码,完全规避凭证泄露风险。

  • 提前在Vault端配置AWS Auth能力(该操作可在本地运维端执行,不要写入Terraform代码)
    1. 启用AWS Auth方法:vault auth enable aws
    2. 配置Vault对接AWS的访问凭证:vault write auth/aws/config/client secret_key=<AWS管理员访问密钥> access_key=<AWS管理员访问ID>
    3. 创建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
  • 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:36:03