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

Upozornění

Tento článek odkazuje na CentOS, linuxovou distribuci, která se blíží stavu Konec životnosti (EOL). Zvažte své použití a odpovídajícím způsobem naplánujte. Další informace najdete v doprovodných materiálech CentOS End Of Life.

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 bez AAD s výjimkou případů, kdy je uvedeno.

Ukázkové skripty PowerShellu pro Azure Disk Encryption

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, které parametry je možné použít ve skriptu PowerShellu:

Parametr Popis Povinné?
$resourceGroupName Název skupiny prostředků, do které keyVault patří. Pokud neexistuje, vytvoří se nová skupina prostředků s tímto názvem. True
$keyVaultName Název služby KeyVault, do které se mají umístit šifrovací klíče. Pokud neexistuje, vytvoří se nový trezor s tímto názvem. True
$location Umístění služby KeyVault Ujistěte se, že služba KeyVault a virtuální počítače, které se mají šifrovat, jsou ve stejném umístění. Seznam umístění získáte pomocí rutiny Get-AzLocation. True
$subscriptionId Identifikátor předplatného Azure, které se má použít. Své ID předplatného můžete získat pomocí rutiny Get-AzSubscription. True
$aadAppName Název aplikace Microsoft Entra, která se použije k zápisu tajných kódů do služby KeyVault. Pokud aplikace se zadaným názvem neexistuje, vytvoří se nová. Pokud tato aplikace již existuje, předejte do skriptu parametr aadClientSecret. False
$aadClientSecret Tajný klíč klienta aplikace Microsoft Entra, která byla vytvořena dříve. False
$keyEncryptionKeyName Název volitelného šifrovacího klíče ve službě KeyVault Pokud neexistuje, vytvoří se nový klíč s tímto názvem. False

Šifrování nebo dešifrování virtuálních počítačů 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

  • Virtuální počítač musí používat distribuci kompatibilní se šifrováním disků s operačním systémem, jak je uvedeno v podporovaných operačních systémech Azure Disk Encryption.
  • Virtuální počítač se musí vytvořit z image Marketplace v Azure Resource Manageru.
  • Virtuální počítač Azure s minimálně 4 GB paměti RAM (doporučená velikost je 7 GB). Další informace najdete v požadavcích na paměť .
  • (Pro RHEL a CentOS) Zakažte SELinux. Pokud chcete zakázat SELinux, přečtěte si téma 4.4.2. Zakázání SELinuxu v příručce uživatele SELinux a Správa istrator na virtuálním počítači.
  • Po zakázání SELinux alespoň jednou restartujte virtuální počítač.

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žít UUID=... zadat datové jednotky 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:

    Všechny procesy uživatelského prostoru, které nejsou spuštěny jako systemd služby, by měly být zabity SIGKILLpomocí . 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. Po zobrazení Rutiny Get-AzVmDiskEncryptionStatus se zobrazí VMRestartPending, restartujte virtuální počítač buď přihlášením, nebo pomocí portálu, PowerShellu nebo rozhraní příkazového řádku.

    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 doporučujeme uložit 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
    

    Po spuštění šifrování disku s operačním systémem trvá přibližně 40 až 50 minut na virtuálním počítači se službou Premium Storage.

    Kvůli problému č. 388 v agentu WALinuxAgent OsVolumeEncrypted se DataVolumesEncrypted zobrazí jako Unknown v některých distribucích. 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 protokol rozšíření z:

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

    Doporučujeme, abyste se při šifrování operačního systému nepřihlašoval k virtuálnímu počítači. Protokoly zkopírujte pouze v případech, kdy selhaly další dvě metody.

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 kořenovou jednotku.

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

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

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

  4. Dokončete dě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ě nespustíte poslední krok (zrušení zřízení 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 aktualizaci initramfs, aby se projevil.keyscript

  6. Teď můžete zrušit zřízení virtuálního počítače.

    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 se ujistěte, že při vytváření tajného kódu v trezoru klíčů jsou nastavené 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ž tajný klíč nahrajete do trezoru klíčů, můžete ho volitelně zašifrovat pomocí šifrovacího klíče 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 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.

Zadání adresy URL tajného kódu při připojení disku s operačním systémem

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 vygenerovala 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 vygenerovala 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