【问题标题】:Azure keyvault access policies on webapp instead of application service principalWebapp 而不是应用程序服务主体上的 Azure keyvault 访问策略
【发布时间】:2020-06-29 19:40:03
【问题描述】:

我有一个托管在 Azure WebApp 中的 WebApi。我在 Azure AD 中创建了一个应用注册。

WebApi 连接字符串存储在 Azure Keyvault 中。我不明白的是,在 Keyvault 访问策略中,我必须授予对 WebApp(获取和列出机密)的访问权限,而不是授予对在 Azure AD 中创建的应用服务主体的访问权限。 否则将无法正常工作,WebApi 在尝试连接到 KeyVault 时将无法以 403 启动。

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

【问题讨论】:

    标签: azure azure-active-directory azure-web-app-service azure-keyvault


    【解决方案1】:

    我相信您指的是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 上将需要一个 dependsOn。不想为尚未创建的 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]"
      }
    }
    

    如果通过相同的 ARM 模板构建/分配,请再次确保正确识别 dependsOn。

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

    【讨论】:

    • 是的,你是对的,我使用托管身份。那么只有一个问题:您说身份在应用程序的整个生命周期内都存在。但是,如果我删除该应用程序并再次重新部署它,它仍然可以工作吗?我的意思是 objectId 在第二次部署后可能会有所不同,它应该会中断,对吧?
    • 它仍然可以工作。我发现的唯一例外是 SQL Server。如果为帐户提供了 SQL 访问权限,则需要将其从 SQL Server/数据库中删除并重新加载。这与 SQL Server 记录 AD 对象指纹的方式有关。
    • 奇怪。我只是试图删除我的 webapp 并再次部署它。托管标识已删除,我的 web 应用程序无法再访问 keyvault。文档确认了这一点:系统分配的身份与您的应用程序相关联,如果您的应用程序被删除,系统分配的身份也会被删除。一个应用程序只能有一个系统分配的标识。我应该使用用户分配的身份并将其设置在我的 ARM 模板中吗?
    • 它是否列在您的 Key Vault 访问策略中?如果您删除了该对象,它将从所有内容中删除。
    • 是的,它已列出,但在我删除该应用程序后,它已从 keyvault 策略中删除。这就是我在上面的问题中的意思。删除 web 应用后,托管标识将在其被引用的地方不再起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2021-11-11
    • 1970-01-01
    • 2021-08-15
    • 2017-08-08
    • 2019-10-13
    相关资源
    最近更新 更多