使用 PowerShell 配置 Azure VM 映像生成器权限

适用于:✔️ Linux VM ✔️ 灵活规模集

注册 Azure VM 映像生成器时,这会授予服务创建、管理和删除暂存资源组的权限。 该服务还有权将资源添加到进行映像生成所需的资源组。 在成功注册期间,订阅可以访问 VM 映像生成器服务主体名称 (SPN)。

如果希望 VM 映像生成器分发映像,则需要在 Azure 中创建用户分配的标识,该标识具有读取和写入映像的权限。 例如,可能需要将映像分发到托管映像或 Azure Compute Gallery。 如果要访问 Azure 存储,则创建的用户分配的标识需要具有读取专用容器或公共容器的权限。

必须先设置权限和特权才能生成映像。 以下各部分详细介绍了如何使用 PowerShell 配置可能的方案。

创建用户分配的托管标识

VM 映像生成器要求创建 Azure 用户分配的托管标识。 VM 映像生成器使用该标识来读取映像、写入映像以及访问 Azure 存储帐户。 你授予标识在订阅中执行特定操作的权限。

注意

用户分配的托管标识是向映像资源组授予权限的正确方法。 为此,已弃用 SPN。

下面的示例演示如何创建 Azure 用户分配的托管标识。 替换占位符设置以设置变量。

设置 说明
<资源组> 要在其中创建用户分配的托管标识的资源组。
## Add AZ PS module to support AzUserAssignedIdentity
Install-Module -Name Az.ManagedServiceIdentity

$parameters = @{
    Name = 'aibIdentity'
    ResourceGroupName = '<Resource group>'
}
# create identity
New-AzUserAssignedIdentity @parameters

有关详细信息,请参阅用户分配的托管标识

允许 VM 映像生成器分发映像

要使 VM 映像生成器能够分发映像,必须允许服务将映像注入资源组。 若要授予所需的权限,创建用户分配的托管标识,并授予其对生成映像的资源组的权限。 VM 映像生成器没有访问订阅中其他资源组中资源的权限。 需要执行显式操作以允许访问,从而防止生成失败。

无需向用户分配的托管标识参与者授予对资源组的权限就能分发映像。 但是,用户分配的托管标识需要在分发资源组中具有以下 Azure Actions 权限:

Microsoft.Compute/images/write
Microsoft.Compute/images/read
Microsoft.Compute/images/delete

如果要分发到 Azure Compute Gallery,还需要:

Microsoft.Compute/galleries/read
Microsoft.Compute/galleries/images/read
Microsoft.Compute/galleries/images/versions/read
Microsoft.Compute/galleries/images/versions/write

自定义现有映像的权限

要使 Azure VM 映像生成器从源自定义映像生成映像,必须允许服务将映像读取到这些资源组中。 若要授予所需的权限,创建用户分配的托管标识,并授予其对映像所在的资源组的权限。

下面介绍了如何从现有自定义映像生成:

Microsoft.Compute/images/read

下面介绍了如何从现有 Azure Compute Gallery 版本生成:

Microsoft.Compute/galleries/read
Microsoft.Compute/galleries/images/read
Microsoft.Compute/galleries/images/versions/read

用于自定义虚拟网络上的映像的权限

VM 映像生成器可以在订阅中部署和使用现有虚拟网络,从而允许自定义内容访问连接的资源。

无需向用户分配的托管标识参与者授予对资源组的权限就能将 VM 部署到现有的虚拟网络。 但是,用户分配的托管标识需要对虚拟网络资源组具有以下 Azure Actions 权限:

Microsoft.Network/virtualNetworks/read
Microsoft.Network/virtualNetworks/subnets/join/action

创建 Azure 角色定义

以下示例根据前面部分中所述的操作创建 Azure 角色定义。 这些示例在资源组级别应用。 评估并测试示例是否足以满足你的要求。

映像操作允许进行读写。 确定适合你的环境的操作。 例如,创建一个角色以允许 VM 映像生成器从资源组 example-rg-1 中读取映像并将相应映像写入资源组 example-rg-2。

