利用 PowerShell 設定 Azure VM Image Builder 權限
適用於:✔️ Linux VM ✔️ 彈性擴展集
您註冊 Azure VM Image Builder 時,會授與該服務建立、管理及刪除暫存資源群組的權限。 此服務也有權限可將資源新增至映像建置所需的資源群組。 在成功註冊期間,您的訂閱會取得 VM Image Builder 服務主體名稱 (SPN) 的存取權。
如果您想要 VM Image Builder 發佈映像,您必須在 Azure 中建立使用者指派的身分識別,並具有讀取和寫入映像的權限。 舉例來說,您可能會想要將映像發佈至受控映像或 Azure Compute Gallery。 如果您要存取 Azure 儲存體,則您所建立的使用者指派身分識別需要讀取私人或公用容器的權限。
您必須先設定使用權限和存取權限後才能建置映像。 下列各節將詳細說明如何使用 PowerShell 設定可能的案例。
建立使用者指派的受控識別
VM Image Builder 需要您建立 Azure 使用者指派的受控識別。 VM Image Builder 會使用此身分識別來讀取映像、寫入映像,以及存取 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
如需詳細資訊,請參閱 Azure 使用者指派的受控識別。
允許 Image Builder 發佈映像
若要讓 VM Image Builder 發佈映像,必須允許服務將映像插入資源群組。 若要授與所需的權限,請建立使用者指派的受控識別,並在映像組建所在的資源群組上授與其權限。 VM Image Builder 沒有可存取訂閱中其他資源群組中資源的權限。 您必須採取明確的動作來允許存取,以防止您的建置失敗。
您不需要在資源群組上授與使用者指派的受控識別參與者權限,也能散發映像。 不過,使用者指派的受控識別需要在散發資源群組中具有下列 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
自訂現有映像的權限
若要讓 VM Image Builder 從來源自定映像組建映像,則必須允許該服務將映像讀入這些資源群組中。 若要授與所需的權限,請建立使用者指派的受控識別,並在映像所在的資源群組上授與其權限。
從現有的自訂映像建置的方式如下:
Microsoft.Compute/images/read
從現有的 Azure Compute Gallery 版本建置的方法如下:
Microsoft.Compute/galleries/read
Microsoft.Compute/galleries/images/read
Microsoft.Compute/galleries/images/versions/read
在虛擬網路上自訂映像的權限
VM Image Builder 具備在訂閱中部署和使用現有虛擬網路的功能,因此能允許自訂存取已連線的資源。
您不需要在資源群組上授與使用者指派的受控識別參與者權限,也能將 VM 部署到現存的虛擬網路上。 不過,使用者指派的受控識別需要在虛擬網路資源群組上具有下列 Azure Actions
權限:
Microsoft.Network/virtualNetworks/read
Microsoft.Network/virtualNetworks/subnets/join/action
建立 Azure 角色定義
下列範例會從上一節所述的動作建立 Azure 角色定義。 這些範例會在資源群組層級套用。 請評估及測試範例是否足以滿足您的需求。
映像動作允許讀取和寫入。 請決定適合您環境的內容。 例如,建立角色以允許 VM Image Builder 從資源群組 example-rg-1 讀取影像,並將映像寫入資源群組 example-rg-2。
自訂映像 Azure 角色範例
下列範例會建立能使用和散發來源自訂映像的 Azure 角色。 您接著會將自訂角色授與 VM Image Builder 的使用者指派受控識別。
為了簡化取代範例中值的流程,請先設定下列變數。 將預留位置設定以您的變數取代。
設定 | 描述 |
---|---|
<訂用帳戶識別碼> | 您的 Azure 訂用帳戶識別碼。 |
<資源群組> | 自訂映像的資源群組。 |
$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 Image Builder 的使用者指派受控識別。
為了簡化取代範例中值的流程,請先設定下列變數。 將預留位置設定以您的變數取代。
設定 | 描述 |
---|---|
<訂用帳戶識別碼> | 您的 Azure 訂用帳戶識別碼。 |
<資源群組> | 虛擬網路資源群組。 |
$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