如何获取对应用服务的 Azure MSI 的引用?
How to get a reference to an Azure MSI for an app service?
我一直在测试最近发布的 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)仅指 VM 而不是应用程序服务。
你可以使用 Get-AzureADServicePrincipal
.
$web=Get-AzureADServicePrincipal -SearchString "<name>"
$web.ObjectId
默认情况下,该名称是您的网络应用名称。
更新:
对于 OP 的场景,我们可以使用 template 来获取对 Azure MSI 的引用。
如果你想使用 Azure RM PowerShell 命令行开关,你可以使用:
$(Get-AzureRmADServicePrincipal -SearchString $Name | where {$_.DisplayName -eq $Name}).Id
where 部分是为了确保您拥有特定的 SP 而不是多个结果 starting 具有相同的名称。
编辑:
即使是上述情况也可能导致多个值。更好的解决方案是像这样进一步过滤:
Get-AzureRmADServicePrincipal -SearchString $Name | where {($_.DisplayName -eq $Name) -and ($_.ServicePrincipalNames -match "https://identity.azure.net")}
因为您使用 ARM 部署了资源,所以我想添加这个答案,因为您可以仅使用 ARM 来完成:
为您的密钥保管库启用 ARM 模板部署:
{
"type": "Microsoft.KeyVault/vaults",
"name": "[parameters('keyVaultName')]",
...
"properties": {
"enabledForTemplateDeployment": true,
...
}
}
创建系统标识:
{
"type": "Microsoft.Web/sites",
"name": "[parameters('functionAppName')]",
...
"identity": {
"type": "SystemAssigned"
}
...
}
创建访问策略:
{
"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'))]"
]
}
使用最新的 AzureRM 模块 (6.13.1)
$AppProp = Get-AzureRmWebApp -ResourceGroupName $resourceGroupName -Name $name
Write-Output $AppProp.Identity
此身份 属性 提供了有关 MSI 的所有必需详细信息。
Type : SystemAssigned
TenantId : c764619f-8856-4a9f-a81e-eeb0c3f93592
PrincipalId : 3d317dfe-5589-4aae-94a4-51f1776979a7
我一直在测试最近发布的 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)仅指 VM 而不是应用程序服务。
你可以使用 Get-AzureADServicePrincipal
.
$web=Get-AzureADServicePrincipal -SearchString "<name>"
$web.ObjectId
默认情况下,该名称是您的网络应用名称。
更新:
对于 OP 的场景,我们可以使用 template 来获取对 Azure MSI 的引用。
如果你想使用 Azure RM PowerShell 命令行开关,你可以使用:
$(Get-AzureRmADServicePrincipal -SearchString $Name | where {$_.DisplayName -eq $Name}).Id
where 部分是为了确保您拥有特定的 SP 而不是多个结果 starting 具有相同的名称。
编辑: 即使是上述情况也可能导致多个值。更好的解决方案是像这样进一步过滤:
Get-AzureRmADServicePrincipal -SearchString $Name | where {($_.DisplayName -eq $Name) -and ($_.ServicePrincipalNames -match "https://identity.azure.net")}
因为您使用 ARM 部署了资源,所以我想添加这个答案,因为您可以仅使用 ARM 来完成:
为您的密钥保管库启用 ARM 模板部署:
{ "type": "Microsoft.KeyVault/vaults", "name": "[parameters('keyVaultName')]", ... "properties": { "enabledForTemplateDeployment": true, ... } }
创建系统标识:
{ "type": "Microsoft.Web/sites", "name": "[parameters('functionAppName')]", ... "identity": { "type": "SystemAssigned" } ... }
创建访问策略:
{ "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'))]" ] }
使用最新的 AzureRM 模块 (6.13.1)
$AppProp = Get-AzureRmWebApp -ResourceGroupName $resourceGroupName -Name $name
Write-Output $AppProp.Identity
此身份 属性 提供了有关 MSI 的所有必需详细信息。
Type : SystemAssigned
TenantId : c764619f-8856-4a9f-a81e-eeb0c3f93592
PrincipalId : 3d317dfe-5589-4aae-94a4-51f1776979a7