自定义映像 Azure 角色示例

以下示例会创建一个 Azure 角色,以使用和分发源自定义映像。 然后,将自定义角色授给 VM 映像生成器的用户分配的托管标识。

若要简化示例中值的替换,请先设置以下变量。 替换占位符设置以设置变量。

设置 说明
<订阅 ID> Azure 订阅 ID。
<资源组> 自定义映像的资源组。
$sub_id = "<Subscription ID>"
# Resource group - image builder will only support creating custom images in the same Resource Group as the source managed image.
$imageResourceGroup = "<Resource group>"
$identityName = "aibIdentity"

# Use a web request to download the sample JSON description
$sample_uri="https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json"
$role_definition="aibRoleImageCreation.json"

Invoke-WebRequest -Uri $sample_uri -Outfile $role_definition -UseBasicParsing

# Create a unique role name to avoid clashes in the same Azure Active Directory domain
$timeInt=$(get-date -UFormat "%s")
$imageRoleDefName="Azure Image Builder Image Def"+$timeInt

# Update the JSON definition placeholders with variable values
((Get-Content -path $role_definition -Raw) -replace '<subscriptionID>',$sub_id) | Set-Content -Path $role_definition
((Get-Content -path $role_definition -Raw) -replace '<rgName>', $imageResourceGroup) | Set-Content -Path $role_definition
((Get-Content -path $role_definition -Raw) -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName) | Set-Content -Path $role_definition

# Create a custom role from the aibRoleImageCreation.json description file. 
New-AzRoleDefinition -InputFile $role_definition

# Get the user-identity properties
$identityNameResourceId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
$identityNamePrincipalId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId

# Grant the custom role to the user-assigned managed identity for Azure Image Builder.
$parameters = @{
    ObjectId = $identityNamePrincipalId
    RoleDefinitionName = $imageRoleDefName
    Scope = '/subscriptions/' + $sub_id + '/resourceGroups/' + $imageResourceGroup
}

New-AzRoleAssignment @parameters

现有虚拟网络 Azure 角色示例

以下示例会创建一个 Azure 角色,以使用和分发现有的虚拟网络映像。 然后,将自定义角色授给 VM 映像生成器的用户分配的托管标识。

若要简化示例中值的替换,请先设置以下变量。 替换占位符设置以设置变量。

设置 说明
<订阅 ID> Azure 订阅 ID。
<资源组> 虚拟网络资源组。
$sub_id = "<Subscription ID>"
$res_group = "<Resource group>"
$identityName = "aibIdentity"

# Use a web request to download the sample JSON description
$sample_uri="https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleNetworking.json"
$role_definition="aibRoleNetworking.json"

Invoke-WebRequest -Uri $sample_uri -Outfile $role_definition -UseBasicParsing

# Create a unique role name to avoid clashes in the same AAD domain
$timeInt=$(get-date -UFormat "%s")
$networkRoleDefName="Azure Image Builder Network Def"+$timeInt

# Update the JSON definition placeholders with variable values
((Get-Content -path $role_definition -Raw) -replace '<subscriptionID>',$sub_id) | Set-Content -Path $role_definition
((Get-Content -path $role_definition -Raw) -replace '<vnetRgName>', $res_group) | Set-Content -Path $role_definition
((Get-Content -path $role_definition -Raw) -replace 'Azure Image Builder Service Networking Role',$networkRoleDefName) | Set-Content -Path $role_definition

# Create a custom role from the aibRoleNetworking.json description file
New-AzRoleDefinition -InputFile $role_definition

# Get the user-identity properties
$identityNameResourceId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
$identityNamePrincipalId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId

# Assign the custom role to the user-assigned managed identity for Azure Image Builder
$parameters = @{
    ObjectId = $identityNamePrincipalId
    RoleDefinitionName = $networkRoleDefName
    Scope = '/subscriptions/' + $sub_id + '/resourceGroups/' + $res_group
}

New-AzRoleAssignment @parameters

后续步骤

Azure VM 映像生成器概述