我如何确保我的秘密检索是安全的?
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 状态访问权限,他们可能可以访问远程状态文件中的这些值。
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.
嗨,我正在做类似的事情,这里有一些想法:
当运行第二次使用 Terraform 时,秘密将以纯文本形式存储在 S3 中的状态文件中,S3 是否足够安全以存储这些敏感字符串?
我的工作使用类似的方法:运行 terraform 创建一个空的秘密/虚拟字符串作为占位符 -> 手动更新为真实凭证 -> 运行 Terraform 再次以告诉资源使用更新的凭据。问题是,当我们在生产中部署时,我们希望流程尽可能自动化,这种方法并不理想,但我还没有找到更好的方法。
如果大家有更好的想法欢迎在下方留言。
目前我正在使用 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 状态访问权限,他们可能可以访问远程状态文件中的这些值。
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.
嗨,我正在做类似的事情,这里有一些想法:
当运行第二次使用 Terraform 时,秘密将以纯文本形式存储在 S3 中的状态文件中,S3 是否足够安全以存储这些敏感字符串?
我的工作使用类似的方法:运行 terraform 创建一个空的秘密/虚拟字符串作为占位符 -> 手动更新为真实凭证 -> 运行 Terraform 再次以告诉资源使用更新的凭据。问题是,当我们在生产中部署时,我们希望流程尽可能自动化,这种方法并不理想,但我还没有找到更好的方法。
如果大家有更好的想法欢迎在下方留言。