首页 > 解决方案 > 将机密信息排除在 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"]
  }
}

标签: terraform

解决方案


这个问题没有具体的解决方案。关于在 TF中处理机密的TF github issue有将近 7 年的历史,仍然很活跃。

在您的问题中,您已经在避免aws_secretsmanager_secret_version哪种做法是好的做法。aws_secretsmanager_secret_version 不会保护您的秘密不以纯文本形式出现在 TF 状态文件中!

一般来说,人们会做两件事来保守秘密:

  1. 将您的 TF 状态存储在远程后端。例如具有严格IAM 和存储桶策略控制的 S3,以及静态加密。
  2. 使用外部过程为您的数据库设置密码。一种方法是local-exec,另一种可能是使用远程 lambda through aws_lambda_invocation

其他方式也是可行的,例如通过 TF 中的 CloudFormation (CFN) 创建 RDS 数据库。CFN 有一种通过动态引用安全地访问秘密管理器的正确方法。


推荐阅读