Dela via


Exempelskript för Azure Disk Encryption för virtuella Linux-datorer

Varning

Den här artikeln refererar till CentOS, en Linux-distribution som har statusen End Of Life (EOL). Överväg att använda och planera i enlighet med detta. Mer information finns i CentOS End Of Life-vägledningen.

Gäller för: ✔️ Flexibla skalningsuppsättningar för virtuella Linux-datorer ✔️

Den här artikeln innehåller exempelskript för att förbereda förkrypterade virtuella hårddiskar och andra uppgifter.

Kommentar

Alla skript refererar till den senaste, icke-AAD-versionen av ADE, förutom där det anges.

PowerShell-exempelskript för Azure Disk Encryption

  • Visa en lista över alla krypterade virtuella datorer i din prenumeration

    Du hittar alla ADE-krypterade virtuella datorer och tilläggsversionen i alla resursgrupper som finns i en prenumeration med hjälp av det här PowerShell-skriptet.

    Alternativt visar dessa cmdletar alla ADE-krypterade virtuella datorer (men inte tilläggsversionen):

    $osVolEncrypted = {(Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name).OsVolumeEncrypted}
    $dataVolEncrypted= {(Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name).DataVolumesEncrypted}
    Get-AzVm | Format-Table @{Label="MachineName"; Expression={$_.Name}}, @{Label="OsVolumeEncrypted"; Expression=$osVolEncrypted}, @{Label="DataVolumesEncrypted"; Expression=$dataVolEncrypted}
    
  • Visa en lista över alla krypterade VMSS-instanser i din prenumeration

    Du hittar alla ADE-krypterade VMSS-instanser och tilläggsversionen i alla resursgrupper som finns i en prenumeration med hjälp av det här PowerShell-skriptet.

  • Visa en lista över alla diskkrypteringshemligheter som används för att kryptera virtuella datorer i ett nyckelvalv

    Get-AzKeyVaultSecret -VaultName $KeyVaultName | where {$_.Tags.ContainsKey('DiskEncryptionKeyFileName')} | format-table @{Label="MachineName"; Expression={$_.Tags['MachineName']}}, @{Label="VolumeLetter"; Expression={$_.Tags['VolumeLetter']}}, @{Label="EncryptionKeyURL"; Expression={$_.Id}}
    

Använda PowerShell-skriptet för förhandskrav för Azure Disk Encryption

Om du redan är bekant med förhandskraven för Azure Disk Encryption kan du använda PowerShell-skriptet för Förhandskrav för Azure Disk Encryption. Ett exempel på hur du använder det här PowerShell-skriptet finns i snabbstarten Kryptera en virtuell dator. Du kan ta bort kommentarerna från ett avsnitt i skriptet, från och med rad 211, för att kryptera alla diskar för befintliga virtuella datorer i en befintlig resursgrupp.

I följande tabell visas vilka parametrar som kan användas i PowerShell-skriptet:

Parameter Description Obligatoriskt?
$resourceGroupName Namnet på resursgruppen som KeyVault tillhör. En ny resursgrupp med det här namnet skapas om den inte finns. Sant
$keyVaultName Namnet på den KeyVault där krypteringsnycklar ska placeras. Ett nytt valv med det här namnet skapas om det inte finns något. Sant
$location KeyVaults plats. Kontrollera att keyVault och virtuella datorer som ska krypteras finns på samma plats. Hämta en innehållsplatslista med Get-AzLocation. Sant
$subscriptionId Identifierare för den Azure-prenumeration som ska användas. Du kan hämta ditt prenumerations-ID med Get-AzSubscription. Sant
$aadAppName Namnet på Microsoft Entra-programmet som ska användas för att skriva hemligheter till KeyVault. Om det inte redan finns ett program med det namnet skapas ett nytt. Om den här appen redan finns skickar du parametern aadClientSecret till skriptet. Falsk
$aadClientSecret Klienthemlighet för Microsoft Entra-programmet som skapades tidigare. Falsk
$keyEncryptionKeyName Namn på valfri nyckelkrypteringsnyckel i KeyVault. En ny nyckel med det här namnet skapas om det inte finns någon. Falsk

