Teilen über


Azure Disk Encryption-Beispielskripts für virtuelle Linux-Computer

Achtung

Dieser Artikel bezieht sich auf CentOS, eine Linux-Distribution, deren Dienstende (End-of-Life, EOL) ansteht. Sie sollten Ihre Nutzung entsprechend planen. Weitere Informationen finden Sie im CentOS-Leitfaden für das Lebensende.

Gilt für: ✔️ Linux-VMs ✔️ Flexible Skalierungsgruppen

Dieser Artikel bietet Beispielskripts für die Vorbereitung vorab verschlüsselter VHDs und andere Aufgaben.

Hinweis

Alle Skripte beziehen sich auf die neueste, Nicht-AAD-Version von ADE, sofern nicht anders angegeben.

PowerShell-Beispielskripts für Azure Disk Encryption

  • Auflisten aller verschlüsselten VMs Ihres Abonnements

    Sie finden alle mit ADE verschlüsselten VMs und die Erweiterungsversion in allen Ressourcengruppen, die in einem Abonnement vorhanden sind, mit diesem PowerShell-Skript.

    Alternativ zeigen diese Cmdlets alle mit ADE verschlüsselten VMs an (jedoch nicht die Erweiterungsversion):

    $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}
    
  • Auflisten aller verschlüsselten VMSS-Instanzen in Ihrem Abonnement

    Sie finden alle mit ADE verschlüsselten VMSS-Instanzen und die Erweiterungsversion in allen Ressourcengruppen, die in einem Abonnement vorhanden sind, mit diesem PowerShell-Skript.

  • Auflisten aller Geheimnisse der Datenträgerverschlüsselung, die zum Verschlüsseln von VMs in einem Schlüsseltresor verwendet werden

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

Verwenden des PowerShell-Skripts für die Voraussetzungen für Azure Disk Encryption

Wenn Sie bereits mit den Voraussetzungen für Azure Disk Encryption vertraut sind, können Sie das PowerShell-Skript zur Überprüfung der Azure Disk Encryption-Voraussetzungen verwenden. Ein Beispiel für die Verwendung dieses PowerShell-Skripts finden Sie im Schnellstart: Verschlüsseln einer VM. Sie können die Kommentare aus einem Abschnitt des Skripts, beginnend ab Zeile 211, entfernen, um alle Datenträger für vorhandene virtuelle Computer in einer vorhandenen Ressourcengruppe zu verschlüsseln.

Die folgende Tabelle zeigt, welche Parameter im PowerShell-Skript verwendet werden können:

Parameter BESCHREIBUNG Erforderlich?
$resourceGroupName Name der Ressourcengruppe, zu der der Schlüsseltresor gehört. Sofern noch nicht vorhanden, wird eine neue Ressourcengruppe mit diesem Namen erstellt. True
$keyVaultName Name des Schlüsseltresors, in dem Verschlüsselungsschlüssel platziert werden sollen. Sofern noch nicht vorhanden, wird ein neuer Tresor mit diesem Namen erstellt. True
$location Standort des Schlüsseltresors. Der Schlüsseltresor und die zu verschlüsselnden virtuellen Computer müssen sich am gleichen Standort befinden. Mit Get-AzLocation können Sie eine Standortliste abrufen. True
$subscriptionId Bezeichner des zu verwendenden Azure-Abonnements. Die Abonnement-ID kann mit Get-AzSubscription abgerufen werden. True
$aadAppName Name der Microsoft Entra-Anwendung, die zum Schreiben von Geheimnissen in den Schlüsseltresor verwendet wird Sofern noch nicht vorhanden, wird eine neue Anwendung mit diesem Namen erstellt. Wenn diese App bereits vorhanden ist, übergeben Sie den Parameter aadClientSecret an das Skript. False
$aadClientSecret Geheimer Clientschlüssel der zuvor erstellten Microsoft Entra-Anwendung False
$keyEncryptionKeyName Name des optionalen Schlüssels für die Schlüsselverschlüsselung in Key Vault. Sofern noch nicht vorhanden, wird ein neuer Schlüssel mit diesem Namen erstellt. False

Verschlüsseln oder Entschlüsseln von VMs ohne Microsoft Entra-App

Verschlüsseln oder Entschlüsseln von VMs mit einer Microsoft Entra-App (vorheriges Release)

Verschlüsseln eines Betriebssystemdatenträgers auf einer ausgeführten Linux-VM

Voraussetzungen für die Verschlüsselung des Betriebssystemdatenträgers

  • Die VM muss eine Distribution verwenden, die mit der Verschlüsselung von Betriebssystemdatenträgern kompatibel ist. Eine Liste dieser Distributionen finden Sie unter Von Azure Disk Encryption unterstützte Betriebssysteme.
  • Die VM muss über ein Marketplace-Image im Azure Resource Manager erstellt werden.
  • Azure-VM mit mindestens 4 GB RAM (7 GB empfohlen). Weitere Informationen finden Sie unter Arbeitsspeicheranforderungen.
  • (Für RHEL und CentOS) Deaktivieren Sie SELinux. Informationen zum Deaktivieren von SELinux finden Sie unter „4.4.2. Disabling SELinux“ (Deaktivieren von SELinux) im SELinux User's and Administrator's Guide (SELinux-Handbuch für Benutzer und Administratoren) in der VM.
  • Die VM muss nach dem Deaktivieren von SELinux mindestens einmal neu gestartet werden.

