Terraform 在地球状态下保密
我在尽量避免在地球状态下有秘密 有没有更好的方法可以通过secret in Secrets Manager设置RDS密码Terraform 在地球状态下保密,terraform,Terraform,我在尽量避免在地球状态下有秘密 有没有更好的方法可以通过secret in Secrets Manager设置RDS密码 resource "null_resource" "master_password" { triggers = { db_host = module.myrdsdatabase.cluster_id } provisioner "local-exec" { command = <&
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"]
}
}
资源“空”资源“主密码”{
触发器={
db_host=module.myrdsdatabase.cluster_id
}
供应人“本地执行官”{
command=对于这个问题没有具体的解决方案。关于如何在TF中处理机密,已经有近7年的讨论了,仍然很活跃
在您的问题中,您已经在避免使用aws\u secretsmanager\u secret\u version
,这是一种很好的做法。aws\u secretsmanager\u secret\u version
将无法保护您的机密,使其不会以明文形式出现在TF状态文件中
一般来说,人们会做两件事来保守秘密:
将您的TF状态存储在远程后端。例如,S3具有严格的IAM和bucket策略控制,以及静态加密
使用external过程为数据库设置密码。一种方法是local exec
,另一种方法是通过aws\u lambda\u调用使用远程lambda
其他方法也是可能的,例如从TF通过CloudFormation(CFN)创建RDS数据库。CFN有一种通过动态引用安全访问secret manager的正确方法。当前可能的解决方法是使用SecretHub
但是,正如@marcin所说,Terraform没有提供本地支持,加密您的状态文件并限制对后端的访问,例如S3
另一种方法是在terraform外部使用aws cli来保存密码并将其上载到secret manager。我们必须接受机密处于状态,并相应地管理对远程状态的访问和加密
您可以通过数据源直接从secrets manager获取值
使用jq--raw格式或-r
password=$(aws secretsmanager get-secret-value --secret-id myrdscreds | jq -r .SecretString | jq -r .password)
我更喜欢从构建脚本获取并在变量中传递机密,而不是本地exec。这似乎更干净,在某些情况下,更改机密值时可能不会触发null资源上的触发器。Terraform的哪个版本?这是否回答了您的问题?Terraform的版本是0.14,它如何处理此问题?是否有哪些答案有用?