我如何确保我的秘密检索是安全的?

How can I insure that my retrieval of secrets is secure?

目前我正在使用 Terraform 和 Aws Secrets Manager 来存储和检索机密,我想了解一下我的实施是否安全,如果不安全,我该如何使其更安全。让我用我尝试过的来说明。

secrets.tf 中,我创建了一个秘密,例如(这需要通过定位来实现):

resource "aws_secretsmanager_secret" "secrets_of_life" {
  name = "top-secret"
}

然后我转到控制台并在 AWS Secrets Manager 中手动设置密钥。

然后我检索 secrets.tf 中的秘密,例如:

data "aws_secretsmanager_secret_version" "secrets_of_life_version" {
  secret_id = aws_secretsmanager_secret.secrets_of_life.id
}

locals {
  creds = jsondecode(data.aws_secretsmanager_secret_version.secrets_of_life.secret_string)
}

然后我继续使用秘密(例如将它们导出为 K8s 秘密),例如:

resource "kubernetes_secret" "secret_credentials" {
  metadata {
    name      = "kubernetes_secret"
    namespace = kubernetes_namespace.some_namespace.id
  }
  data = {
    top_secret = local.creds["SECRET_OF_LIFE"]
  }
  type = "kubernetes.io/generic"
}

值得一提的是我远程存储tf state。我的实施安全吗?如果没有,我怎样才能让它更安全?

是的,我可以确认它是安全的,因为您完成了以下操作:

  • 代码中的纯文本秘密。
  • 您的秘密存储在强制加密和严格访问控制的专用秘密存储中。
  • 一切都在代码本身中定义。不需要额外的手动步骤或包装脚本。
  • 秘密管理器支持轮换秘密,这在秘密被泄露时很有用。

我唯一想知道的是使用像 s3 这样支持加密的 Terraform 后端,并避免将状态文件提交到您的源代码管理。

看起来不错,因为@asri 认为它是一个很好的安全实现。

暴露的风险将处于远程状态。秘密可能会以纯文本形式存储在那里。假设您使用的是 S3,请确保存储桶已加密。如果您与其他开发人员共享 tf 状态访问权限,他们可能可以访问远程状态文件中的这些值。

来自https://blog.gruntwork.io/a-comprehensive-guide-to-managing-secrets-in-your-terraform-code-1d586955ace1

These secrets will still end up in terraform.tfstate in plain text! This has been an open issue for more than 6 years now, with no clear plans for a first-class solution. There are some workarounds out there that can scrub secrets from your state files, but these are brittle and likely to break with each new Terraform release, so I don’t recommend them.

嗨,我正在做类似的事情,这里有一些想法:

  1. 当运行第二次使用 Terraform 时,秘密将以纯文本形式存储在 S3 中的状态文件中,S3 是否足够安全以存储这些敏感字符串?

  2. 我的工作使用类似的方法:运行 terraform 创建一个空的秘密/虚拟字符串作为占位符 -> 手动更新为真实凭证 -> 运行 Terraform 再次以告诉资源使用更新的凭据。问题是,当我们在生产中部署时,我们希望流程尽可能自动化,这种方法并不理想,但我还没有找到更好的方法。

如果大家有更好的想法欢迎在下方留言。