Schritte

  1. Erstellen Sie eine VM mit einer der oben angegebenen Distributionen.

  2. Konfigurieren Sie die VM gemäß Ihren Anforderungen. Wenn Sie alle Datenträger (für Betriebssystem und Daten) verschlüsseln möchten, müssen die Datenträger für Daten angegeben und über „/etc/fstab“ bereitgestellt werden.

    Hinweis

    Verwenden Sie „UUID=...“, um Datenlaufwerke nicht über den Blockgerätnamen, z.B. „/dev/sdb1“, sondern unter „/etc/fstab“ anzugeben. Während der Verschlüsselung ändert sich die Reihenfolge der Laufwerke auf dem virtuellen Computer. Wenn für Ihren virtuellen Computer eine bestimmte Reihenfolge der Blockgeräte erforderlich ist, funktioniert die Bereitstellung nach der Verschlüsselung nicht mehr.

  3. Melden Sie sich bei den SSH-Sitzungen ab.

  4. Geben Sie zum Verschlüsseln des Betriebssystems für „volumeType“ die Option All oder OS an, wenn Sie die Verschlüsselung aktivieren.

    Hinweis

    Alle Prozesse des Benutzerbereichs, die nicht als systemd-Dienste ausgeführt werden, müssen per SIGKILL beendet werden. Starten Sie die VM neu. Planen Sie für den virtuellen Computer eine Downtime ein, wenn Sie die Verschlüsselung des Betriebssystemdatenträgers auf einem ausgeführten virtuellen Computer aktivieren.

  5. Überprüfen Sie den Fortschritt der Verschlüsselung in regelmäßigen Abständen, indem Sie die Anleitung im nächsten Abschnitt befolgen.

  6. Wenn für „Get-AzVmDiskEncryptionStatus“ der Status „VMRestartPending“ angezeigt wird, können Sie die VM neu starten, indem Sie sich entweder bei der VM anmelden oder die Anmeldung per Portal, PowerShell oder CLI durchführen.

    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
    

    Es wird empfohlen, vor dem Neustart die Startdiagnose zu speichern.

Überwachen des Fortschritts der Betriebssystemverschlüsselung

Es gibt drei Möglichkeiten, den Fortschritt der Betriebssystemverschlüsselung zu überwachen:

  • Verwenden Sie das Get-AzVmDiskEncryptionStatus-Cmdlet, und untersuchen Sie das Feld „ProgressMessage“:

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

    Wenn die VM den Status „OS disk encryption started“ erreicht hat, dauert der Vorgang auf einer VM mit Premium-Speicher ca. 40 bis 50 Minuten.

    Aufgrund von Issue #388 in WALinuxAgent werden OsVolumeEncrypted und DataVolumesEncrypted in einigen Distributionen als Unknown angezeigt. Bei WALinuxAgent Version 2.1.5 und höher wird dieses Problem automatisch behoben. Falls Sie Unknown in der Ausgabe sehen, können Sie den Status der Datenverschlüsselung über den Azure-Ressourcen-Explorer überprüfen.

    Wechseln Sie zum Azure-Ressourcen-Explorer, und erweitern Sie diese Hierarchie im Auswahlbereich auf der linken Seite:

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

    Scrollen Sie unter „InstanceView“ nach unten, um den Verschlüsselungsstatus Ihrer Laufwerke anzuzeigen.

    VM-Instanzanzeige

  • Sehen Sie sich die Startdiagnose an. Meldungen der ADE-Erweiterung weisen das Präfix [AzureDiskEncryption] auf.

  • Melden Sie sich per SSH bei der VM an, und rufen Sie das Erweiterungsprotokoll ab:

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

    Es wird empfohlen, sich nicht bei der VM anzumelden, während die Betriebssystemverschlüsselung durchgeführt wird. Kopieren Sie die Protokolle nur dann, wenn die zwei weiteren Methoden nicht zum Erfolg geführt haben.

Vorbereiten einer vorverschlüsselten Linux-VHD

Die Vorbereitung für vorverschlüsselte VHDs kann je nach Distribution variieren. Es sind Beispiele zur Vorbereitung von Ubuntu, openSUSE und CentOS 7 verfügbar.

