【问题标题】:How to get a reference to an Azure MSI for an app service?如何获取对应用服务的 Azure MSI 的引用?
【发布时间】:2018-03-02 23:53:37
【问题描述】:

我一直在测试最近发布的 Azure 托管服务标识 (MSI),并使用此处文档中描述的 ARM 模板方法为我们的应用服务成功创建了一个 MSI:How to use Azure Managed Service Identity (public preview) in App Service and Azure Functions

但是,我想授予托管标识对其他资源(例如密钥保管库)的访问权限。我已经能够通过门户做到这一点,但需要能够在 PowerShell 中编写脚本,以便与我们的持续部署构建集成。

我已通过执行 Set-AzureRmKeyVaultAccessPolicy cmdlet 使用 PowerShell 成功创建了访问权限。但是,我只能使用硬编码的对象 ID 来执行此操作,在创建 MSI 后从门户手动复制和粘贴。

我的问题是,如何在 PowerShell 中获取对 MSI 对象 ID 的引用,以便我可以授予对其他资源的访问权限?我能找到的唯一示例(例如this one)仅指虚拟机而不是应用服务。

【问题讨论】:

    标签: powershell azure azure-managed-identity


    【解决方案1】:

    你可以使用Get-AzureADServicePrincipal。

    $web=Get-AzureADServicePrincipal -SearchString "<name>"
    $web.ObjectId
    

    默认情况下,该名称是您的网络应用名称。

    更新:

    对于 OP 的场景,我们可以使用 template 来获取对 Azure MSI 的引用。

    【讨论】:

    • 感谢您的回答沃尔特!我怀疑您的答案是正确的,但不幸的是实际上无法验证它是否有效,因为执行 PowerShell 脚本的服务主体没有搜索图形 API 的权限。然而,我确实发现我能够在我的 ARM 部署脚本中引用 MSI 身份,以便在部署时授予他们对 Key Vault 的权限,这完全不需要我使用 PowerShell 来完成这个特定任务。
    • 对于寻找有关授予 MSI 访问密钥保管库的信息的其他人,我在此示例应用程序的部署脚本中找到了我的解决方案...github.com/Azure-Samples/app-service-msi-keyvault-dotnet/blob/…
    【解决方案2】:

    如果您想使用 Azure RM PowerShell Commandlets,您可以使用:

    $(Get-AzureRmADServicePrincipal -SearchString $Name | where {$_.DisplayName -eq $Name}).Id
    

    where 部分是为了确保您拥有特定的 SP 而不是多个结果开始具有相同的名称。

    编辑: 即使上面的内容也可能导致多个值。一个更好的解决方案是像这样进一步过滤:

    Get-AzureRmADServicePrincipal -SearchString $Name | where {($_.DisplayName -eq $Name) -and ($_.ServicePrincipalNames -match "https://identity.azure.net")}
    

    【讨论】:

      【解决方案3】:

      因为您使用 ARM 部署了资源,所以我想添加这个答案,因为您只能使用 ARM:

      1. 为您的密钥保管库启用 ARM 模板部署:

        {
          "type": "Microsoft.KeyVault/vaults",   
          "name": "[parameters('keyVaultName')]",       
          ...
          "properties": {
            "enabledForTemplateDeployment": true,
            ...
          }
        }
        
      2. 创建系统标识:

        {
          "type": "Microsoft.Web/sites",
          "name": "[parameters('functionAppName')]",       
          ...
          "identity": {
            "type": "SystemAssigned"
          }
          ...
        }
        
      3. 创建访问策略:

        {
          "apiVersion": "2018-02-14",
          "type": "Microsoft.KeyVault/vaults/accessPolicies",
          "name": "[concat(parameters('keyVaultName'), '/add')]",
          "properties": {
            "accessPolicies": [
              {
                "tenantId": "[parameters('tenantId')]",
                "objectId": "[reference(resourceId('Microsoft.Web/sites', parameters('functionAppName')), '2018-02-01', 'Full').identity.principalId]",
                "permissions": {
                  "secrets": [ "get" ]
                }
              }
            ]
          },
          "dependsOn": [
            "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]",
            "[resourceId('Microsoft.Web/sites', parameters('functionAppName'))]"
          ]
        }
        

      【讨论】:

        【解决方案4】:

        使用最新的 AzureRM 模块 (6.13.1)

        $AppProp = Get-AzureRmWebApp -ResourceGroupName $resourceGroupName -Name $name
        

        写输出$AppProp.Identity

        此身份属性提供有关 MSI 的所有必需详细信息。

        Type        : SystemAssigned
        
        TenantId    : c764619f-8856-4a9f-a81e-eeb0c3f93592
        
        PrincipalId : 3d317dfe-5589-4aae-94a4-51f1776979a7
        

        【讨论】:

          猜你喜欢
          • 2021-05-30
          • 2022-01-22
          • 1970-01-01
          • 1970-01-01
          • 2018-02-28
          • 2019-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多