terraform - 将机密信息排除在 Terraform 状态之外
问题描述
我试图避免在 Terraform 状态下隐藏秘密。
有没有更好的方法从 Secrets Manager 中的密钥设置 RDS 密码?
resource "null_resource" "master_password" {
triggers = {
db_host = module.myrdsdatabase.cluster_id
}
provisioner "local-exec" {
command = <<TOF
password=$(aws secretsmanager get-secret-value --secret-id myrdscreds | jq '.SecretString | fromjson | .password' | tr -d '"')
aws rds modify-db-cluster --db-cluster-identifier ${module.myrdsdatabase.cluster_id} --master-user-password $password --apply-immediately
TOF
interpreter = ["bash", "-c"]
}
}
解决方案
这个问题没有具体的解决方案。关于在 TF中处理机密的TF github issue有将近 7 年的历史,仍然很活跃。
在您的问题中,您已经在避免aws_secretsmanager_secret_version
哪种做法是好的做法。aws_secretsmanager_secret_version
不会保护您的秘密不以纯文本形式出现在 TF 状态文件中!
一般来说,人们会做两件事来保守秘密:
- 将您的 TF 状态存储在远程后端。例如具有严格IAM 和存储桶策略控制的 S3,以及静态加密。
- 使用外部过程为您的数据库设置密码。一种方法是
local-exec
,另一种可能是使用远程 lambda throughaws_lambda_invocation
。
其他方式也是可行的,例如通过 TF 中的 CloudFormation (CFN) 创建 RDS 数据库。CFN 有一种通过动态引用安全地访问秘密管理器的正确方法。