【问题标题】:Hiding a secret in Terraform for Azure with a caveat使用警告在 Terraform for Azure 中隐藏一个秘密
【发布时间】:2020-02-01 21:09:30
【问题描述】:

所以我试图在 Terraform 中找到隐藏秘密的方法。需要注意的是,秘密是用于连接到我们的 Key Vault 的服务主体。我无法将机密存储在 Key Vault 中,因为此时它尚未连接到 Key Vault。这是我的主要 tf 文件的一部分。

provider "azurerm" {
  alias           = "kv_prod"
  version         = "1.28"
  tenant_id       = "<tenant id>"
  subscription_id = "<sub id>"
  client_id       = "<SP client id>"
  client_secret   = "<SP secret>"
}

这在我的模块中进一步用于存储存储帐户密钥和其他机密。它只是碰巧在不是每个人都可以访问的 Prod 订阅中。

有没有人遇到过这样的事情?如果是这样,您将如何保护该秘密?

【问题讨论】:

  • 您是否将 Terraform 脚本作为持续部署的一部分运行?如果是这样,您使用的是什么工具/平台,是否类似于 Azure DevOps。大多数持续部署工具都会有一些机制来安全地存储这样的秘密,然后在部署管道运行时将其作为变量注入。因此,密钥值的秘密在运行时使用,但您的 IaC 源代码或 Terraform 状态中没有它。
  • 很遗憾没有。我们没有使用任何部署工具。 TF 由使用该模块的开发人员手动运行。因此开发人员拉下变量文件,以便他们可以设置变量。他们制定自己的计划并申请。

标签: azure terraform azure-keyvault terraform-provider-azure


【解决方案1】:

@maltman 有几种方法可以在 terraform 中隐藏秘密。这是一个讨论它们的博客:

https://www.linode.com/docs/applications/configuration-management/secrets-management-with-terraform/

但是,如果您只关心在从 git 签入和签出时加密机密文件,您可以使用类似 git-crypt

您必须创建几个文件:

variables.tf -> 在此处定义变量

variable "client_secret" {
  description = "Client Secret"
}

terraform.tfvars -> 在这里给出变量的值

client_secret = 'your-secret-value'

现在在签入 git 时使用 git-crypt 加密 terraform.tfvars

【讨论】:

  • 是的,这就是我现在正在研究的。所以我的用户有他们存储变量的 TF 文件。我想这相当于 tfvars 文件。我不能在那里存储秘密值。我应该将它存储在主模块 TF 文件中的代码中吗?
  • tfvars 文件具有 variables.tf 文件中存在的变量的值。您应该像这样使用 main.tf 文件中的变量:client_secret = var.client_secret。您应该加密 tfvars 文件,以便 Git 上的每个人都看不到这个秘密。或者,您可以在主代码中包含秘密,但这不是一个好习惯。如博客中所述,您可以拥有多个 tfvars 文件。一个 tfvars 文件可以保存所有秘密。
  • 不错。会试一试的。
  • 我正在尝试找出一种方法来执行此操作,该方法在运行应用程序时不需要传递给命令行的任何其他内容。我无法在流程中添加任何内容,因为这对我的一些用户来说已经太难了(我知道,但你能做什么)。我正在考虑只添加一个单独的文件,该文件不必与 apply 一起传递,也许可以使用它。仍在测试中。
【解决方案2】:

根据您的要求,我认为有两种比较安全的方法适合您。

一个是将凭证存储为环境变量,这样您就不会在 tf 文件中暴露秘密。这是example

另一种是你可以使用 Azure CLI 的凭据登录,然后只需要设置订阅而不暴露 tf 文件中的秘密。这是example

以上两种方式是我认为对你来说是安全和可行的。希望对你有帮助。

【讨论】:

  • 谢谢查尔斯。我会尝试它们。
  • @maltman 祝你好运,我还在等你的好消息。
  • 所以只是在看这两个选项。两者都不起作用,因为我需要配置一些东西来设置环境变量或使用 CLI。就我而言,这可能是powershell。然后我可以将脚本存储在存储帐户中,但我会加密 SA 访问密钥,我需要将其存储在我无法访问的 Key Vault 中,因为我要保护的值是 Key Vault秘密。
  • 我想我需要一些可以加密秘密的东西,这样在插入 GitHub 和签出时就不会看到它。
  • @maltman 我认为不可能加密我所知道的秘密。在连接到 Azure 之前,您也无法访问密钥保管库。
【解决方案3】:

Terraform 没有这个功能,但是通过第三方集成可以实现。

  • 在 Terraform 中存储秘密:

    Terraform 有一个external 数据资源,可用于运行外部程序并进一步使用返回值。我已经使用 Ansible 保险库功能来加密和解密机密,并将其加密存储在存储库中,而不是以明文形式存储。

    data "external" "mysecret" {
     program = ["bash", "-c", "${path.module}/get_ansible_secret.sh"]
    
     query = {      
         var                 = "${var.secret_value}"
         vault_password_file = "${path.module}/vault-password.sh"
         # The file containing the secret we want to decrypt
         file = "${var.encrypted_file}"
     }
    }
    

参考工作示例:github example

【讨论】:

  • 感谢马哈塔姆。我们刚刚购买了 Terraform Enterprise,所以我想一旦我们完成所有设置,我将使用它在运行时提取秘密。
【解决方案4】:

将创建一个 ADO 管道来处理此问题,而不是在代码不必可用的情况下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2013-10-18
    • 2021-04-02
    • 1970-01-01
    相关资源
    最近更新 更多