Terraform - 尝试使用服务主体在 Azure 中创建资源并从 keyvault 中提取该 SP 密钥

Posted

技术标签:

【中文标题】Terraform - 尝试使用服务主体在 Azure 中创建资源并从 keyvault 中提取该 SP 密钥【英文标题】:Terraform - Trying to create resources in Azure with service principal and pulling that SPs key from keyvault 【发布时间】:2021-06-03 16:05:37 【问题描述】:

在过去一周左右的时间里,我一直在学习使用 Terraform 来管理 Azure 中的资源。 很棒的工具。 我发现使用 AZ 用户帐户和服务主体之间存在区别。

目标是使用指定的服务主体在 Azure 中创建资源,并引用存储在 AZ 密钥保管库中的机密。远离本地存储的秘密(文件、环境变量等)。

只要我的 azurerm 提供程序包含 subid、clientid、clientsecret 和tenantid,我就可以使用经过身份验证的服务主体成功创建资源,效果很好。

当我将服务主体机密作为 var sp_secret 存储在 variables.tf 中(甚至作为 env var)时的工作示例:

provider "azurerm" 
 version = "=2.48.0"
 features  
  subscription_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  client_id       = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  client_secret   = "$var.sp_secret"
  tenant_id       = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

我已经能够成功地从 keyvault 中提取服务主体机密并“输出”它,但我想做的是从 kv 中提取该机密并使用,例如作为提供程序 client_secret 值中的 var。前任。 'client_secret = "$link to secret 坐在 kv"'

这是我从 keyvault 中检索 SP 机密并将其输出的操作:

data "azurerm_client_config" "current" 

variable "keyvault_name" 
  default = "blah-kv"


variable "kvrg_name" 
  default = "blah-kv-rg"


data "azurerm_key_vault" "keyvault" 
  name                = "$var.keyvault_name"
  resource_group_name = "$var.kvrg_name"


data "azurerm_key_vault_secret" "kv-sp" 
  name         = "blah-tf-sp-secret"
  key_vault_id = "$data.azurerm_key_vault.keyvault.id"


output "secret_value" 
  value = "$data.azurerm_key_vault_secret.kv-sp.value"

如前所述,上面的 sn-p 成功检索并输出了 secret。我只想在 azurerm 提供程序参考中将该机密设置为 client_secret 值,而不是输出机密。

我尝试了许多 client_secret = "$data.azurerm_key_vault_secret.kv-sp.value" 的变体,但出现以下错误:

Error: Cycle: data.azurerm_key_vault.keyvault, provider["registry.terraform.io/hashicorp/azurerm"], data.azurerm_key_vault_secret.kv-sp

我将上述错误解释为循环引用。我已经尝试了一些我在寻找答案时发现的东西,但没有骰子。

感谢任何指导。 谢谢!

【问题讨论】:

关于这个问题的任何更新?它解决了你的问题吗?如果它适合你,请接受它。 【参考方案1】:

据我所知。不可能达到你的期望。当您使用 Terraform 管理 Azure 资源时,您需要拥有一个具有足够权限的 Azure 帐户或服务主体。如果使用服务原则,则意味着您需要在运行 Terraform 代码之前为提供程序azurerm 配置客户端 ID 和客户端密码。但是当您将机密存储在 Azure Key Vault 中时,您需要运行代码,然后才能获取机密。导致循环依赖。

【讨论】:

以上是关于Terraform - 尝试使用服务主体在 Azure 中创建资源并从 keyvault 中提取该 SP 密钥的主要内容,如果未能解决你的问题,请参考以下文章

Azure API 无法识别来自 Terraform 的服务主体

无法使用服务主体从发布管道访问 Azure Devops Git 存储库

服务主体如何登录到我的 Azure 应用服务?

Terraform 学习总结—— 简单记录 Azure CN 上 Terraform Provider 配置的一个坑

Terraform for_each - each.key 在哪里定义?

Terraform aws - 无法使用 terraform 脚本创建 AWS SFTP 服务器