Ukázkové skripty azure Disk Encryption pro virtuální počítače s Linuxem
Upozornění
Tento článek odkazuje na CentOS, což je linuxová distribuce se stavem 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
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 PowerShellu najdete všechny instance ADE šifrované VMSS a verzi rozšíření ve všech skupinách prostředků, které jsou přítomné v předplatném.
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, 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
- Povolení šifrování disků na existujícím nebo spuštěném virtuálním počítači s Linuxem
- Zakázání šifrování na spuštěném virtuálním počítači s Linuxem
- Zakázání šifrování je povolené jenom na datových svazcích pro virtuální počítače s Linuxem.
Šifrování nebo dešifrování virtuálních počítačů pomocí aplikace Microsoft Entra (předchozí verze)
- Povolení šifrování disků na existujícím nebo spuštěném virtuálním počítači s Linuxem
- Zakázání šifrování na spuštěném virtuálním počítači s Linuxem
- Zakázání šifrování je povolené jenom na datových svazcích pro virtuální počítače s Linuxem.
- Vytvoření nového šifrovaného spravovaného disku z předem šifrovaného virtuálního pevného disku nebo objektu blob úložiště
- Vytvoří nový šifrovaný spravovaný disk, který poskytuje předšifrovaný virtuální pevný disk a odpovídající nastavení šifrování.
Š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ávce na virtuálním počítači
- Po zakázání SELinux alespoň jednou restartujte virtuální počítač.
Kroky
Vytvořte virtuální počítač pomocí jedné z dříve zadaných distribucí.
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.
Odhlaste se z relací SSH.
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 zabitySIGKILL
pomocí . 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.Pravidelně monitorujte průběh šifrování pomocí pokynů v další části.
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
seDataVolumesEncrypted
zobrazí jakoUnknown
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.
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ů:
Při dělení disků vyberte Konfigurovat šifrované svazky .
Vytvořte samostatnou spouštěcí jednotku, která nesmí být šifrovaná. Zašifrujte kořenovou jednotku.
Zadejte přístupové heslo. Toto je heslo, které jste nahráli do trezoru klíčů.
Dokončete dělení.
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.
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ů:
Vytvořte v části
/usr/local/sbin/azure_crypt_key.sh
soubor 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
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
Přidejte do skriptu oprávnění ke spustitelnému souboru:
sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
Upravit
/etc/initramfs-tools/modules
přidáním řádků:vfat ntfs nls_cp437 nls_utf8 nls_iso8859-1
Spusťte
update-initramfs -u -k all
aktualizaci initramfs, aby se projevil.keyscript
Teď můžete zrušit zřízení virtuálního počítače.
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