Azure Disk Encryption-voorbeeldscripts voor Linux-VM's

Let op

In dit artikel wordt verwezen naar CentOS, een Linux-distributie die de status End Of Life (EOL) nadert. Houd rekening met uw gebruik en plan dienovereenkomstig. Zie de Richtlijnen voor het einde van de levensduur van CentOS voor meer informatie.

Van toepassing op: ✔️ Flexibele schaalsets voor Linux-VM's ✔️

Dit artikel bevat voorbeeldscripts voor het voorbereiden van vooraf versleutelde VHD's en andere taken.

Notitie

Alle scripts verwijzen naar de nieuwste, niet-AAD-versie van ADE, behalve waar vermeld.

PowerShell-voorbeeldscripts voor Azure Disk Encryption

  • Alle versleutelde VM's in uw abonnement weergeven

    U vindt alle met ADE versleutelde VM's en de extensieversie, in alle resourcegroepen die aanwezig zijn in een abonnement, met behulp van dit PowerShell-script.

    Deze cmdlets bevatten ook alle met ADE versleutelde VM's (maar niet de extensieversie):

    $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}
    
  • Alle versleutelde VMSS-exemplaren in uw abonnement weergeven

    U vindt alle met ADE versleutelde VMSS-exemplaren en de extensieversie, in alle resourcegroepen die aanwezig zijn in een abonnement, met behulp van dit PowerShell-script.

  • Een lijst weergeven van alle schijfversleutelingsgeheimen die worden gebruikt voor het versleutelen van VM's in een sleutelkluis

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

Het PowerShell-script met vereisten voor Azure Disk Encryption gebruiken

Als u al bekend bent met de vereisten voor Azure Disk Encryption, kunt u het PowerShell-script voor Azure Disk Encryption gebruiken. Zie de quickstart Een VM versleutelen voor een voorbeeld van het gebruik van dit PowerShell-script. U kunt de opmerkingen verwijderen uit een sectie van het script, te beginnen bij regel 211, om alle schijven voor bestaande VM's in een bestaande resourcegroep te versleutelen.

In de volgende tabel ziet u welke parameters kunnen worden gebruikt in het PowerShell-script:

Parameter Description Verplicht?
$resourceGroupName Naam van de resourcegroep waartoe KeyVault behoort. Er wordt een nieuwe resourcegroep met deze naam gemaakt als deze niet bestaat. Waar
$keyVaultName Naam van de KeyVault waarin versleutelingssleutels moeten worden geplaatst. Er wordt een nieuwe kluis met deze naam gemaakt als deze niet bestaat. Waar
$location Locatie van de KeyVault. Zorg ervoor dat de KeyVault- en VM's die moeten worden versleuteld zich op dezelfde locatie bevinden. Haal een locatielijst op met Get-AzLocation. Waar
$subscriptionId Id van het Azure-abonnement dat moet worden gebruikt. U kunt uw abonnements-ID ophalen met Get-AzSubscription. Waar
$aadAppName De naam van de Microsoft Entra-toepassing die wordt gebruikt om geheimen naar KeyVault te schrijven. Als er nog geen toepassing met deze naam bestaat, wordt deze aangemaakt. Als deze app al bestaat, geeft u de parameter aadClientSecret door aan het script. Onwaar
$aadClientSecret Clientgeheim van de Microsoft Entra-toepassing die eerder is gemaakt. Onwaar
$keyEncryptionKeyName Naam van optionele sleutelversleutelingssleutel in KeyVault. Er wordt een nieuwe sleutel met deze naam gemaakt als deze niet bestaat. Onwaar

VM's versleutelen of ontsleutelen zonder een Microsoft Entra-app

VM's versleutelen of ontsleutelen met een Microsoft Entra-app (vorige release)

Een besturingssysteemstation versleutelen op een actieve Linux-VM

Vereisten voor besturingssysteemschijfversleuteling

  • De VIRTUELE machine moet een distributie gebruiken die compatibel is met besturingssysteemschijfversleuteling, zoals vermeld in de ondersteunde besturingssystemen van Azure Disk Encryption
  • De VIRTUELE machine moet worden gemaakt op basis van de Marketplace-installatiekopieën in Azure Resource Manager.
  • Azure VM met ten minste 4 GB RAM-geheugen (aanbevolen grootte is 7 GB). Zie Geheugenvereisten voor meer informatie.
  • (Voor RHEL en CentOS) Schakel SELinux uit. Zie '4.4.2' als u SELinux wilt uitschakelen. SeLinux uitschakelen in de gebruikershandleiding van SELinux en Beheer istrator op de virtuele machine.
  • Nadat u SELinux hebt uitgeschakeld, start u de VM ten minste één keer opnieuw op.

