如何获取针对应用服务的Azure MSI的引用?

时间:2017-09-21 14:53:26

标签: powershell azure azure-msi

我一直在测试最近发布的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),仅指虚拟机,而不是应用服务。

4 个答案:

答案 0 :(得分:2)

您可以使用Get-AzureADServicePrincipal

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

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

更新

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

答案 1 :(得分:0)

如果要使用Azure RM PowerShell命令行开关,请使用:

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

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

编辑: 即便如此,也可能导致多个值。更好的解决方案是进一步过滤:

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

答案 2 :(得分:0)

因为您是使用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'))]"
      ]
    }
    

答案 3 :(得分:0)

使用最新的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