Vytvoření image a použití spravované identity přiřazené uživatelem pro přístup k souborům v účtu úložiště Azure

Platí pro: ✔️ Flexibilní škálovací sady virtuálních počítačů s Linuxem ✔️

Tento článek ukazuje, jak vytvořit přizpůsobenou image pomocí Azure VM Image Builderu. Služba používá spravovanou identitu přiřazenou uživatelem pro přístup k souborům v účtu úložiště Azure a může dosáhnout blokování neověřeného přístupu k účtu úložiště.

Azure VM Image Builder podporuje použití skriptů a kopírování souborů z GitHubu, účtů úložiště Azure a dalších umístění. Pokud chcete použít umístění, musí být externě přístupné pro VM Image Builder.

V následujícím příkladu vytvoříte dvě skupiny prostředků, jednu pro vlastní image a druhou pro hostování účtu úložiště Azure, který obsahuje soubor skriptu. Tento příklad simuluje scénář reálného života, ve kterém můžete mít artefakty sestavení nebo soubory obrázků v různých účtech úložiště. Vytvoříte identitu přiřazenou uživatelem a pak udělíte oprávnění ke čtení identity v souboru skriptu, ale nepovolíte k němu veřejný přístup. Potom pomocí úpravce prostředí stáhnete a spustíte skript z účtu úložiště.

Vytvoření skupiny zdrojů

  1. Protože budete opakovaně používat některé části informací, vytvořte některé proměnné pro uložení těchto informací.

    # Image resource group name 
    imageResourceGroup=aibmdimsi
    # Storage resource group
    strResourceGroup=aibmdimsistor
    # Location 
    location=WestUS2
    # Name of the image to be created
    imageName=aibCustLinuxImgMsi01
    # Image distribution metadata reference name
    runOutputName=u1804ManImgMsiro
    
  2. Vytvořte proměnnou pro ID předplatného:

    subscriptionID=$(az account show --query id --output tsv)
    
  3. Vytvořte skupiny prostředků pro image i úložiště skriptů:

    # Create a resource group for the image template
    az group create -n $imageResourceGroup -l $location
    # Create a resource group for the script storage
    az group create -n $strResourceGroup -l $location
    
  4. Vytvořte identitu přiřazenou uživatelem a nastavte oprávnění pro skupinu prostředků:

    Image Builder virtuálního počítače používá zadanou identitu uživatele k vložení image do skupiny prostředků. V tomto příkladu vytvoříte definici role Azure s konkrétními akcemi pro distribuci image. Definice role se pak přiřadí identitě uživatele.

    # Create a user-assigned identity for VM Image Builder to access the storage account where the script is located
    identityName=aibBuiUserId$(date +'%s')
    az identity create -g $imageResourceGroup -n $identityName
    
    # Get an identity ID
    imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv)
    
    # Get the user-identity URI, which is needed for the template
    imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$imageResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName
    
    # Download the preconfigured role definition example
    curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json
    
    # Update the definition
    sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleImageCreation.json
    sed -i -e "s/<rgName>/$imageResourceGroup/g" aibRoleImageCreation.json
    
    # Create role definitions
    az role definition create --role-definition ./aibRoleImageCreation.json
    
    # Grant the role definition to the user-assigned identity
    az role assignment create \
        --assignee $imgBuilderCliId \
        --role "Azure Image Builder Service Image Creation Role" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
    
  5. Vytvořte účet úložiště a zkopírujte do něj ukázkový skript z GitHubu:

    # Script storage account
    scriptStorageAcc=aibstorscript$(date +'%s')
    
    # Script container
    scriptStorageAccContainer=scriptscont$(date +'%s')
    
    # Script URL
    scriptUrl=https://$scriptStorageAcc.blob.core.windows.net/$scriptStorageAccContainer/customizeScript.sh
    
    # Create the storage account and blob in the resource group
    az storage account create -n $scriptStorageAcc -g $strResourceGroup -l $location --sku Standard_LRS
    
    az storage container create -n $scriptStorageAccContainer --fail-on-exist --account-name $scriptStorageAcc
    
    # Copy in an example script from the GitHub repo 
    az storage blob copy start \
        --destination-blob customizeScript.sh \
        --destination-container $scriptStorageAccContainer \
        --account-name $scriptStorageAcc \
        --source-uri https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/customizeScript.sh
    
  6. Udělte nástroji Image Builderu virtuálního počítače oprávnění k vytváření prostředků ve skupině prostředků image. Hodnota --assignee je ID identity uživatele.

    az role assignment create \
        --assignee $imgBuilderCliId \
        --role "Storage Blob Data Reader" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$strResourceGroup/providers/Microsoft.Storage/storageAccounts/$scriptStorageAcc/blobServices/default/containers/$scriptStorageAccContainer 
    

Úprava příkladu

Stáhněte si ukázkový soubor JSON a nakonfigurujte ho s proměnnými, které jste vytvořili dříve.

curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/7_Creating_Custom_Image_using_MSI_to_Access_Storage/helloImageTemplateMsi.json -o helloImageTemplateMsi.json
sed -i -e "s/<subscriptionID>/$subscriptionID/g" helloImageTemplateMsi.json
sed -i -e "s/<rgName>/$imageResourceGroup/g" helloImageTemplateMsi.json
sed -i -e "s/<region>/$location/g" helloImageTemplateMsi.json
sed -i -e "s/<imageName>/$imageName/g" helloImageTemplateMsi.json
sed -i -e "s%<scriptUrl>%$scriptUrl%g" helloImageTemplateMsi.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateMsi.json
sed -i -e "s%<runOutputName>%$runOutputName%g" helloImageTemplateMsi.json

Vytvoření image

  1. Odešlete konfiguraci image do služby Image Builder virtuálního počítače:

    az resource create \
        --resource-group $imageResourceGroup \
        --properties @helloImageTemplateMsi.json \
        --is-full-object \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateMsi01
    
  2. Spusťte sestavení image:

    az resource invoke-action \
        --resource-group $imageResourceGroup \
        --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateMsi01 \
        --action Run 
    

Dokončení sestavení může trvat přibližně 15 minut.

Vytvoření virtuálního počítače

  1. Vytvoření virtuálního počítače z image:

    az vm create \
    --resource-group $imageResourceGroup \
    --name aibImgVm00 \
    --admin-username aibuser \
    --image $imageName \
    --location $location \
    --generate-ssh-keys
    
  2. Po vytvoření virtuálního počítače s ním spusťte relaci SSH (Secure Shell).

    ssh aibuser@<publicIp>
    

Po navázání připojení SSH byste měli obdržet zprávu o dni s oznámením, že obrázek byl přizpůsobený:


*******************************************************
**            This VM was built from the:            **
**      !! AZURE VM IMAGE BUILDER Custom Image !!    **
**         You have just been Customized :-)         **
*******************************************************

Vyčištění prostředků

Pokud už nepotřebujete prostředky vytvořené během tohoto procesu, můžete je odstranit spuštěním následujícího kódu:


az role definition delete --name "$imageRoleDefName"
```azurecli-interactive
az role assignment delete \
    --assignee $imgBuilderCliId \
    --role "$imageRoleDefName" \
    --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
az identity delete --ids $imgBuilderId
az resource delete \
    --resource-group $imageResourceGroup \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateMsi01
az group delete -n $imageResourceGroup
az group delete -n $strResourceGroup

Další kroky

Pokud máte problémy s používáním nástroje VM Image Builder, přečtěte si téma Řešení potíží s nástrojem Azure VM Image Builder.