Terraform 在地球状态下保密

Terraform 在地球状态下保密,terraform,Terraform,我在尽量避免在地球状态下有秘密 有没有更好的方法可以通过secret in Secrets Manager设置RDS密码 resource "null_resource" "master_password" { triggers = { db_host = module.myrdsdatabase.cluster_id } provisioner "local-exec" { command = <&

我在尽量避免在地球状态下有秘密

有没有更好的方法可以通过secret in 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"]
  }
}
资源“空”资源“主密码”{
触发器={
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,它如何处理此问题?是否有哪些答案有用?