【问题标题】:Can Terraform mask variables in the console output?Terraform 可以在控制台输出中屏蔽变量吗?
【发布时间】:2019-05-19 03:59:21
【问题描述】:

我想将此作为功能请求发布,但我想看看是否有其他人在我发布之前找到了一些聪明的方法。或者也许 Hashicorp 的某个人可以告诉我这将是即将推出的功能

在运行terraform apply/show 时,我一直在寻找一些从控制台屏蔽变量的方法。在将变量传递给脚本时,最好尝试使用 local-exec 配置程序来屏蔽变量。

一个名为 Terrahelp 的工具是我能找到的唯一可以执行此操作的工具,但它仅适用于不允许插值的 tfvars 文件中的变量。这无济于事,因为我们正在尝试使用 Vault 将机密信息排除在 terraform 文件之外。

Current Versions
Terraform v0.11.7
provider.null v1.0.0
provider.template v1.0.0
provider.vault v1.3.1
provider.vsphere v1.8.1

用例

provisioner "local-exec" {
    command = "&'${path.module}\\scripts\\script.ps1' -name ${var.node_name} -pass '${var.pass}' -user ${var.user} -server ${var.server}"
    interpreter = ["Powershell", "-Command"]
  }  

尝试的解决方案 我正在使用 Vault 将机密信息排除在 Terraform 文件之外,因此我正在使用 Vault 提供程序并从中调用数据。我尝试创建一个模块并使用 sensitive = true 值输出机密,然后调用该模块以使用机密,但仍显示在控制台中。

提案

允许某种敏感值,就像输出到 Terraform 中的变量一样。因此,如果在控制台中调用上述脚本,它们将不会显示敏感的变量信息。

参考资料 https://github.com/hashicorp/terraform/issues/16114 https://github.com/hashicorp/terraform/issues/16643

【问题讨论】:

  • 你试过资源aws_ssm_parameter和它的输出了吗,它已经被标记了(value: <sensitive>),也许你可以从中得到一些提示。
  • 如果您使用保险柜,您可以配置一次性密码。那么它们是否在日志中并不重要,因为一旦使用(或过期)它们就不是有效的密码。

标签: terraform hashicorp-vault


【解决方案1】:

Terraform 13 自提出此问题以来已发布,并允许将变量标记为 sensitive 并且不显示在控制台中。

https://www.terraform.io/docs/configuration/outputs.html#sensitive-suppressing-values-in-cli-output

【讨论】:

  • 我们可以将此标记为已接受的答案吗?
【解决方案2】:

我不能完全确定这是否是您的用例,但我们对敏感变量使用的一种策略是利用默认的 Terraform 行为来使用 environment variables to set TF variables,例如,

variable "sensitive_variable" {
  type = "string"
}
sensitive_var=$(curl url/with/remote/value)
export TF_VAR_sensitive_variable=$sensitive_var
terraform apply

【讨论】:

    【解决方案3】:

    这是自我广告,但我创建了一个名为 terramask 的工具,它适用于 Terraform 0.12。

    欢迎Issues ?

    【讨论】:

      【解决方案4】:

      我认为https://github.com/cloudposse/tfmask 可能是您正在寻找的:

      用于屏蔽转换计划或地形应用的敏感输出的命令行实用程序。

      您首先设置一个环境变量来过滤屏蔽键(诚然,这里涉及一些手动工作):

      export TFMASK_VALUES_REGEX="(?i)^.*(secret|password|oauth|token|key).*$"
      

      然后通过tfmask 传递 terraform 命令,导致输出被屏蔽:

      terraform plan | tfmask
      

      【讨论】:

        【解决方案5】:

        以下是我为一些本地服务执行此操作的方法:

        1 - var.password 实际上并不存储密码。相反,它存储环境变量的名称。

        2 - 我的脚本从这些环境变量中获取密码。

        3 - 我有一个小程序可以将秘密加载到环境中并为terraform apply 清除它们。

        所以最后我只是绕过 Terraform 来获取脚本使用的秘密。不理想,但我也找不到更好的解决方案。

        【讨论】:

          【解决方案6】:

          感谢您的反馈,密码不能设置为一次性使用,因为其中一些是 AD 中的服务帐户,执行这些应用程序无法处理不断更改密码的其他事情。

          我们确实通过另一种产品 Azure/Azure DevOps 找到了解决方案。我们将凭据存储在 Azure DevOps 可以访问的密钥保管库中,并使用 Azure DevOps 管道将 terraform 代码发送到我们的构建服务器。 Azure DevOps 似乎充当了一个外壳,可以隐藏控制台的所有秘密,并且运行良好。我会将它推荐给任何希望从 terraform 文件/命令行中隐藏秘密的人。

          【讨论】:

            猜你喜欢
            • 2018-11-19
            • 2022-01-08
            • 2016-02-15
            • 2018-05-19
            • 2022-07-02
            • 2011-12-29
            • 2021-03-26
            • 2011-04-09
            • 2012-12-04
            相关资源
            最近更新 更多