Kryptera eller dekryptera virtuella datorer utan en Microsoft Entra-app

Kryptera eller dekryptera virtuella datorer med en Microsoft Entra-app (tidigare version)

Kryptera en OS-enhet på en virtuell Linux-dator som körs

Krav för OS-diskkryptering

  • Den virtuella datorn måste använda en distribution som är kompatibel med OS-diskkryptering enligt listan i operativsystemet som stöds av Azure Disk Encryption
  • Den virtuella datorn måste skapas från Marketplace-avbildningen i Azure Resource Manager.
  • Virtuell Azure-dator med minst 4 GB RAM-minne (rekommenderad storlek är 7 GB). Mer information finns i Minneskrav .
  • (För RHEL och CentOS) Inaktivera SELinux. Information om hur du inaktiverar SELinux finns i "4.4.2. Inaktivera SELinux" i SELinux-användar- och administratörsguiden på den virtuella datorn.
  • När du har inaktiverat SELinux startar du om den virtuella datorn minst en gång.

Steg

  1. Skapa en virtuell dator med någon av de distributioner som angavs tidigare.

  2. Konfigurera den virtuella datorn efter dina behov. Om du ska kryptera alla enheter (OS + data) måste dataenheterna anges och monteras från /etc/fstab.

    Kommentar

    Använd UUID=... för att ange dataenheter i /etc/fstab i stället för att ange blockenhetsnamnet (till exempel /dev/sdb1). Under krypteringen ändras ordningen på enheter på den virtuella datorn. Om den virtuella datorn förlitar sig på en specifik ordning på blockenheter kan den inte montera dem efter krypteringen.

  3. Logga ut från SSH-sessionerna.

  4. Om du vill kryptera operativsystemet anger du volumeType som Alla eller OPERATIVSYSTEM när du aktiverar kryptering.

    Kommentar

    Alla användarutrymmesprocesser som inte körs som systemd tjänster ska avlivas med en SIGKILL. Starta om den virtuella datorn. När du aktiverar OS-diskkryptering på en virtuell dator som körs planerar du driftstopp för virtuella datorer.

  5. Övervaka krypteringens förlopp regelbundet med hjälp av anvisningarna i nästa avsnitt.

  6. När Get-AzVmDiskEncryptionStatus visar "VMRestartPending" startar du om den virtuella datorn antingen genom att logga in på den eller med hjälp av portalen, PowerShell eller CLI.

    C:\> Get-AzVmDiskEncryptionStatus  -ResourceGroupName $ResourceGroupName -VMName $VMName
    -ExtensionName $ExtensionName
    
    OsVolumeEncrypted          : VMRestartPending
    DataVolumesEncrypted       : NotMounted
    OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings
    ProgressMessage            : OS disk successfully encrypted, reboot the VM
    

    Innan du startar om rekommenderar vi att du sparar startdiagnostik för den virtuella datorn.

Förlopp för övervakning av OS-kryptering

