azure - 与 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 无论如何都不会返回客户端密码。
如何将这些秘密放入环境变量中?我应该将它们放入保险库还是有其他方法?
解决方案
对于您的要求,我想您对如何从四种方式中选择一种合适的方式感到有些困惑。
您可以看到托管服务标识仅适用于具有托管服务标识功能的服务。所以docker不能使用它。您还需要为其分配适当的权限作为服务主体。如果可能,您不想使用 Azure CLI,我不知道为什么,但我们先跳过它。
我认为服务主体是一个好方法。它建议您不要将秘密放入 Terraform 文件中的变量中。所以只能使用环境变量。如果您也不想设置环境变量,那么我认为没有办法使用服务主体。服务主体的证书只需要设置证书路径多于另一个。
服务主体需要注意。创建完成后,您只能看到一次服务主体的秘密,然后它就不会再显示了。如果忘记了,只能重置密码。
所以我认为服务主体是最适合你的方式。--env
您可以使用命令的参数设置环境变量docker run
。或者只是将它们设置在 Dockerfile 中ENV
。秘钥存储在密钥库中的方法,我想你可以在我之前的回答中得到答案。
推荐阅读
- tensorflow - 无法在 Ubuntu 16.04 中配置 tensorflow 以使用 GPU 加速
- arrays - 如何返回提供的数组中包含单个项目的所有项目的数组
- php - 限制 jpg 和 pdf 上传的文件大小
- reactjs - 为什么 req.query 总是空的?
- html - 为什么悬停在 flex 或 grid 中不起作用?
- python - 无法在 Docker alpine 映像中安装 Psycopg2
- kotlin - 微调器和切换按钮的中性状态
- python - 在 Anaconda 终端中找不到模块错误
- c - 如何在字符串中的每个单词后添加一个字符?
- r - 如何让 str_replace (和其他 stringr )函数忽略正则表达式(从字面上处理字符串)?