You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Terraform配置Azure Key Vault密钥时出现403权限错误如何解决

问题根因

你遇到的403报错和策略不生效问题有三个核心原因:

  1. 运行terraform apply的账号/服务主体权限不足:你在Key Vault内嵌访问策略中,给当前执行身份配置的密钥权限只有get,但创建azurerm_key_vault_key资源要求执行身份拥有create权限,报错信息里提到的无权限主体就是你执行terraform的身份。
  2. 访问策略配置冲突:你同时使用了azurerm_key_vault内嵌的access_policy块、以及独立的azurerm_key_vault_access_policy资源两种配置方式。内嵌块的优先级更高,每次apply都会将Key Vault的访问策略重置为内嵌块定义的内容,你后续单独配置的存储、网站访问策略都会被覆盖,这是存储策略不生效的核心原因。
  3. 缺少存储客户管理密钥的强制配置:Azure要求存储使用Key Vault托管密钥时,Key Vault必须开启软删除和清除保护,你的Key Vault配置中缺少这两个参数。另外你给存储身份配置访问策略时多加了不必要的application_id参数,会导致身份匹配异常。

修复方案

1. 重构Key Vault配置,移除内嵌访问策略

删除azurerm_key_vault块内的access_policy配置,新增独立的访问策略资源给terraform执行身份,同时补充软删除、清除保护配置:

resource "azurerm_key_vault" "nscsecrets" {
  name                       = "${var.key_vault_name}-${random_string.myrandom.id}"
  resource_group_name        = azurerm_resource_group.Classroom_In_The_Cloud_Terraform.name
  location                   = azurerm_resource_group.Classroom_In_The_Cloud_Terraform.location
  sku_name                   = "standard"
  tenant_id                  = data.azurerm_client_config.current.tenant_id
  # 新增存储CMK要求的软删除和清除保护配置
  soft_delete_retention_days = 7
  purge_protection_enabled   = true
}

# 原内嵌访问策略改为独立资源,补充密钥创建权限
resource "azurerm_key_vault_access_policy" "terraform_executor" {
  key_vault_id        = azurerm_key_vault.nscsecrets.id
  tenant_id           = data.azurerm_client_config.current.tenant_id
  object_id           = data.azurerm_client_config.current.object_id
  application_id      = data.azurerm_client_config.current.client_id
  secret_permissions  = ["delete", "get", "set"]
  # 补充create等密钥操作权限
  key_permissions     = ["get", "create", "delete", "list"]
  storage_permissions = ["delete", "get", "set"]
}

2. 修复存储身份访问策略

删除website_logs_storage_accesspolicy块内多余的application_id参数:

resource "azurerm_key_vault_access_policy" "website_logs_storage_accesspolicy" {
  key_vault_id       = azurerm_key_vault.nscsecrets.id
  tenant_id          = azurerm_storage_account.website_log_storage.identity[0].tenant_id
  object_id          = azurerm_storage_account.website_log_storage.identity[0].principal_id
  # 删除多余的application_id配置
  key_permissions    = ["get", "create", "delete", "list", "restore", "recover", "unwrapkey", "wrapkey", "purge", "encrypt", "decrypt", "sign", "verify"]
  secret_permissions = ["get"]
}

3. 补充存储客户管理密钥的版本参数

给azurerm_storage_account_customer_managed_key补充密钥版本配置,避免版本匹配错误:

resource "azurerm_storage_account_customer_managed_key" "website_log_key" {
  storage_account_id = azurerm_storage_account.website_log_storage.id
  key_vault_id       = azurerm_key_vault.nscsecrets.id
  key_name           = azurerm_key_vault_key.website_logs_key.name
  # 新增密钥版本配置
  key_version        = azurerm_key_vault_key.website_logs_key.version
}

4. 执行更新

如果之前已经部署过Key Vault,先执行terraform state show azurerm_key_vault.nscsecrets确认资源状态,再执行terraform apply即可。修改后所有访问策略都是独立资源,不会互相覆盖,完全符合你保留单独策略块的要求。

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:54:03