Azure Disk Encryption-voorbeeldscripts voor Linux-VM's
Let op
Dit artikel verwijst naar CentOS, een Linux-distributie met de EOL-status (End Of Life). 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
- Schijfversleuteling inschakelen op een bestaande of actieve Linux-VM
- Versleuteling uitschakelen op een actieve Linux-VM
- Het uitschakelen van versleuteling is alleen toegestaan op gegevensvolumes voor Linux-VM's.
VM's versleutelen of ontsleutelen met een Microsoft Entra-app (vorige release)
- Schijfversleuteling inschakelen op een bestaande of actieve Linux-VM
- Versleuteling uitschakelen op een actieve Linux-VM
- Het uitschakelen van versleuteling is alleen toegestaan op gegevensvolumes voor Linux-VM's.
- Een nieuwe versleutelde beheerde schijf maken op basis van een vooraf versleutelde VHD-/opslag-blob
- Hiermee maakt u een nieuwe versleutelde beheerde schijf op basis van een vooraf versleutelde VHD en de bijbehorende versleutelingsinstellingen
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 en beheerdershandleiding van SELinux op de virtuele machine.
- Nadat u SELinux hebt uitgeschakeld, start u de VM ten minste één keer opnieuw op.
Stappen
Maak een virtuele machine met behulp van een van de eerder opgegeven distributies.
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.
Meld u af bij de SSH-sessies.
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 eenSIGKILL
. 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.Bewaak periodiek de voortgang van versleuteling met behulp van de instructies in de volgende sectie.
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
OsVolumeEncrypted
DataVolumesEncrypted
worden ze weergegeven alsUnknown
in sommige distributies. Met WALinuxAgent versie 2.1.5 en hoger wordt dit probleem automatisch opgelost. Als u de uitvoer zietUnknown
, 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.
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:
Selecteer Versleutelde volumes configureren wanneer u de schijven partitioneert.
Maak een afzonderlijk opstartstation dat niet mag worden versleuteld. Versleutel uw hoofdstation.
Geef een wachtwoordzin op. Dit is de wachtwoordzin die u hebt geüpload naar de sleutelkluis.
Partitionering voltooien.
Wanneer u de VIRTUELE machine opstart en wordt gevraagd om een wachtwoordzin, gebruikt u de wachtwoordzin die u in stap 3 hebt opgegeven.
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:
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
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
Uitvoerbare machtigingen toevoegen aan het script:
sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
Bewerken
/etc/initramfs-tools/modules
door regels toe te voegen:vfat ntfs nls_cp437 nls_utf8 nls_iso8859-1
Voer
update-initramfs -u -k all
deze opdracht uit om de initramfs bij te werken om dekeyscript
initramfs van kracht te laten worden.U kunt de inrichting van de VIRTUELE machine nu ongedaan maken.
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