Stappen

  1. Maak een virtuele machine met behulp van een van de eerder opgegeven distributies.

  2. Configureer de VIRTUELE machine op basis van uw behoeften. Als u alle stations (OS + gegevens) gaat versleutelen, moeten de gegevensstations worden opgegeven en kunnen worden gekoppeld vanuit /etc/fstab.

    Notitie

    UUID=gebruiken... als u gegevensstations in /etc/fstab wilt opgeven in plaats van de naam van het blokapparaat op te geven (bijvoorbeeld /dev/sdb1). Tijdens de versleuteling verandert de volgorde van stations op de VIRTUELE machine. Als uw VIRTUELE machine afhankelijk is van een specifieke volgorde van blokapparaten, kan deze niet worden gekoppeld na versleuteling.

  3. Meld u af bij de SSH-sessies.

  4. Als u het besturingssysteem wilt versleutelen, geeft u volumeType op als Alles of besturingssysteem wanneer u versleuteling inschakelt.

    Notitie

    Alle gebruikersruimteprocessen die niet worden uitgevoerd als systemd services, moeten worden gedood met een SIGKILL. Start de VM opnieuw op. Wanneer u schijfversleuteling van het besturingssysteem inschakelt op een actieve VM, moet u de downtime van de VIRTUELE machine plannen.

  5. Bewaak periodiek de voortgang van versleuteling met behulp van de instructies in de volgende sectie.

  6. Nadat Get-AzVmDiskEncryptionStatus 'VMRestartPending' weergeeft, start u de VIRTUELE machine opnieuw op door u aan te melden of via de portal, PowerShell of 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
    

    Voordat u opnieuw opstart, raden we u aan opstartdiagnose van de virtuele machine op te slaan.

Voortgang van besturingssysteemversleuteling bewaken

U kunt de voortgang van besturingssysteemversleuteling op drie manieren bewaken:

  • Gebruik de Get-AzVmDiskEncryptionStatus cmdlet en inspecteer het veld ProgressMessage:

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

    Nadat de VM 'Besturingssysteemschijfversleuteling is gestart' heeft bereikt, duurt het ongeveer 40 tot 50 minuten op een vm met premium-opslag.

    Vanwege probleem #388 in WALinuxAgent en OsVolumeEncryptedDataVolumesEncrypted worden ze weergegeven als Unknown in sommige distributies. Met WALinuxAgent versie 2.1.5 en hoger wordt dit probleem automatisch opgelost. Als u de uitvoer ziet Unknown , kunt u de status van schijfversleuteling controleren met behulp van Azure Resource Explorer.

    Ga naar Azure Resource Explorer en vouw deze hiërarchie vervolgens uit in het selectiedeelvenster aan de linkerkant:

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

    Schuif in InstanceView omlaag om de versleutelingsstatus van uw stations weer te geven.

    Weergave VM-exemplaar

  • Bekijk diagnostische gegevens over opstarten. Berichten van de ADE-extensie moeten worden voorafgegaan door [AzureDiskEncryption].

  • Meld u via SSH aan bij de virtuele machine en haal het extensielogboek op van:

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

    U wordt aangeraden u niet aan te melden bij de VIRTUELE machine terwijl besturingssysteemversleuteling wordt uitgevoerd. Kopieer de logboeken alleen wanneer de andere twee methoden zijn mislukt.

Een vooraf versleutelde Linux-VHD voorbereiden

De voorbereiding voor vooraf versleutelde VHD's kan variëren, afhankelijk van de distributie. Voorbeelden van het voorbereiden van Ubuntu, openSUSE en CentOS 7 zijn beschikbaar.

