如何从外部程序中隐藏 AWS 凭证?



就我而言,我试图隐藏通过输出打印的aws访问密钥和秘密访问密钥。

我试图实施一个解决方案,但不幸的是它在计划中打印了凭据。因此,每当我将代码/提交推送到 GITHUB 时,我们都会在 Jenkins 中运行 terraform,它会在 GITHUB 中吐出计划,从而暴露 terraform 计划中的权限。

虽然我已经隐藏在输出中,但现在我正在计划中打印它并在 GitHub 中公开。我还尝试在输出中使用sensitive:true,这将轻松解决此问题。但我的团队希望:(实施此解决方案

resource "aws_iam_access_key" "key" {
user = "${aws_iam_user.user.name}"
}
resource "null_resource" "access_key_shell" {
triggers = {
aws_user = "${aws_iam_user.user.name}" // triggering an alert on the user, since if we pass aws_iam_access_key, access key is visible in plan.
}
}
data "external" "stdout" {
depends_on = ["null_resource.access_key_shell"]
program    = ["sh", "${path.module}/read.sh"]
query {
access_id = "${aws_iam_access_key.key.id}"
secret_id = "${aws_iam_access_key.key.secret}"
}
}
resource "null_resource" "contents_access" {
triggers = {
stdout = "${lookup(data.external.logstash_stdout.result, "access_key")}"
value  = "${aws_iam_access_key.key.id}"
}
}
output "aws_iam_podcast_logstash_access_key" {
value = "${chomp(null_resource.contents_access.triggers["stdout"])}"
}

read.sh

#!/bin/bash
set -eux
echo {"access_key":"$(aws kms encrypt --key-id alias/amp_key --plaintext ${access_id}  --output text --query CiphertextBlob)", > sample.json && echo "secret_key": "$(aws kms encrypt --key-id alias/amp_key --plaintext ${secret_id} --output text --query CiphertextBlob)"} >> sample.json
cat sample.json | jq -r '.access_key'
cat sample.json | jq -r '.secret_key'

我的地形规划 :

<= data.external.stdout
id:                <computed>
program.#:         "2"
program.0:         "sh"
program.1:         "/Users/xxxx/projects/tf_iam_stage/read.sh"
query.%:           "2"
query.access_id:   "xxxxxxxx"  ----> I want to hide these values from the plan
query.secret_id:   "xxxxxxxxxxxxxxxxxxxxxx/x" ----> I want to hide these values from the plan
result.%:          <computed>

任何帮助 ! 提前感谢!

这里有几件事。

首先,您正在泄露凭据,因为您将.tfstate存储在 GitHub 中。这个有一个简单的解决方案。首先,将*.tfstate添加到您的.gitignore,然后设置远程后端,如果您使用 S3,则签出策略和 ACL 以防止公有访问。

其次,您的另一个问题是您在运行时获取凭据,并且在运行时,除非您添加敏感标志,否则 Terraform 会显示所有内容。所以,基本上如果你想遵循这种方法,无论你的团队说什么,你都被迫使用sensitive: true。但是,为什么要以这种方式获取凭据?为什么不添加具有这些凭据的新提供程序,为此提供程序设置别名,并将其用于这些密钥所在的资源?

在你的场景中,如果你愿意,你会很棒:Remote State方法。

Remote State允许 Terraform 将状态存储在远程存储中。Terraform 支持在 Terraform Enterprise、Consul、S3 等位置存储状态。

设置是在 AWS S3 上创建一个存储桶,除了将用于 Terraform 的用户之外,任何人都不应读取或写入该存储桶。

我添加的代码是;

terraform {
backend "s3" {
bucket = "my-new-bucket"
key = "state/key"
region = "eu-west-1"
}
}

这只是告诉 Terraform 使用 S3 作为后端提供程序来执行存储tfstate文件等操作。

不要忘记运行terraform init因为这是一项要求,Terraform 会注意到您从本地存储更改为存储在 S3 中。

完成后,您可以安全地删除本地tfstate文件,因为您知道您的详细信息已安全地存储在 S3 上。

以下是一些有用的文档:单击文档

第二种方法是使用Terraformplugin更多信息:Terraform插件

祝你好运!

相关内容

  • 没有找到相关文章

最新更新