Konfigurieren Sie die Verschlüsselung während der Installation einer Distribution, indem Sie die folgenden Schritte ausführen:

  1. Wählen Sie beim Partitionieren von Datenträgern die Option Configure encrypted volumes (Verschlüsselte Volumes konfigurieren).

    Ubuntu 16.04-Setup: Konfigurieren verschlüsselter Volumes

  2. Erstellen Sie ein separates Startlaufwerk, das nicht verschlüsselt sein darf. Verschlüsseln Sie Ihr Stammlaufwerk.

    Ubuntu 16.04-Setup: Geräte für Verschlüsselung auswählen

  3. Geben Sie eine Passphrase an. Dies ist die Passphrase, die Sie in den Schlüsseltresor hochgeladen haben.

    Ubuntu 16.04-Setup: Passphrase angeben

  4. Schließen Sie die Partitionierung ab.

    Ubuntu 16.04-Setup: Partitionierung abschließen

  5. Beim Starten der VM werden Sie nach einer Passphrase gefragt. Verwenden Sie die Passphrase, die Sie in Schritt 3 angegeben haben.

    Ubuntu 16.04-Setup: Passphrase beim Starten angeben

  6. Bereiten Sie die VM für das Hochladen in Azure anhand dieser Anleitung vor. Führen Sie den letzten Schritt (das Aufheben der VM-Bereitstellung) noch nicht aus.

Konfigurieren Sie die Verschlüsselung für Azure, indem Sie die folgenden Schritte ausführen:

  1. Erstellen Sie eine Datei unter /usr/local/sbin/azure_crypt_key.sh mit dem Inhalt des folgenden Skripts. Achten Sie auf KeyFileName, da dies der von Azure verwendete Dateiname für die Passphrase ist.

    #!/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. Ändern Sie die Verschlüsselungskonfiguration in /etc/crypttab. Diese sollte wie folgt aussehen:

     xxx_crypt uuid=xxxxxxxxxxxxxxxxxxxxx none luks,discard,keyscript=/usr/local/sbin/azure_crypt_key.sh
    
  3. Fügen Sie dem Skript Berechtigungen für die Ausführung hinzu:

     sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
    
  4. Bearbeiten Sie /etc/initramfs-tools/modules, indem Sie Zeilen anfügen:

     vfat
     ntfs
     nls_cp437
     nls_utf8
     nls_iso8859-1
    
  5. Führen Sie update-initramfs -u -k all zum Aktualisieren von „initramfs“ aus, damit keyscript wirksam wird.

  6. Nun können Sie die Bereitstellung des virtuellen Computers aufheben.

    Ubuntu 16.04-Setup: initramfs aktualisieren

  7. Fahren Sie mit dem nächsten Schritt fort, und laden Sie Ihre VHD in Azure hoch.

Hochladen einer verschlüsselten VHD in ein Azure-Speicherkonto

Nachdem die DM-Crypt-Verschlüsselung aktiviert wurde, muss die lokale verschlüsselte VHD in Ihr Speicherkonto hochgeladen werden.

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

Hochladen des Geheimnisses für den vorab verschlüsselten virtuellen Computer in Ihren Schlüsseltresor

Beim Verschlüsseln mit einer Microsoft Entra-App (früheres Release) muss das zuvor abgerufene Geheimnis zur Datenträgerverschlüsselung als Geheimnis in den Schlüsseltresor hochgeladen werden. Der Schlüsseltresor muss für die Datenverschlüsselung aktiviert sein und über Berechtigungen für Ihren Microsoft Entra-Client verfügen.

 $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

Geheimnis der Datenträgerverschlüsselung ohne Verschlüsselung per KEK

Verwenden Sie Set-AzKeyVaultSecret, um das Geheimnis im Schlüsseltresor einzurichten. Die Passphrase wird als Base64-Zeichenfolge codiert und dann in den Schlüsseltresor hochgeladen. Stellen Sie außerdem sicher, dass die folgenden Tags festgelegt sind, während das Geheimnis im Schlüsseltresor erstellt wird.


 # 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

Verwenden Sie im nächsten Schritt $secretUrl, um den Betriebssystemdatenträger ohne KEK anzufügen.

Geheimnis der Datenträgerverschlüsselung mit Verschlüsselung per KEK

Das Geheimnis kann optional mit einem KEK verschlüsselt werden, bevor er in den Schlüsseltresor hochgeladen wird. Verwenden Sie die Wrapper-API, um das Geheimnis zuerst mit dem KEK zu verschlüsseln. Die Ausgabe dieses Wrapper-Vorgangs ist eine Base64-codierte URL-Zeichenfolge, die dann als Geheimnis mit dem Set-AzKeyVaultSecret-Cmdlet hochgeladen wird.

    # 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

Verwenden Sie im nächsten Schritt $KeyEncryptionKey und $secretUrl, um den Betriebssystemdatenträger mit KEK anzufügen.

Angeben einer Geheimnis-URL beim Anfügen eines Betriebssystemdatenträgers

Ohne KEK

Beim Anfügen des Betriebssystemdatenträgers muss $secretUrl übergeben werden. Die URL wurde im Abschnitt „Geheimnis der Datenträgerverschlüsselung ohne Verschlüsselung per KEK“ generiert.

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

Mit KEK

Beim Anfügen des Betriebssystemdatenträgers müssen $KeyEncryptionKey und $secretUrl übergeben werden. Die URL wurde im Abschnitt „Geheimnis der Datenträgerverschlüsselung mit Verschlüsselung per KEK“ generiert.

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