Tworzenie obrazu i używanie tożsamości zarządzanej przypisanej przez użytkownika do uzyskiwania dostępu do plików na koncie usługi Azure Storage

Dotyczy: ✔️ Maszyny wirtualne z systemem Linux — elastyczne zestawy skalowania ✔️

W tym artykule pokazano, jak utworzyć dostosowany obraz przy użyciu narzędzia Azure VM Image Builder. Usługa używa tożsamości zarządzanej przypisanej przez użytkownika do uzyskiwania dostępu do plików na koncie usługi Azure Storage i może osiągnąć blokowanie nieuwierzytelnionego dostępu do konta magazynu.

Narzędzie Azure VM Image Builder obsługuje używanie skryptów i kopiowanie plików z usług GitHub, kont magazynu platformy Azure i innych lokalizacji. Jeśli chcesz używać lokalizacji, muszą one być dostępne zewnętrznie dla konstruktora obrazów maszyny wirtualnej.

W poniższym przykładzie utworzysz dwie grupy zasobów, jedną dla obrazu niestandardowego i drugą do hostowania konta usługi Azure Storage zawierającego plik skryptu. W tym przykładzie symuluje rzeczywisty scenariusz, w którym mogą istnieć artefakty kompilacji lub pliki obrazów na różnych kontach magazynu. Utworzysz tożsamość przypisaną przez użytkownika, a następnie przyznasz tożsamości uprawnienia do odczytu w pliku skryptu, ale nie zezwolisz na publiczny dostęp do pliku. Następnie użyjesz konfiguratora powłoki, aby pobrać i uruchomić skrypt z konta magazynu.

Tworzenie grupy zasobów

  1. Ponieważ będziesz używać niektórych informacji wielokrotnie, utwórz pewne zmienne do przechowywania tych informacji.

    # 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. Utwórz zmienną dla identyfikatora subskrypcji:

    subscriptionID=$(az account show --query id --output tsv)
    
  3. Utwórz grupy zasobów dla obrazu i magazynu skryptów:

    # 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. Utwórz tożsamość przypisaną przez użytkownika i ustaw uprawnienia w grupie zasobów:

    Konstruktor obrazów maszyny wirtualnej używa podanej tożsamości użytkownika do wstrzykiwania obrazu do grupy zasobów. W tym przykładzie utworzysz definicję roli platformy Azure z określonymi akcjami do dystrybucji obrazu. Definicja roli jest następnie przypisywana do tożsamości użytkownika.

    # 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. Utwórz konto magazynu i skopiuj do niego przykładowy skrypt z usługi GitHub:

    # 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. Nadaj konstruktorowi obrazów maszyny wirtualnej uprawnienie do tworzenia zasobów w grupie zasobów obrazu. Wartość --assignee to identyfikator tożsamości użytkownika.

    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 
    

Modyfikowanie przykładu

Pobierz przykładowy plik JSON i skonfiguruj go przy użyciu utworzonych wcześniej zmiennych.

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

Tworzenie obrazu

  1. Prześlij konfigurację obrazu do usługi konstruktora obrazów maszyny wirtualnej:

    az resource create \
        --resource-group $imageResourceGroup \
        --properties @helloImageTemplateMsi.json \
        --is-full-object \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateMsi01
    
  2. Uruchom kompilację obrazu:

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

Ukończenie kompilacji może potrwać około 15 minut.

Tworzenie maszyny wirtualnej

  1. Utwórz maszynę wirtualną na podstawie obrazu:

    az vm create \
    --resource-group $imageResourceGroup \
    --name aibImgVm00 \
    --admin-username aibuser \
    --image $imageName \
    --location $location \
    --generate-ssh-keys
    
  2. Po utworzeniu maszyny wirtualnej uruchom z nią sesję protokołu Secure Shell (SSH).

    ssh aibuser@<publicIp>
    

Po nawiązaniu połączenia SSH powinien zostać wyświetlony komunikat "Komunikat dnia" z informacją, że obraz został dostosowany:


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

Oczyszczanie zasobów

Jeśli nie potrzebujesz już zasobów utworzonych podczas tego procesu, możesz je usunąć, uruchamiając następujący kod:


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

Następne kroki

Jeśli masz problemy z używaniem narzędzia VM Image Builder, zobacz Rozwiązywanie problemów z narzędziem Azure VM Image Builder.