创建秘密管理器资源时如何避免在 Terraform 脚本中包含凭据信息?

How to avoid including credential information in Terraform script when creating a secret manager resource?

我想在 Terraform 中创建一个秘密来存储 FTP 凭据,我阅读了一些内容,包括资源 secretsmanager_secret and secretsmanager_secret_version.

的 Terraform 文档

我现在有了一些想法,我的理解是使用下面的代码我可以创建一个空的秘密:

resource "aws_secretsmanager_secret" "example" {
  name = "example"
}

然后我可以使用下面的代码指定我的凭据来告诉 Terraform 什么键和值需要存储在这个秘密中:

resource "aws_secretsmanager_secret_version" "example" {
  secret_id     = aws_secretsmanager_secret.example.id
  secret_string = "example-string-to-protect"
}

我现在很困惑,通过这种方式,凭据将暴露在 Terraform 脚本中,那么这样做有什么意义呢?我想知道最佳实践是什么,也许只是在 Terraform 中创建一个空的秘密,然后在 AWS 控制台中手动添加凭据?有人可以帮忙吗?谢谢

由于您硬编码“要保护的示例字符串”,秘密将以纯文本形式存在于您的源代码中。这是不好的做法

I wonder what the best practice is, maybe just create an empty secret in Terraform, then add credentials manually in AWS console?

是的,这很常见。但即使你这样做,并尝试使用 数据源 aws_secretsmanager_secret_version 来获取秘密并将其用于,例如为您的数据库设置密码,秘密将在状态文件的 痛苦文本 中结束。

这是 github Storing sensitive values in state files 上的一个长期未解决的问题。

因此,如果您想手动执行此操作,然后使用数据源获取机密,则必须保护您的状态文件,通常使用 具有严格访问控制的远程后端(例如S3)。另一种方法同样是不访问 TF 中的秘密值。相反,您可以使用 local-exec 来使用 AWS CLI 或 SDK 获取密钥,并在需要时使用它。或者完全在 TF 之外“手动”执行(使用 AWS CLI 或 SDK)。

更新

关于Hashicorp Vault

Terraform can be used by the Vault administrators to configure Vault and populate it with secrets. In this case, the state and any plans associated with the configuration must be stored and communicated with care, since they will contain in cleartext any values that were written into Vault.

Currently Terraform has no mechanism to redact or protect secrets that are provided via configuration