Azure CLI を使用して 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 に、プライベートまたはパブリック コンテナーを読み取るためのアクセス許可が必要となります。

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

前提条件

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

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

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

Note

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

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

設定 説明
<リソース グループ> ユーザー割り当てマネージド ID を作成するリソース グループ。
identityName="aibIdentity"
imageResourceGroup=<Resource group>

az identity create \
    --resource-group $imageResourceGroup \
    --name $identityName

詳細については、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。
<リソース グループ> カスタム イメージのリソース グループ。
# Subscription ID - You can get this using `az account show | grep id` or from the Azure portal.
subscriptionID=$(az account show --query id --output tsv)
# 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 *cURL* to download the a sample JSON description 
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json

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

# Update the JSON definition using stream editor
sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleImageCreation.json
sed -i -e "s/<rgName>/$imageResourceGroup/g" aibRoleImageCreation.json
sed -i -e "s/Azure Image Builder Service Image Creation Role/$imageRoleDefName/g" aibRoleImageCreation.json

# Create a custom role from the sample aibRoleImageCreation.json description file.
az role definition create --role-definition ./aibRoleImageCreation.json

# Get the user-assigned managed identity id
imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv)

# Grant the custom role to the user-assigned managed identity for Azure Image Builder.
az role assignment create \
    --assignee $imgBuilderCliId \
    --role $imageRoleDefName \
    --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup

既存の仮想ネットワーク Azure ロールの例

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

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

設定 Description
<サブスクリプション ID> Azure のサブスクリプション ID。
<リソース グループ> 仮想ネットワーク リソース グループ
# Subscription ID - You can get this using `az account show | grep id` or from the Azure portal.
subscriptionID=$(az account show --query id --output tsv)
VnetResourceGroup=<Resource group>
identityName="aibIdentity"

# Use *cURL* to download the a sample JSON description 
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleNetworking.json -o aibRoleNetworking.json

# Create a unique role name to avoid clashes in the same domain
netRoleDefName="Azure Image Builder Network Def"$(date +'%s')

# Update the JSON definition using stream editor
sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleNetworking.json
sed -i -e "s/<vnetRgName>/$VnetResourceGroup/g" aibRoleNetworking.json
sed -i -e "s/Azure Image Builder Service Networking Role/$netRoleDefName/g" aibRoleNetworking.json

# Create a custom role from the aibRoleNetworking.json description file.
az role definition create --role-definition ./aibRoleNetworking.json

# Get the user-assigned managed identity id
imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv)

# Grant the custom role to the user-assigned managed identity for Azure Image Builder.
az role assignment create \
    --assignee $imgBuilderCliId \
    --role $netRoleDefName \
    --scope /subscriptions/$subscriptionID/resourceGroups/$VnetResourceGroup

Azure Storage のアクセスにマネージド ID を使用する

Azure Storage で認証を行い、かつプライベート コンテナーを使用する場合は、VM Image Builder にユーザー割り当てマネージド ID が必要です。 VM Image Builder では、この ID が Azure Storage での認証に使用されます。

注意

VM Image Builder では、イメージ テンプレートの送信時にのみこの ID が使用されます。 イメージのビルド中に、ビルド VM からこの ID にアクセスすることはできません。

ユーザー割り当てマネージド ID を作成するには、Azure CLI を使用します。

az role assignment create \
    --assignee <Image Builder client ID> \
    --role "Storage Blob Data Reader" \
    --scope /subscriptions/<Subscription ID>/resourceGroups/<Resource group>/providers/Microsoft.Storage/storageAccounts/$scriptStorageAcc/blobServices/default/containers/<Storage account container>

VM Image Builder テンプレートで、ユーザー割り当てマネージド ID を指定します。

    "type": "Microsoft.VirtualMachineImages/imageTemplates",
    "apiVersion": "2020-02-14",
    "location": "<Region>",
    ..
    "identity": {
    "type": "UserAssigned",
          "userAssignedIdentities": {
            "<Image Builder ID>": {}     
        }

次のプレースホルダー設定を置き換えます。

設定 Description
<[リージョン]> テンプレートのリージョン
<リソース グループ> Resource group
<ストレージ アカウント コンテナー> ストレージ アカウント コンテナーの名前
<サブスクリプション ID> Azure サブスクリプション

詳細については、「イメージを作成し、ユーザー割り当てマネージド ID を使用して Azure Storage 内のファイルにアクセスする」を参照してください。 ユーザー割り当てマネージド ID を作成し、ストレージ アカウントにアクセスするように構成する方法を確認できます。

次の手順

Azure VM Image Builder の概要