Ukázkové skripty azure Disk Encryption pro virtuální počítače s Linuxem

Důležité

15. září 2028 je naplánované vyřazení služby Azure Disk Encryption. Do tohoto data můžete dál používat Službu Azure Disk Encryption bez přerušení. 15. září 2028 se úlohy s podporou ADE budou dál spouštět, ale šifrované disky se po restartování virtuálního počítače nepodaří odemknout, což vede k přerušení služeb.

Pro nové virtuální počítače používejte šifrování na hostiteli nebo zvažte velikosti důvěrných virtuálních počítačů s šifrováním disku s operačním systémem pro důvěrné výpočetní úlohy. Všechny virtuální počítače s podporou ADE (včetně záloh) se musí migrovat na šifrování na hostiteli před datem vyřazení, aby nedošlo k přerušení služeb. Podrobnosti najdete v tématu Migrace ze služby Azure Disk Encryption na šifrování na hostiteli .

Upozornění

Tento článek odkazuje na CentOS, což je linuxová distribuce, která je ve stavu ukončení životnosti (EOL). Zvažte své použití a naplánujte podle toho. Další informace najdete v doprovodných materiálech k ukončení životnosti CentOS.

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

Tento článek obsahuje ukázkové skripty pro přípravu předšifrovaných virtuálních pevných disků a dalších úloh.

Poznámka:

Všechny skripty odkazují na nejnovější verzi ADE, která není Microsoft Entra ID, s výjimkou případů, kdy je uvedeno.

Ukázkové skripty PowerShellu pro Azure Disk Encryption

  • Výpis všech šifrovaných virtuálních počítačů ve vašem předplatném

    Pomocí tohoto skriptu PowerShellu najdete všechny virtuální počítače šifrované pomocí ADE a verze rozšíření ve všech skupinách prostředků, které jsou přítomné v předplatném.

    Alternativně tyto rutiny zobrazí všechny virtuální počítače šifrované pomocí ADE (ale ne verze rozšíření):

    $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}
    
  • Výpis všech šifrovaných instancí VMSS ve vašem předplatném

    Pomocí tohoto skriptu PowerShell můžete ve všech skupinách prostředků v předplatném nalézt všechny instance VMSS šifrované pomocí ADE a verzi rozšíření.

  • Výpis všech tajných kódů šifrování disků používaných k šifrování virtuálních počítačů v trezoru klíčů

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

Použití skriptu PowerShellu pro požadavky služby Azure Disk Encryption

Pokud už znáte požadavky služby Azure Disk Encryption, můžete použít skript PowerShellu s požadavky služby Azure Disk Encryption. Příklad použití tohoto skriptu PowerShellu najdete v rychlém startu Šifrování virtuálního počítače. Komentáře můžete odebrat z oddílu skriptu počínaje řádkem 211 a zašifrovat všechny disky pro existující virtuální počítače v existující skupině prostředků.

Následující tabulka ukazuje parametry, které můžete použít ve skriptu PowerShellu:

Parametr Popis Povinné?
$resourceGroupName Název skupiny prostředků, do které patří služba KeyVault. Skript vytvoří novou skupinu prostředků s tímto názvem, pokud neexistuje. Pravda
$keyVaultName Název služby KeyVault, do které se mají umístit šifrovací klíče. Skript vytvoří nový trezor s tímto názvem, pokud neexistuje. Pravda
$location Umístění služby KeyVault Ověřte, že služba KeyVault a virtuální počítače, které se mají šifrovat, jsou ve stejném umístění. Získejte seznam lokací pomocí Get-AzLocation. Pravda
$subscriptionId Identifikátor Azure předplatného, které se má použít. Získejte ID předplatného pomocí Get-AzSubscription. Pravda
$aadAppName Název aplikace Microsoft Entra, která zapisuje tajné kódy do služby KeyVault. Skript vytvoří novou aplikaci s tímto názvem, pokud neexistuje. Pokud tato aplikace již existuje, předejte do skriptu parametr aadClientSecret. Nepravda
$aadClientSecret Tajný klíč klienta aplikace Microsoft Entra, která byla vytvořena dříve. Nepravda
$keyEncryptionKeyName Název volitelného šifrovacího klíče ve službě KeyVault Skript vytvoří nový klíč s tímto názvem, pokud neexistuje. Nepravda

