使用Terraform配置Azure Key Vault密钥时出现403权限错误如何解决
问题根因
你遇到的403报错和策略不生效问题有三个核心原因:
- 运行
terraform apply的账号/服务主体权限不足:你在Key Vault内嵌访问策略中,给当前执行身份配置的密钥权限只有get,但创建azurerm_key_vault_key资源要求执行身份拥有create权限,报错信息里提到的无权限主体就是你执行terraform的身份。 - 访问策略配置冲突:你同时使用了
azurerm_key_vault内嵌的access_policy块、以及独立的azurerm_key_vault_access_policy资源两种配置方式。内嵌块的优先级更高,每次apply都会将Key Vault的访问策略重置为内嵌块定义的内容,你后续单独配置的存储、网站访问策略都会被覆盖,这是存储策略不生效的核心原因。 - 缺少存储客户管理密钥的强制配置: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
相关产品推荐
相关产品推荐

