Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terraform 如何对外部程序隐藏AWS凭据?_Terraform_Amazon Iam_Terraform Provider Aws - Fatal编程技术网

Terraform 如何对外部程序隐藏AWS凭据?

Terraform 如何对外部程序隐藏AWS凭据?,terraform,amazon-iam,terraform-provider-aws,Terraform,Amazon Iam,Terraform Provider Aws,在我的例子中,我试图隐藏通过输出打印的aws访问密钥和秘密访问密钥 我试图实现一个解决方案,但不幸的是,它在计划中打印凭证。因此,每当我将代码/提交推送到GITHUB时,我们都会在Jenkins中运行terraform,它会在GITHUB中抛出计划,在terraform计划中公开凭据 虽然我已经隐藏在输出中,但现在我正在计划中打印它,并在GitHub中公开它。我还尝试在输出中使用sensitive:true,这将很容易解决这个问题。但我的团队希望实施此解决方案:( read.sh #!/bin/

在我的例子中,我试图隐藏通过输出打印的aws访问密钥和秘密访问密钥

我试图实现一个解决方案,但不幸的是,它在计划中打印凭证。因此,每当我将代码/提交推送到GITHUB时,我们都会在Jenkins中运行terraform,它会在GITHUB中抛出计划,在terraform计划中公开凭据

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

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>
我想在计划中隐藏这些值
query.secret\u id:“XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/x”-->我想从计划中隐藏这些值
结果。%:
任何帮助!
提前感谢!

在您的场景中,如果您选择:
远程状态
方法,您将非常棒

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

设置是在AWS S3上创建一个bucket,除了将用于Terraform的用户之外,任何人都不应该可读写它

我添加的代码是

 terraform {
    backend "s3" {
      bucket = "my-new-bucket"
      key = "state/key"
      region = "eu-west-1"
    }
  }
这只是告诉Terraform使用S3作为后端提供程序,用于存储
tfstate
文件

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

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

以下是一些有用的文档:

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


祝你好运!

这里发生了几件事

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


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

您需要为凭据参数实现直接馈送到
提供程序的功能,例如Vault。凭据将无法在该位置显示“MattSchuchard,这是一个非常好的解决方案!但我们目前不想只为这个用例设置vault,还有其他方法吗?您可以编写自己的提供程序,在本地读取凭据。
 terraform {
    backend "s3" {
      bucket = "my-new-bucket"
      key = "state/key"
      region = "eu-west-1"
    }
  }