Šifrujte nebo dešifrujte virtuální počítače bez aplikace Microsoft Entra

Šifrování nebo dešifrování virtuálních počítačů pomocí aplikace Microsoft Entra (předchozí verze)

Šifrování jednotky operačního systému na běžícím virtuálním počítači s Linuxem

Požadavky na šifrování disků s operačním systémem

Kroky

  1. Vytvořte virtuální počítač pomocí jedné z dříve zadaných distribucí.

  2. Nakonfigurujte virtuální počítač podle svých potřeb. Pokud šifrujete všechny jednotky s operačním systémem a daty, musí být datové jednotky zadané a připojitelné z /etc/fstab.

    Poznámka:

    Použijte UUID=... k zadání datových jednotek v /etc/fstab, místo zadání názvu blokového zařízení (například /dev/sdb1). Během šifrování se pořadí jednotek na virtuálním počítači změní. Pokud váš virtuální počítač spoléhá na konkrétní pořadí blokových zařízení, po šifrování je nebude možné připojit.

  3. Odhlaste se z relací SSH.

  4. Pokud chcete operační systém zašifrovat, při povolování šifrování zadejte volumeType jako Vše nebo OS .

    Poznámka:

    Ukončete všechny procesy uživatelského prostoru, které nejsou spuštěné jako služby systemd s parametrem SIGKILL. Restartujte virtuální počítač. Pokud povolíte šifrování disků s operačním systémem na spuštěném virtuálním počítači, naplánujte výpadek virtuálního počítače.

  5. Pravidelně monitorujte průběh šifrování pomocí pokynů v další části.

  6. Poté, co Get-AzVmDiskEncryptionStatus zobrazí "VMRestartPending", restartujte virtuální počítač buď přihlášením do něj, nebo pomocí portálu, PowerShellu či 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
    

    Před restartováním uložte diagnostiku spouštění virtuálního počítače.

Monitorování průběhu šifrování operačního systému

Průběh šifrování operačního systému můžete monitorovat třemi způsoby:

  • Použijte rutinu Get-AzVmDiskEncryptionStatus a zkontrolujte pole ProgressMessage:

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

    Jakmile je zahájeno šifrování disku OS, trvá to přibližně 40 až 50 minut na virtuálním počítači podporovaném úložištěm Premium.

    Kvůli problému č. 388 na GitHubu v agentu WALinuxAgent se OsVolumeEncrypted a DataVolumesEncrypted v některých distribucích zobrazují jako Unknown. U waLinuxAgent verze 2.1.5 a novější se tento problém opraví automaticky. Pokud se ve výstupu zobrazí Unknown , můžete pomocí Azure Resource Exploreru ověřit stav šifrování disku.

    Přejděte do Azure Resource Exploreru a pak rozbalte tuto hierarchii na panelu výběru vlevo:

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

    V zobrazení InstanceView se posuňte dolů, abyste viděli stav šifrování jednotek.

    Zobrazení instance virtuálního počítače

  • Prohlédněte si diagnostiku spouštění. Zprávy z rozšíření ADE by měly mít předponu [AzureDiskEncryption].

  • Přihlaste se k virtuálnímu počítači přes SSH a získejte log rozšíření zde:

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

    Během šifrování operačního systému se k virtuálnímu počítači nepřihlašujte. Protokoly zkopírujte pouze v případech, kdy ostatní dvě metody selžou.

Příprava předšifrovaného virtuálního pevného disku s Linuxem

Příprava předšifrovaných virtuálních pevných disků se může lišit v závislosti na distribuci. Příklady přípravy Ubuntu, openSUSE a CentOS 7 jsou k dispozici.