Configureer versleuteling tijdens de distributie-installatie door de volgende stappen uit te voeren:

  1. Selecteer Versleutelde volumes configureren wanneer u de schijven partitioneert.

    Installatie van Ubuntu 16.04 - Versleutelde volumes configureren

  2. Maak een afzonderlijk opstartstation dat niet mag worden versleuteld. Versleutel uw hoofdstation.

    Installatie van Ubuntu 16.04 - Apparaten selecteren die u wilt versleutelen

  3. Geef een wachtwoordzin op. Dit is de wachtwoordzin die u hebt geüpload naar de sleutelkluis.

    Installatie van Ubuntu 16.04 - Wachtwoordzin opgeven

  4. Partitionering voltooien.

    Ubuntu 16.04 Setup - Partitionering voltooien

  5. Wanneer u de VIRTUELE machine opstart en wordt gevraagd om een wachtwoordzin, gebruikt u de wachtwoordzin die u in stap 3 hebt opgegeven.

    Installatie van Ubuntu 16.04 - Wachtwoordzin opgeven bij opstarten

  6. Bereid de VIRTUELE machine voor op uploaden naar Azure met behulp van deze instructies. Voer de laatste stap (het ongedaan maken van de inrichting van de VIRTUELE machine) nog niet uit.

Configureer versleuteling om met Azure te werken door de volgende stappen uit te voeren:

  1. Maak een bestand onder /usr/local/sbin/azure_crypt_key.sh, met de inhoud in het volgende script. Let op de KeyFileName, omdat dit de wachtwoordzinbestandsnaam is die wordt gebruikt door 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. Wijzig de configuratie van de crypt in /etc/crypttab. Dit ziet er als volgt uit:

     xxx_crypt uuid=xxxxxxxxxxxxxxxxxxxxx none luks,discard,keyscript=/usr/local/sbin/azure_crypt_key.sh
    
  3. Uitvoerbare machtigingen toevoegen aan het script:

     sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
    
  4. Bewerken /etc/initramfs-tools/modules door regels toe te voegen:

     vfat
     ntfs
     nls_cp437
     nls_utf8
     nls_iso8859-1
    
  5. Voer update-initramfs -u -k all deze opdracht uit om de initramfs bij te werken om de keyscript initramfs van kracht te laten worden.

  6. U kunt de inrichting van de VIRTUELE machine nu ongedaan maken.

    Installatie van Ubuntu 16.04 - update-initramfs

  7. Ga door naar de volgende stap en upload uw VHD naar Azure.

Versleutelde VHD uploaden naar een Azure-opslagaccount

Nadat DM-Crypt-versleuteling is ingeschakeld, moet de lokale versleutelde VHD worden geüpload naar uw opslagaccount.

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

Upload het geheim voor de vooraf versleutelde VM naar uw sleutelkluis

Wanneer u versleutelt met behulp van een Microsoft Entra-app (vorige versie), moet het eerder verkregen schijfversleutelingsgeheim worden geüpload als een geheim in uw sleutelkluis. Voor de sleutelkluis moet schijfversleuteling en -machtigingen zijn ingeschakeld voor uw Microsoft Entra-client.

 $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

Schijfversleutelingsgeheim niet versleuteld met een KEK

Als u het geheim in uw sleutelkluis wilt instellen, gebruikt u Set-AzKeyVaultSecret. De wachtwoordzin wordt gecodeerd als een base64-tekenreeks en vervolgens geüpload naar de sleutelkluis. Zorg er bovendien voor dat de volgende tags zijn ingesteld wanneer u het geheim in de sleutelkluis maakt.


 # 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

Gebruik de $secretUrl volgende stap voor het koppelen van de besturingssysteemschijf zonder KEK.

Schijfversleutelingsgeheim versleuteld met een KEK

Voordat u het geheim uploadt naar de sleutelkluis, kunt u het desgewenst versleutelen met behulp van een sleutelversleutelingssleutel. Gebruik de wrap-API om het geheim eerst te versleutelen met behulp van de sleutelversleutelingssleutel. De uitvoer van deze wrap-bewerking is een met base64 URL gecodeerde tekenreeks, die u vervolgens kunt uploaden als een geheim met behulp van de Set-AzKeyVaultSecret cmdlet.

    # 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

Gebruik $KeyEncryptionKey en $secretUrl in de volgende stap voor het koppelen van de besturingssysteemschijf met behulp van KEK.

Een geheime URL opgeven wanneer u een besturingssysteemschijf koppelt

Zonder een KEK te gebruiken

Terwijl u de besturingssysteemschijf koppelt, moet u doorgeven $secretUrl. De URL is gegenereerd in de sectie Schijfversleutelingsgeheim niet versleuteld met een KEK.

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

Een KEK gebruiken

Wanneer u de besturingssysteemschijf koppelt, geeft u door $KeyEncryptionKey en $secretUrl. De URL is gegenereerd in de sectie Schijfversleutelingsgeheim versleuteld met een 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