Du kan övervaka förloppet för OS-kryptering på tre sätt:

  • Använd cmdleten Get-AzVmDiskEncryptionStatus och granska fältet ProgressMessage:

    Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name
    
    OsVolumeEncrypted          : EncryptionInProgress
    DataVolumesEncrypted       : NotMounted
    OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings
    ProgressMessage            : OS disk encryption started
    

    När den virtuella datorn når "OS-diskkryptering har startats" tar det cirka 40 till 50 minuter på en premiumlagringsbaserad virtuell dator.

    På grund av problemet #388 i WALinuxAgent OsVolumeEncrypted och DataVolumesEncrypted visas som Unknown i vissa distributioner. Med WALinuxAgent version 2.1.5 och senare åtgärdas det här problemet automatiskt. Om du ser Unknown i utdata kan du verifiera diskkrypteringsstatus med hjälp av Azure Resource Explorer.

    Gå till Azure Resource Explorer och expandera sedan den här hierarkin i urvalspanelen till vänster:

    |-- subscriptions
       |-- [Your subscription]
            |-- resourceGroups
                 |-- [Your resource group]
                      |-- providers
                           |-- Microsoft.Compute
                                |-- virtualMachines
                                     |-- [Your virtual machine]
                                          |-- InstanceView
    

    I InstanceView rullar du ned för att se krypteringsstatusen för dina enheter.

    Vm-instansvy

  • Titta på startdiagnostik. Meddelanden från ADE-tillägget ska vara prefixet med [AzureDiskEncryption].

  • Logga in på den virtuella datorn via SSH och hämta tilläggsloggen från:

    /var/log/azure/Microsoft.Azure.Security.AzureDiskEncryptionForLinux

    Vi rekommenderar att du inte loggar in på den virtuella datorn medan OS-kryptering pågår. Kopiera loggarna endast när de andra två metoderna har misslyckats.

Förbereda en förkrypterad virtuell Linux-hårddisk

Förberedelserna för förkrypterade virtuella hårddiskar kan variera beroende på fördelningen. Exempel på hur du förbereder Ubuntu, openSUSE och CentOS 7 är tillgängliga.

Konfigurera kryptering under distributionsinstallationen genom att göra följande:

  1. Välj Konfigurera krypterade volymer när du partitionerade diskarna.

    Konfiguration av Ubuntu 16.04 – Konfigurera krypterade volymer

  2. Skapa en separat startenhet som inte får krypteras. Kryptera rotenheten.

    Ubuntu 16.04-installation – Välj enheter som ska krypteras

  3. Ange en lösenfras. Det här är lösenfrasen som du laddade upp till nyckelvalvet.

    Konfiguration av Ubuntu 16.04 – Ange lösenfras

  4. Slutför partitioneringen.

    Installation av Ubuntu 16.04 – Slutför partitioneringen

  5. När du startar den virtuella datorn och uppmanas att ange en lösenfras använder du lösenfrasen som du angav i steg 3.

    Installation av Ubuntu 16.04 – Ange lösenfras vid start

  6. Förbered den virtuella datorn för uppladdning till Azure med hjälp av dessa instruktioner. Kör inte det sista steget (avetablera den virtuella datorn) ännu.

Konfigurera kryptering för att fungera med Azure genom att göra följande:

  1. Skapa en fil under /usr/local/sbin/azure_crypt_key.sh, med innehållet i följande skript. Var uppmärksam på KeyFileName eftersom det är lösenfrasens filnamn som används av Azure.

    #!/bin/sh
    MountPoint=/tmp-keydisk-mount
    KeyFileName=LinuxPassPhraseFileName
    echo "Trying to get the key from disks ..." >&2
    mkdir -p $MountPoint
    modprobe vfat >/dev/null 2>&1
    modprobe ntfs >/dev/null 2>&1
    sleep 2
    OPENED=0
    cd /sys/block
    for DEV in sd*; do
    
        echo "> Trying device: $DEV ..." >&2
        mount -t vfat -r /dev/${DEV}1 $MountPoint >/dev/null||
        mount -t ntfs -r /dev/${DEV}1 $MountPoint >/dev/null
        if [ -f $MountPoint/$KeyFileName ]; then
                cat $MountPoint/$KeyFileName
                umount $MountPoint 2>/dev/null
                OPENED=1
                break
        fi
        umount $MountPoint 2>/dev/null
    done
    
      if [ $OPENED -eq 0 ]; then
        echo "FAILED to find suitable passphrase file ..." >&2
        echo -n "Try to enter your password: " >&2
        read -s -r A </dev/console
        echo -n "$A"
     else
        echo "Success loading keyfile!" >&2
    fi
    
  2. Ändra kryptkonfigurationen i /etc/crypttab. Den bör se ut så här:

     xxx_crypt uuid=xxxxxxxxxxxxxxxxxxxxx none luks,discard,keyscript=/usr/local/sbin/azure_crypt_key.sh
    
  3. Lägg till körbara behörigheter i skriptet:

     sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
    
  4. Redigera /etc/initramfs-tools/modules genom att lägga till rader:

     vfat
     ntfs
     nls_cp437
     nls_utf8
     nls_iso8859-1
    
  5. Kör update-initramfs -u -k all för att uppdatera initramfs för att börja keyscript gälla.

  6. Nu kan du avetablera den virtuella datorn.

    Ubuntu 16.04-installationsprogram – update-initramfs

  7. Fortsätt till nästa steg och ladda upp din virtuella hårddisk till Azure.

