如何为App Service授予从Key Vault链接SSL证书的必要权限?
问题描述
通过Bicep模板创建App Service时,尝试链接同一资源组内启用了Azure RBAC的Key Vault中的SSL证书,使用以下代码部署失败:
resource certEncryption 'Microsoft.Web/certificates@2018-02-01' = { name: '${resourcePrefix}-cert-encryption' location: location properties: { keyVaultId: resourceId('myResourceGroup', 'Microsoft.KeyVault/vaults', keyVaultName) keyVaultSecretName: '${resourcePrefix}-cert-encryption' serverFarmId: hostingPlan.id password: 'SecretPassword' } dependsOn: [ webApi ] }
报错信息:
The service does not have access to '/subscriptions/3449f-xxxx/resourcegroups/rgabptrialt/providers/microsoft.keyvault/vaults/my-test-vault' Key Vault. Please make sure that you have granted necessary permissions to the service to perform the request operation.
需明确:要授予哪些具体权限、授予对象是谁、配置方式,以及是否需要为App Service创建托管标识。
解决方案
1. 必须创建App Service系统托管标识
由于Key Vault启用了Azure RBAC,必须通过托管标识授予权限,无法使用传统访问策略。在Bicep中为App Service添加系统托管标识:
resource webApi 'Microsoft.Web/sites@2022-09-01' = { name: '${resourcePrefix}-webapi' location: location identity: { type: 'SystemAssigned' } // 其余App Service配置项... }
2. 分配Key Vault权限
需为App Service的系统托管标识分配Key Vault Secrets User内置角色(该角色包含读取密钥/证书的必要权限),也可根据最小权限原则创建自定义角色。
在Bicep中添加角色分配:
resource keyVaultSecretUserRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(keyVault.id, webApi.id, 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') scope: keyVault properties: { principalId: webApi.identity.principalId roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') // Key Vault Secrets User角色ID principalType: 'ServicePrincipal' } dependsOn: [ webApi keyVault ] }
3. 调整证书资源配置
移除password字段(Key Vault中存储的PFX证书密码已包含在密钥内,无需单独指定),并确保依赖顺序正确:
resource certEncryption 'Microsoft.Web/certificates@2022-09-01' = { name: '${resourcePrefix}-cert-encryption' location: location properties: { keyVaultId: keyVault.id keyVaultSecretName: '${resourcePrefix}-cert-encryption' serverFarmId: hostingPlan.id } dependsOn: [ webApi keyVaultSecretUserRoleAssignment // 确保权限分配完成后再创建证书 ] }
关键要点
- 授予对象:App Service的系统托管标识(而非App Service实例或部署用户)。
- 必要权限:读取Key Vault中的证书/密钥,
Key Vault Secrets User内置角色足以满足需求;如需最小权限,可创建仅包含Microsoft.KeyVault/vaults/secrets/get和Microsoft.KeyVault/vaults/secrets/list权限的自定义角色。 - API版本建议:使用较新的API版本(如2022-09-01),避免旧版本兼容性问题。
内容的提问来源于stack exchange,提问作者Vivendi
相关产品推荐
相关产品推荐