Při instalaci distribuce nakonfigurujte šifrování pomocí následujících kroků:

  1. Při dělení disků vyberte Konfigurovat šifrované svazky .

    Nastavení Ubuntu 16.04 – Konfigurace šifrovaných svazků

  2. Vytvořte samostatnou spouštěcí jednotku, která nesmí být šifrovaná. Zašifrujte váš kořenový disk.

    Nastavení Ubuntu 16.04 – Výběr zařízení k šifrování

  3. Zadejte přístupové heslo. Toto heslo jste nahráli do trezoru klíčů.

    Nastavení Ubuntu 16.04 – Zadání přístupového hesla

  4. Dokončete rozdělení.

    Ubuntu 16.04 – Dokončení dělení

  5. Když virtuální počítač spustíte a zobrazí se výzva k zadání přístupového hesla, použijte heslo, které jste zadali v kroku 3.

    Nastavení Ubuntu 16.04 – Zadání přístupového hesla při spuštění

  6. Pomocí těchto pokynů připravte virtuální počítač na nahrání do Azure. Ještě nespouštějte poslední krok (deprovisioning virtuálního počítače).

Nakonfigurujte šifrování pro práci s Azure pomocí následujících kroků:

  1. Vytvořte v části /usr/local/sbin/azure_crypt_key.shsoubor s obsahem v následujícím skriptu. Věnujte pozornost názvu souboru KeyFileName, protože se jedná o název souboru přístupového hesla, který používá 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. Změňte konfiguraci šifrování v souboru /etc/crypttab. Měl by vypadat takto:

     xxx_crypt uuid=xxxxxxxxxxxxxxxxxxxxx none luks,discard,keyscript=/usr/local/sbin/azure_crypt_key.sh
    
  3. Přidejte do skriptu oprávnění ke spustitelnému souboru:

     sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
    
  4. Upravit /etc/initramfs-tools/modules přidáním řádků:

     vfat
     ntfs
     nls_cp437
     nls_utf8
     nls_iso8859-1
    
  5. Spusťte update-initramfs -u -k all pro aktualizaci initramfs, aby se projevil efekt keyscript.

  6. Teď můžete deaktivovat virtuální počítač.

    Nastavení Ubuntu 16.04 – update-initramfs

  7. Pokračujte dalším krokem a nahrajte virtuální pevný disk do Azure.

Nahrání šifrovaného virtuálního pevného disku do účtu úložiště Azure

Po povolení šifrování DM-Crypt je potřeba místní šifrovaný virtuální pevný disk nahrát do účtu úložiště.

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

Nahrání tajného klíče pro předšifrovaný virtuální počítač do trezoru klíčů

Při šifrování pomocí aplikace Microsoft Entra (předchozí verze) musí být tajný klíč pro šifrování disku, který jste získali dříve, nahrán jako tajný kód ve vašem trezoru klíčů. Trezor klíčů musí mít povolené šifrování disků a oprávnění pro vašeho klienta Microsoft Entra.

 $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

Tajný klíč šifrování disku není šifrovaný pomocí klíče KEK

K nastavení tajného kódu v trezoru klíčů použijte Set-AzKeyVaultSecret. Heslo se zakóduje jako řetězec base64 a pak se nahraje do trezoru klíčů. Kromě toho ověřte, že při vytváření tajného kódu v trezoru klíčů jsou nastaveny následující značky.


 # 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 Použijte v dalším kroku pro připojení disku s operačním systémem bez použití klíče KEK.

Tajný kód šifrování disku šifrovaný pomocí klíče KEK

Než nahrajete tajemství do trezoru klíčů, můžete ho volitelně zašifrovat pomocí šifrovacího klíče. Pomocí zalamovacího rozhraní API nejprve zašifrujte tajný klíč pomocí šifrovacího klíče. Výstupem této operace zabalení je řetězec kódovaný adresou URL base64, který pak můžete nahrát jako tajný kód pomocí rutiny 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 by 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

Použijte $KeyEncryptionKey a $secretUrl v dalším kroku pro připojení disku s operačním systémem pomocí klíče KEK.

Zadejte tajnou URL při připojení disku OS

Bez použití klíče KEK

Při připojování disku s operačním systémem je potřeba předat $secretUrl. Adresa URL se vygeneruje v části Tajný klíč pro šifrování disků, který není šifrovaný pomocí klíče KEK.

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

Použití klíče KEK

Když připojíte disk s operačním systémem, předejte $KeyEncryptionKey a $secretUrl. Adresa URL se vygeneruje v části "Tajný kód šifrování disku šifrovaný pomocí klíče 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