就我而言,我试图隐藏通过输出打印的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插件
祝你好运!