首页 > 解决方案 > 与 CI 或 docker 中的 terraform 一起使用时,Azure 服务主体数据的存储位置

问题描述

我正在阅读所有关于在 CI 或 docker 文件或其他任何文件中使用带有客户端密码的服务主体的 terraform 文档,我引用:

我们建议在以非交互方式运行 Terraform 时(例如在 CI 服务器中运行 Terraform 时)使用服务主体或托管服务标识,并在本地运行 Terraform 时使用 Azure CLI 进行身份验证。

然后详细介绍了如何创建服务主体,最后给出了一个糟糕的示例,其中客户端 ID 和客户端密码通过将它们存储在环境变量中来硬编码在文件中:

export ARM_CLIENT_ID="00000000-0000-0000-0000-000000000000"
export ARM_CLIENT_SECRET="00000000-0000-0000-0000-000000000000"
export ARM_SUBSCRIPTION_ID="00000000-0000-0000-0000-000000000000"
export ARM_TENANT_ID="00000000-0000-0000-0000-000000000000"

或在 terraform 提供程序块中:

provider "azurerm" {
  # Whilst version is optional, we /strongly recommend/ using it to pin the version of the Provider being used
  version = "=1.43.0"

  subscription_id = "00000000-0000-0000-0000-000000000000"
  client_id       = "00000000-0000-0000-0000-000000000000"
  client_secret   = "${var.client_secret}"
  tenant_id       = "00000000-0000-0000-0000-000000000000"
}

它确实放了一个漂亮的黄色框,说不要这样做,但没有建议做什么。

我不认为client_secret在环境变量中是一个特别好的主意。

我应该使用客户端证书吗?如果是,同样的问题会出现在哪里保存配置。

如果可能,我想避免使用 azure-cli。

Azure-cli 无论如何都不会返回客户端密码。

如何将这些秘密放入环境变量中?我应该将它们放入保险库还是有其他方法?

标签: azuredockerterraform

解决方案


对于您的要求,我想您对如何从四种方式中选择一种合适的方式感到有些困惑。

您可以看到托管服务标识仅适用于具有托管服务标识功能的服务。所以docker不能使用它。您还需要为其分配适当的权限作为服务主体。如果可能,您不想使用 Azure CLI,我不知道为什么,但我们先跳过它。

我认为服务主体是一个好方法。它建议您不要将秘密放入 Terraform 文件中的变量中。所以只能使用环境变量。如果您也不想设置环境变量,那么我认为没有办法使用服务主体。服务主体的证书只需要设置证书路径多于另一个。

服务主体需要注意。创建完成后,您只能看到一次服务主体的秘密,然后它就不会再显示了。如果忘记了,只能重置密码。

所以我认为服务主体是最适合你的方式。--env您可以使用命令的参数设置环境变量docker run。或者只是将它们设置在 Dockerfile 中ENV。秘钥存储在密钥库中的方法,我想你可以在我之前的回答中得到答案。


推荐阅读