Ladda upp krypterad virtuell hårddisk till ett Azure Storage-konto

När DM-Crypt-kryptering har aktiverats måste den lokala krypterade virtuella hårddisken laddas upp till ditt lagringskonto.

    Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]

Ladda upp hemligheten för den förkrypterade virtuella datorn till ditt nyckelvalv

När du krypterar med en Microsoft Entra-app (tidigare version) måste den diskkrypteringshemlighet som du hämtade tidigare laddas upp som en hemlighet i nyckelvalvet. Nyckelvalvet måste ha diskkryptering och behörigheter aktiverade för Microsoft Entra-klienten.

 $AadClientId = "My-AAD-Client-Id"
 $AadClientSecret = "My-AAD-Client-Secret"

 $key vault = New-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -Location $Location

 Set-AzKeyVaultAccessPolicy -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -ServicePrincipalName $AadClientId -PermissionsToKeys all -PermissionsToSecrets all
 Set-AzKeyVaultAccessPolicy -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -EnabledForDiskEncryption

Diskkrypteringshemlighet som inte krypteras med en KEK

Om du vill konfigurera hemligheten i nyckelvalvet använder du Set-AzKeyVaultSecret. Lösenfrasen kodas som en base64-sträng och laddas sedan upp till nyckelvalvet. Kontrollera dessutom att följande taggar har angetts när du skapar hemligheten i nyckelvalvet.


 # This is the passphrase that was provided for encryption during the distribution installation
 $passphrase = "contoso-password"

 $tags = @{"DiskEncryptionKeyEncryptionAlgorithm" = "RSA-OAEP"; "DiskEncryptionKeyFileName" = "LinuxPassPhraseFileName"}
 $secretName = [guid]::NewGuid().ToString()
 $secretValue = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($passphrase))
 $secureSecretValue = ConvertTo-SecureString $secretValue -AsPlainText -Force

 $secret = Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name $secretName -SecretValue $secureSecretValue -tags $tags
 $secretUrl = $secret.Id

$secretUrl Använd i nästa steg för att ansluta OS-disken utan att använda KEK.

Diskkrypteringshemlighet krypterad med en KEK

