使用警告隐藏 Terraform for Azure 中的秘密

Hiding a secret in Terraform for Azure with a caveat

所以我正试图找到在 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 订阅中,并非每个人都可以访问。

有人 运行 喜欢这样的东西吗?如果是这样,您将如何保护这个秘密?

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

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

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

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

@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-crypt加密terraform.tfvars,同时签入git

打算创建一个 ADO 管道来处理这个问题,而不是在代码不需要可用的地方。

Terraform 没有此功能,但通过使用第三方集成可以实现。

  • 在 Terraform 中存储秘密:

    Terraform 有一个 external 数据资源,可用于 运行 外部程序并进一步使用 return 值。我已经使用 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