PowerShell を使用して Azure VM Image Builder のアクセス許可を構成する

適用対象: ✔️ Linux VM ✔️ フレキシブルなスケール セット

Azure VM Image Builder に登録すると、ステージング リソース グループを作成、管理、削除するためのアクセス許可がサービスに付与されます。 このサービスには、イメージのビルドに必要なリソースをリソース グループに追加する権限もあります。 登録が成功すると、サブスクリプションが VM Image Builder サービス プリンシパル名 (SPN) にアクセスできるようになります。

VM Image Builder でイメージを配布する場合は、イメージの読み取りと書き込みを行うためのアクセス許可を持つユーザー割り当て ID を Azure で作成する必要があります。 たとえば、マネージド イメージや Azure Compute Gallery にイメージを配布できます。 Azure Storage にアクセスする場合は、作成するユーザー割り当て ID に、プライベートまたはパブリック コンテナーを読み取るためのアクセス許可が必要となります。

イメージをビルドする前に、アクセス許可と特権を設定する必要があります。 以下のセクションでは、PowerShell を使用して想定されるシナリオを構成する方法について詳しく説明します。

ユーザー割り当てマネージド ID を作成する

VM Image Builder では、Azure ユーザー割り当てマネージド ID を作成する必要があります。 VM Image Builder は、この ID を使用して、イメージの読み取り、イメージの書き込み、および Azure Storage アカウントへのアクセスを行います。 サブスクリプションで特定のアクションを実行できるアクセス許可をその ID に付与します。

Note

ユーザー割り当てマネージド ID は、イメージ リソース グループにアクセス許可を付与するための正しい手段です。 このために SPN は非推奨となっています。

次の例は、Azure ユーザー割り当てマネージド ID を作成する方法を示しています。 プレースホルダーの設定を置き換えて、変数を設定してください。

設定 Description
<リソース グループ> ユーザー割り当てマネージド ID を作成するリソース グループ。
## Add AZ PS module to support AzUserAssignedIdentity
Install-Module -Name Az.ManagedServiceIdentity

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

詳細については、Azure のユーザー割り当てマネージド IDに関するページを参照してください。

VM Image Builder にイメージの配布を許可する

VM Image Builder でイメージを配布するには、このサービスにリソース グループへのイメージの挿入を許可する必要があります。 必要なアクセス許可を付与するには、ユーザー割り当てマネージド ID を作成し、イメージがビルドされるリソース グループに対するアクセス許可を付与します。 VM Image Builder には、サブスクリプション内の他のリソース グループのリソースにアクセスするアクセス許可がありません。 ビルドが失敗しないようにするには、アクセスを許可する明示的なアクションを実行する必要があります。

イメージを配布するために、リソース グループに対する共同作成者アクセス許可をユーザー割り当てマネージド ID に付与する必要はありません。 ただし、ユーザー割り当てマネージド ID には、配布リソース グループに次の 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 でソース カスタム イメージからイメージをビルドするには、このサービスに対象のリソース グループへのイメージの読み取りを許可する必要があります。 必要なアクセス許可を付与するには、ユーザー割り当てマネージド ID を作成し、イメージが配置されているリソース グループに対するアクセス許可を付与します。

既存のカスタム イメージからビルドする方法を次に示します。

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 を既存の仮想ネットワークにデプロイするために、リソース グループに対する共同作成者権限をユーザー割り当てマネージド ID に付与する必要はありません。 ただし、ユーザー割り当てマネージド ID には、仮想ネットワーク リソース グループに対する次の Azure Actions アクセス許可が必要です。

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

Azure ロールの定義を作成する

次の例では、前のセクションで説明したアクションから Azure ロール定義を作成します。 これらの例は、リソース グループ レベルで適用されます。 例が実際の要件に合った細かさかどうかを評価し、テストしてください。

イメージのアクションでは、読み取りと書き込みが許可されています。 環境に適したものを判断します。 たとえば、リソース グループ example-rg-1 からイメージを読み取り、リソース グループ example-rg-2 にイメージを書き込むことを VM Image Builder に許可するロールを作成します。

カスタム イメージの Azure ロールの例

次の例では、ソース カスタム イメージを使用および配布する Azure ロールを作成します。 その後に、VM Image Builder のユーザー割り当てマネージド ID にカスタム ロールを付与します。

この例の値の置換を簡単にするために、最初に次の変数を設定します。 プレースホルダーの設定を置き換えて、変数を設定してください。

設定 Description
<サブスクリプション 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 Image Builder のユーザー割り当てマネージド ID にカスタム ロールを付与します。

この例の値の置換を簡単にするために、最初に次の変数を設定します。 プレースホルダーの設定を置き換えて、変数を設定してください。

設定 Description
<サブスクリプション 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 Image Builder の概要