Innan du laddar upp hemligheten till nyckelvalvet kan du kryptera den med hjälp av en nyckelkrypteringsnyckel. Använd wrap-API:et för att först kryptera hemligheten med hjälp av nyckelkrypteringsnyckeln. Utdata från den här wrap-åtgärden är en base64 URL-kodad sträng som du sedan kan ladda upp som en hemlighet med hjälp av cmdleten Set-AzKeyVaultSecret .

    # This is the passphrase that was provided for encryption during the distribution installation
    $passphrase = "contoso-password"

    Add-AzKeyVaultKey -VaultName $KeyVaultName -Name "keyencryptionkey" -Destination Software
    $KeyEncryptionKey = Get-AzKeyVaultKey -VaultName $KeyVault.OriginalVault.Name -Name "keyencryptionkey"

    $apiversion = "2015-06-01"

    ##############################
    # Get Auth URI
    ##############################

    $uri = $KeyVault.VaultUri + "/keys"
    $headers = @{}

    $response = try { Invoke-RestMethod -Method GET -Uri $uri -Headers $headers } catch { $_.Exception.Response }

    $authHeader = $response.Headers["www-authenticate"]
    $authUri = [regex]::match($authHeader, 'authorization="(.*?)"').Groups[1].Value

    Write-Host "Got Auth URI successfully"

    ##############################
    # Get Auth Token
    ##############################

    $uri = $authUri + "/oauth2/token"
    $body = "grant_type=client_credentials"
    $body += "&client_id=" + $AadClientId
    $body += "&client_secret=" + [Uri]::EscapeDataString($AadClientSecret)
    $body += "&resource=" + [Uri]::EscapeDataString("https://vault.azure.net")
    $headers = @{}

    $response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers -Body $body

    $access_token = $response.access_token

    Write-Host "Got Auth Token successfully"

    ##############################
    # Get KEK info
    ##############################

    $uri = $KeyEncryptionKey.Id + "?api-version=" + $apiversion
    $headers = @{"Authorization" = "Bearer " + $access_token}

    $response = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers

    $keyid = $response.key.kid

    Write-Host "Got KEK info successfully"

    ##############################
    # Encrypt passphrase using KEK
    ##############################

    $passphraseB64 = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Passphrase))
    $uri = $keyid + "/encrypt?api-version=" + $apiversion
    $headers = @{"Authorization" = "Bearer " + $access_token; "Content-Type" = "application/json"}
    $bodyObj = @{"alg" = "RSA-OAEP"; "value" = $passphraseB64}
    $body = $bodyObj | ConvertTo-Json

    $response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers -Body $body

    $wrappedSecret = $response.value

    Write-Host "Encrypted passphrase successfully"

    ##############################
    # Store secret
    ##############################

    $secretName = [guid]::NewGuid().ToString()
    $uri = $KeyVault.VaultUri + "/secrets/" + $secretName + "?api-version=" + $apiversion
    $secretAttributes = @{"enabled" = $true}
    $secretTags = @{"DiskEncryptionKeyEncryptionAlgorithm" = "RSA-OAEP"; "DiskEncryptionKeyFileName" = "LinuxPassPhraseFileName"}
    $headers = @{"Authorization" = "Bearer " + $access_token; "Content-Type" = "application/json"}
    $bodyObj = @{"value" = $wrappedSecret; "attributes" = $secretAttributes; "tags" = $secretTags}
    $body = $bodyObj | ConvertTo-Json

    $response = Invoke-RestMethod -Method PUT -Uri $uri -Headers $headers -Body $body

    Write-Host "Stored secret successfully"

    $secretUrl = $response.id

Använd $KeyEncryptionKey och $secretUrl i nästa steg för att ansluta OS-disken med hjälp av KEK.

Ange en hemlig URL när du ansluter en OS-disk

Utan att använda en KEK

När du ansluter OS-disken måste du skicka $secretUrl. URL:en genererades i avsnittet "Diskkrypteringshemlighet inte krypterad med en KEK".

    Set-AzVMOSDisk `
            -VM $VirtualMachine `
            -Name $OSDiskName `
            -SourceImageUri $VhdUri `
            -VhdUri $OSDiskUri `
            -Linux `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl

Använda en KEK

När du ansluter OS-disken skickar $KeyEncryptionKey du och $secretUrl. URL:en genererades i avsnittet "Diskkrypteringshemlighet krypterad med en KEK".

    Set-AzVMOSDisk `
            -VM $VirtualMachine `
            -Name $OSDiskName `
            -SourceImageUri $CopiedTemplateBlobUri `
            -VhdUri $OSDiskUri `
            -Linux `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl `
            -KeyEncryptionKeyVaultId $KeyVault.ResourceId `
            -KeyEncryptionKeyURL $KeyEncryptionKey.Id