webapp 上的 Azure keyvault 访问策略而不是应用程序服务主体

Azure keyvault access policies on webapp instead of application service principal

我在 Azure WebApp 中托管了一个 WebApi。我已在 Azure AD 中创建应用程序注册。

WebApi 连接字符串存储在 Azure Keyvault 中。我不明白的是,在 Keyvault 访问策略中,我必须授予对 WebApp(获取和列出机密)的访问权限,而不是授予对在 Azure AD 中创建的 App Service Principal 的访问权限。 否则它将无法工作,WebApi 在尝试连接到 KeyVault 时将无法以 403 开头。

但通常应该将访问权限授予用户或服务主体,而不是 WebApp。这是正确的吗?

我相信你指的是 Managed Identities 如果是这种情况,那么最佳做法是通过服务主体授予对 Web 应用程序身份的访问权限,因为没有要交换的密码并且身份在应用程序的生命周期内存在。

幕后的托管身份使用指纹来识别应用程序的真实身份。

如果分配给 Azure Key Vault,则需要更新访问策略,并且可以通过 ARM 使用以下内容进行分配:

"objectId": "[reference(resourceId('Microsoft.Web/sites', INSERT APP SERVICE NAME), '2018-02-01', 'Full').identity.principalId]"

一个重要的提示是,如果通过相同的 ARM 模板创建应用程序服务和 Key Vault,则根据应用程序服务,Key Vault 将需要依赖项。不想为尚未创建的 ID 创建访问策略。

如果通过 ARM 分配托管身份和 RBAC 角色,这里是一种解决方案,它说明了将 Azure 内置贡献者角色的应用服务分配给特定存储帐户。在变量部分定义您的角色名称和 RoleID:

"Contributor": {
 "RoleID": "[concat(variables('roleDefinition'), 'b24988ac-6180-42a0-ab88 20f7382dd24c')]",
  "RoleName": "Contributor"
}

然后这将在 ARM 模板中分配:

{
  "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments",
  "apiVersion": "2018-09-01-preview",
  "name": "[concat(variables('storageName'), '/Microsoft.Authorization/',  guid(uniqueString(variables('storageName'),variables('Reader').RoleName,parameters('principalId'))))]",
  "properties": {
    "roleDefinitionId": "[variables('Contributor').RoleID]",
    "principalId": "[reference(resourceId('Microsoft.Web/sites', variables('webSiteName')), '2018-02-01', 'Full').identity.principalId]"
  }
}

如果building/assigning通过相同的 ARM 模板,请再次确保正确识别 dependsOn。

如果使用插槽,每个插槽都将拥有自己的托管标识,该标识将与插槽一起保留。因此,插槽 A 将始终作为插槽 A 提供访问权限,并且不会在插槽切换时交换。