Exempelskript för Azure Disk Encryption för virtuella Linux-datorer
Varning
Den här artikeln refererar till CentOS, en Linux-distribution som har statusen End Of Life (EOL). Överväg att använda och planera i enlighet med detta. Mer information finns i CentOS End Of Life-vägledningen.
Gäller för: ✔️ Flexibla skalningsuppsättningar för virtuella Linux-datorer ✔️
Den här artikeln innehåller exempelskript för att förbereda förkrypterade virtuella hårddiskar och andra uppgifter.
Kommentar
Alla skript refererar till den senaste, icke-AAD-versionen av ADE, förutom där det anges.
PowerShell-exempelskript för Azure Disk Encryption
Visa en lista över alla krypterade virtuella datorer i din prenumeration
Du hittar alla ADE-krypterade virtuella datorer och tilläggsversionen i alla resursgrupper som finns i en prenumeration med hjälp av det här PowerShell-skriptet.
Alternativt visar dessa cmdletar alla ADE-krypterade virtuella datorer (men inte tilläggsversionen):
$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}
Visa en lista över alla krypterade VMSS-instanser i din prenumeration
Du hittar alla ADE-krypterade VMSS-instanser och tilläggsversionen i alla resursgrupper som finns i en prenumeration med hjälp av det här PowerShell-skriptet.
Visa en lista över alla diskkrypteringshemligheter som används för att kryptera virtuella datorer i ett nyckelvalv
Get-AzKeyVaultSecret -VaultName $KeyVaultName | where {$_.Tags.ContainsKey('DiskEncryptionKeyFileName')} | format-table @{Label="MachineName"; Expression={$_.Tags['MachineName']}}, @{Label="VolumeLetter"; Expression={$_.Tags['VolumeLetter']}}, @{Label="EncryptionKeyURL"; Expression={$_.Id}}
Använda PowerShell-skriptet för förhandskrav för Azure Disk Encryption
Om du redan är bekant med förhandskraven för Azure Disk Encryption kan du använda PowerShell-skriptet för Förhandskrav för Azure Disk Encryption. Ett exempel på hur du använder det här PowerShell-skriptet finns i snabbstarten Kryptera en virtuell dator. Du kan ta bort kommentarerna från ett avsnitt i skriptet, från och med rad 211, för att kryptera alla diskar för befintliga virtuella datorer i en befintlig resursgrupp.
I följande tabell visas vilka parametrar som kan användas i PowerShell-skriptet:
Parameter | Description | Obligatoriskt? |
---|---|---|
$resourceGroupName | Namnet på resursgruppen som KeyVault tillhör. En ny resursgrupp med det här namnet skapas om den inte finns. | Sant |
$keyVaultName | Namnet på den KeyVault där krypteringsnycklar ska placeras. Ett nytt valv med det här namnet skapas om det inte finns något. | Sant |
$location | KeyVaults plats. Kontrollera att keyVault och virtuella datorer som ska krypteras finns på samma plats. Hämta en innehållsplatslista med Get-AzLocation . |
Sant |
$subscriptionId | Identifierare för den Azure-prenumeration som ska användas. Du kan hämta ditt prenumerations-ID med Get-AzSubscription . |
Sant |
$aadAppName | Namnet på Microsoft Entra-programmet som ska användas för att skriva hemligheter till KeyVault. Om det inte redan finns ett program med det namnet skapas ett nytt. Om den här appen redan finns skickar du parametern aadClientSecret till skriptet. | Falsk |
$aadClientSecret | Klienthemlighet för Microsoft Entra-programmet som skapades tidigare. | Falsk |
$keyEncryptionKeyName | Namn på valfri nyckelkrypteringsnyckel i KeyVault. En ny nyckel med det här namnet skapas om det inte finns någon. | Falsk |
Kryptera eller dekryptera virtuella datorer utan en Microsoft Entra-app
- Aktivera diskkryptering på en befintlig eller kör en virtuell Linux-dator
- Inaktivera kryptering på en virtuell Linux-dator som körs
- Inaktivering av kryptering tillåts endast på datavolymer för virtuella Linux-datorer.
Kryptera eller dekryptera virtuella datorer med en Microsoft Entra-app (tidigare version)
- Aktivera diskkryptering på en befintlig eller kör en virtuell Linux-dator
- Inaktivera kryptering på en virtuell Linux-dator som körs
- Inaktivering av kryptering tillåts endast på datavolymer för virtuella Linux-datorer.
- Skapa en ny krypterad hanterad disk från en förkrypterad virtuell hårddisk/lagringsblob
- Skapar en ny krypterad hanterad disk med en förkrypterad virtuell hårddisk och motsvarande krypteringsinställningar
Kryptera en OS-enhet på en virtuell Linux-dator som körs
Krav för OS-diskkryptering
- Den virtuella datorn måste använda en distribution som är kompatibel med OS-diskkryptering enligt listan i operativsystemet som stöds av Azure Disk Encryption
- Den virtuella datorn måste skapas från Marketplace-avbildningen i Azure Resource Manager.
- Virtuell Azure-dator med minst 4 GB RAM-minne (rekommenderad storlek är 7 GB). Mer information finns i Minneskrav .
- (För RHEL och CentOS) Inaktivera SELinux. Information om hur du inaktiverar SELinux finns i "4.4.2. Inaktivera SELinux" i SELinux-användar- och administratörsguiden på den virtuella datorn.
- När du har inaktiverat SELinux startar du om den virtuella datorn minst en gång.
Steg
Skapa en virtuell dator med någon av de distributioner som angavs tidigare.
Konfigurera den virtuella datorn efter dina behov. Om du ska kryptera alla enheter (OS + data) måste dataenheterna anges och monteras från /etc/fstab.
Kommentar
Använd UUID=... för att ange dataenheter i /etc/fstab i stället för att ange blockenhetsnamnet (till exempel /dev/sdb1). Under krypteringen ändras ordningen på enheter på den virtuella datorn. Om den virtuella datorn förlitar sig på en specifik ordning på blockenheter kan den inte montera dem efter krypteringen.
Logga ut från SSH-sessionerna.
Om du vill kryptera operativsystemet anger du volumeType som Alla eller OPERATIVSYSTEM när du aktiverar kryptering.
Kommentar
Alla användarutrymmesprocesser som inte körs som
systemd
tjänster ska avlivas med enSIGKILL
. Starta om den virtuella datorn. När du aktiverar OS-diskkryptering på en virtuell dator som körs planerar du driftstopp för virtuella datorer.Övervaka krypteringens förlopp regelbundet med hjälp av anvisningarna i nästa avsnitt.
När Get-AzVmDiskEncryptionStatus visar "VMRestartPending" startar du om den virtuella datorn antingen genom att logga in på den eller med hjälp av portalen, PowerShell eller 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
Innan du startar om rekommenderar vi att du sparar startdiagnostik för den virtuella datorn.
Förlopp för övervakning av OS-kryptering
Du kan övervaka förloppet för OS-kryptering på tre sätt:
Använd cmdleten
Get-AzVmDiskEncryptionStatus
och granska fältet ProgressMessage:Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name
OsVolumeEncrypted : EncryptionInProgress DataVolumesEncrypted : NotMounted OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings ProgressMessage : OS disk encryption started
När den virtuella datorn når "OS-diskkryptering har startats" tar det cirka 40 till 50 minuter på en premiumlagringsbaserad virtuell dator.
På grund av problemet #388 i WALinuxAgent
OsVolumeEncrypted
ochDataVolumesEncrypted
visas somUnknown
i vissa distributioner. Med WALinuxAgent version 2.1.5 och senare åtgärdas det här problemet automatiskt. Om du serUnknown
i utdata kan du verifiera diskkrypteringsstatus med hjälp av Azure Resource Explorer.Gå till Azure Resource Explorer och expandera sedan den här hierarkin i urvalspanelen till vänster:
|-- subscriptions |-- [Your subscription] |-- resourceGroups |-- [Your resource group] |-- providers |-- Microsoft.Compute |-- virtualMachines |-- [Your virtual machine] |-- InstanceView
I InstanceView rullar du ned för att se krypteringsstatusen för dina enheter.
Titta på startdiagnostik. Meddelanden från ADE-tillägget ska vara prefixet med
[AzureDiskEncryption]
.Logga in på den virtuella datorn via SSH och hämta tilläggsloggen från:
/var/log/azure/Microsoft.Azure.Security.AzureDiskEncryptionForLinux
Vi rekommenderar att du inte loggar in på den virtuella datorn medan OS-kryptering pågår. Kopiera loggarna endast när de andra två metoderna har misslyckats.
Förbereda en förkrypterad virtuell Linux-hårddisk
Förberedelserna för förkrypterade virtuella hårddiskar kan variera beroende på fördelningen. Exempel på hur du förbereder Ubuntu, openSUSE och CentOS 7 är tillgängliga.
Konfigurera kryptering under distributionsinstallationen genom att göra följande:
Välj Konfigurera krypterade volymer när du partitionerade diskarna.
Skapa en separat startenhet som inte får krypteras. Kryptera rotenheten.
Ange en lösenfras. Det här är lösenfrasen som du laddade upp till nyckelvalvet.
Slutför partitioneringen.
När du startar den virtuella datorn och uppmanas att ange en lösenfras använder du lösenfrasen som du angav i steg 3.
Förbered den virtuella datorn för uppladdning till Azure med hjälp av dessa instruktioner. Kör inte det sista steget (avetablera den virtuella datorn) ännu.
Konfigurera kryptering för att fungera med Azure genom att göra följande:
Skapa en fil under
/usr/local/sbin/azure_crypt_key.sh
, med innehållet i följande skript. Var uppmärksam på KeyFileName eftersom det är lösenfrasens filnamn som används av 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
Ändra kryptkonfigurationen i /etc/crypttab. Den bör se ut så här:
xxx_crypt uuid=xxxxxxxxxxxxxxxxxxxxx none luks,discard,keyscript=/usr/local/sbin/azure_crypt_key.sh
Lägg till körbara behörigheter i skriptet:
sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
Redigera
/etc/initramfs-tools/modules
genom att lägga till rader:vfat ntfs nls_cp437 nls_utf8 nls_iso8859-1
Kör
update-initramfs -u -k all
för att uppdatera initramfs för att börjakeyscript
gälla.Nu kan du avetablera den virtuella datorn.
Fortsätt till nästa steg och ladda upp din virtuella hårddisk till Azure.
Ladda upp krypterad virtuell hårddisk till ett Azure Storage-konto
När DM-Crypt-kryptering har aktiverats måste den lokala krypterade virtuella hårddisken laddas upp till ditt lagringskonto.
Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]
Ladda upp hemligheten för den förkrypterade virtuella datorn till ditt nyckelvalv
När du krypterar med en Microsoft Entra-app (tidigare version) måste den diskkrypteringshemlighet som du hämtade tidigare laddas upp som en hemlighet i nyckelvalvet. Nyckelvalvet måste ha diskkryptering och behörigheter aktiverade för Microsoft Entra-klienten.
$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
Diskkrypteringshemlighet som inte krypteras med en KEK
Om du vill konfigurera hemligheten i nyckelvalvet använder du Set-AzKeyVaultSecret. Lösenfrasen kodas som en base64-sträng och laddas sedan upp till nyckelvalvet. Kontrollera dessutom att följande taggar har angetts när du skapar hemligheten i nyckelvalvet.
# 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
Använd i nästa steg för att ansluta OS-disken utan att använda KEK.
Diskkrypteringshemlighet krypterad med en KEK
Innan du laddar upp hemligheten till nyckelvalvet kan du kryptera den med hjälp av en nyckelkrypteringsnyckel. Använd wrap-API:et för att först kryptera hemligheten med hjälp av nyckelkrypteringsnyckeln. Utdata från den här wrap-åtgärden är en base64 URL-kodad sträng som du sedan kan ladda upp som en hemlighet med hjälp av cmdleten 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
Använd $KeyEncryptionKey
och $secretUrl
i nästa steg för att ansluta OS-disken med hjälp av KEK.
Ange en hemlig URL när du ansluter en OS-disk
Utan att använda en KEK
När du ansluter OS-disken måste du skicka $secretUrl
. URL:en genererades i avsnittet "Diskkrypteringshemlighet inte krypterad med en KEK".
Set-AzVMOSDisk `
-VM $VirtualMachine `
-Name $OSDiskName `
-SourceImageUri $VhdUri `
-VhdUri $OSDiskUri `
-Linux `
-CreateOption FromImage `
-DiskEncryptionKeyVaultId $KeyVault.ResourceId `
-DiskEncryptionKeyUrl $SecretUrl
Använda en KEK
När du ansluter OS-disken skickar $KeyEncryptionKey
du och $secretUrl
. URL:en genererades i avsnittet "Diskkrypteringshemlighet krypterad med en 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