Linux VM'leri için örnek betikler Azure Disk Şifrelemesi
Dikkat
Bu makale, Kullanım Süresi Sonu (EOL) durumu olan bir Linux dağıtımı olan CentOS'a başvurur. Lütfen kullanımınızı göz önünde bulundurun ve uygun şekilde planlayın. Daha fazla bilgi için bkz . CentOS Kullanım Süresi Sonu kılavuzu.
Şunlar için geçerlidir: ✔️ Linux VM'leri ✔️ Esnek ölçek kümeleri
Bu makalede, önceden şifrelenmiş VHD'leri ve diğer görevleri hazırlamak için örnek betikler sağlanır.
Not
Tüm betikler, not edilen durumlar dışında ADE'nin en son, AAD olmayan sürümüne başvurur.
Azure Disk Şifrelemesi için örnek PowerShell betikleri
Aboneliğinizdeki tüm şifrelenmiş VM'leri listeleme
Bu PowerShell betiğini kullanarak abonelikte bulunan tüm kaynak gruplarında tüm ADE ile şifrelenmiş VM'leri ve uzantı sürümünü bulabilirsiniz.
Alternatif olarak, bu cmdlet'ler tüm ADE ile şifrelenmiş VM'leri (uzantı sürümü değil) gösterir:
$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}
Aboneliğinizdeki tüm şifrelenmiş VMSS örneklerini listeleme
Bu PowerShell betiğini kullanarak abonelikte bulunan tüm kaynak gruplarında tüm ADE ile şifrelenmiş VMSS örneklerini ve uzantı sürümünü bulabilirsiniz.
Anahtar kasasında VM'leri şifrelemek için kullanılan tüm disk şifreleme gizli dizilerini listeleme
Get-AzKeyVaultSecret -VaultName $KeyVaultName | where {$_.Tags.ContainsKey('DiskEncryptionKeyFileName')} | format-table @{Label="MachineName"; Expression={$_.Tags['MachineName']}}, @{Label="VolumeLetter"; Expression={$_.Tags['VolumeLetter']}}, @{Label="EncryptionKeyURL"; Expression={$_.Id}}
Azure Disk Şifrelemesi önkoşulları PowerShell betiğini kullanma
Azure Disk Şifrelemesi önkoşullarını zaten biliyorsanız Azure Disk Şifrelemesi önkoşulları PowerShell betiğini kullanabilirsiniz. Bu PowerShell betiğini kullanma örneği için bkz . VM Şifreleme Hızlı Başlangıcı. Var olan bir kaynak grubundaki mevcut VM'lerin tüm disklerini şifrelemek için betiğin 211. satırından başlayarak bir bölümünden açıklamaları kaldırabilirsiniz.
Aşağıdaki tabloda PowerShell betiğinde hangi parametrelerin kullanılabileceğini gösterilmektedir:
Parametre | Açıklama | Zorunlu mu? |
---|---|---|
$resourceGroupName | KeyVault'un ait olduğu kaynak grubunun adı. Yoksa bu ada sahip yeni bir kaynak grubu oluşturulur. | True |
$keyVaultName | Şifreleme anahtarlarının yerleştirileceği KeyVault'un adı. Bu ada sahip yeni bir kasa yoksa oluşturulur. | True |
$location | KeyVault konumu. Şifrelenecek KeyVault ve VM'lerin aynı konumda olduğundan emin olun. Get-AzLocation komutu ile bir konum listesi alın. |
True |
$subscriptionId | Kullanılacak Azure aboneliğinin tanımlayıcısı. Abonelik Kimliğinizi Get-AzSubscription komutu ile alabilirsiniz. |
True |
$aadAppName | KeyVault'a gizli dizi yazmak için kullanılacak Microsoft Entra uygulamasının adı. Bu ada sahip bir uygulama yoksa yeni bir uygulama oluşturulur. Bu uygulama zaten varsa betiğine aadClientSecret parametresini geçirin. | False |
$aadClientSecret | Daha önce oluşturulan Microsoft Entra uygulamasının istemci gizli dizisi. | False |
$keyEncryptionKeyName | KeyVault'ta isteğe bağlı anahtar şifreleme anahtarının adı. Bu ada sahip yeni bir anahtar yoksa oluşturulur. | False |
Microsoft Entra uygulaması olmadan VM'leri şifreleme veya şifresini çözme
- Mevcut veya çalışan bir Linux VM'de disk şifrelemesini etkinleştirme
- Çalışan bir Linux VM'de şifrelemeyi devre dışı bırakma
- Şifrelemenin devre dışı bırakılmasına yalnızca Linux VM'leri için Veri birimlerinde izin verilir.
Microsoft Entra uygulamasıyla VM'leri şifreleme veya şifresini çözme (önceki sürüm)
- Mevcut veya çalışan bir Linux VM'de disk şifrelemesini etkinleştirme
- Çalışan bir Linux VM'de şifrelemeyi devre dışı bırakma
- Şifrelemenin devre dışı bırakılmasına yalnızca Linux VM'leri için Veri birimlerinde izin verilir.
- Önceden şifrelenmiş bir VHD/depolama blobundan yeni bir şifrelenmiş yönetilen disk oluşturma
- Önceden şifrelenmiş bir VHD ve buna karşılık gelen şifreleme ayarları sağlayan yeni bir şifrelenmiş yönetilen disk oluşturur
Çalışan bir Linux VM'sinde işletim sistemi sürücüsünü şifreleme
İşletim sistemi disk şifrelemesi için önkoşullar
- VM, desteklenen Azure Disk Şifrelemesi işletim sistemlerinde listelendiği gibi işletim sistemi disk şifrelemesiyle uyumlu bir dağıtım kullanıyor olmalıdır
- VM, Azure Resource Manager'daki Market görüntüsünden oluşturulmalıdır.
- En az 4 GB RAM'e sahip Azure VM (önerilen boyut 7 GB'tır). Daha fazla bilgi için bkz . Bellek gereksinimleri .
- (RHEL ve CentOS için) SELinux'i devre dışı bırakın. SELinux'yi devre dışı bırakmak için bkz. "4.4.2. VM'deki SELinux Kullanıcı ve Yönetici Kılavuzu'nda SELinux'i devre dışı bırakma".
- SELinux'yi devre dışı bırakdıktan sonra VM'yi en az bir kez yeniden başlatın.
Adımlar
Daha önce belirtilen dağıtımlardan birini kullanarak bir VM oluşturun.
VM'yi gereksinimlerinize göre yapılandırın. Tüm (işletim sistemi + veri) sürücülerini şifreleyecekseniz, veri sürücülerinin /etc/fstab'den belirtilmesi ve takılabilir olması gerekir.
Not
UUID=... kullan blok cihazı adını belirtmek yerine /etc/fstab içindeki veri sürücülerini belirtmek için (örneğin, /dev/sdb1). Şifreleme sırasında, vm'de sürücülerin sırası değişir. VM'niz belirli bir blok cihaz sırasına bağlıysa, şifrelemeden sonra bunları bağlayamaz.
SSH oturumlarının oturumunu kapatın.
İşletim sistemini şifrelemek için şifrelemeyi etkinleştirdiğinizde volumeType değerini Tümü veya işletim sistemi olarak belirtin.
Not
Hizmet olarak
systemd
çalışmayan tüm kullanıcı alanı işlemleri ileSIGKILL
birlikte kullanılmalıdır. VM’yi yeniden başlatın. Çalışan bir VM'de işletim sistemi disk şifrelemesini etkinleştirdiğinizde VM kapalı kalma süresini planlayın.Sonraki bölümde yer alan yönergeleri kullanarak şifrelemenin ilerleme durumunu düzenli aralıklarla izleyin.
Get-AzVmDiskEncryptionStatus "VMRestartPending" öğesini gösterdikten sonra, vm'nizde oturum açarak veya portal, PowerShell veya CLI kullanarak vm'nizi yeniden başlatın.
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
Yeniden başlatmadan önce VM'nin önyükleme tanılamasını kaydetmenizi öneririz.
İşletim sistemi şifreleme ilerleme durumunu izleme
İşletim sistemi şifrelemesi ilerleme durumunu üç şekilde izleyebilirsiniz:
cmdlet'ini
Get-AzVmDiskEncryptionStatus
kullanın ve ProgressMessage alanını inceleyin:Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name
OsVolumeEncrypted : EncryptionInProgress DataVolumesEncrypted : NotMounted OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings ProgressMessage : OS disk encryption started
VM "İşletim sistemi disk şifrelemesi başlatıldı" seçeneğine ulaştıktan sonra Premium depolama destekli bir VM'de yaklaşık 40 ile 50 dakika arası sürer.
WALinuxAgent'da
OsVolumeEncrypted
388 sorunu nedeniyle veDataVolumesEncrypted
bazı dağıtımlarda olduğu gibiUnknown
görünmektedir. WALinuxAgent sürüm 2.1.5 ve üzeri ile bu sorun otomatik olarak düzeltilir. Çıktıda görüyorsanızUnknown
Azure Kaynak Gezgini'ni kullanarak disk şifreleme durumunu doğrulayabilirsiniz.Azure Kaynak Gezgini'ne gidin ve soldaki seçim panelinde bu hiyerarşiyi genişletin:
|-- subscriptions |-- [Your subscription] |-- resourceGroups |-- [Your resource group] |-- providers |-- Microsoft.Compute |-- virtualMachines |-- [Your virtual machine] |-- InstanceView
InstanceView'da sürücülerinizin şifreleme durumunu görmek için ekranı aşağı kaydırın.
Önyükleme tanılamalarına bakın. ADE uzantısından gelen iletiler ön ekinde
[AzureDiskEncryption]
olmalıdır.SSH aracılığıyla VM'de oturum açın ve uzantı günlüğünü şu kaynaktan alın:
/var/log/azure/Microsoft.Azure.Security.AzureDiskEncryptionForLinux
İşletim sistemi şifrelemesi devam ederken VM'de oturum açmamanızı öneririz. Günlükleri yalnızca diğer iki yöntem başarısız olduğunda kopyalayın.
Önceden şifrelenmiş Linux VHD'leri hazırlama
Önceden şifrelenmiş VHD'ler için hazırlık, dağıtıma bağlı olarak değişebilir. Ubuntu, openSUSE ve CentOS 7'yi hazırlama örnekleri mevcuttur.
Aşağıdaki adımları uygulayarak dağıtım yüklemesi sırasında şifrelemeyi yapılandırın:
Diskleri bölümlerken Şifrelenmiş birimleri yapılandır'ı seçin.
Şifrelenmemesi gereken ayrı bir önyükleme sürücüsü oluşturun. Kök sürücünüzü şifreleyin.
Parolayı belirtin. Bu, anahtar kasasına yüklediğiniz paroladır.
Bölümleme işlemini tamamlayın.
VM'yi önyüklerken parola istendiğinde, 3. adımda sağladığınız parolayı kullanın.
Bu yönergeleri kullanarak VM'yi Azure'a yüklemeye hazırlayın. Son adımı (VM'nin sağlamasını kaldırma) henüz çalıştırmayın.
Aşağıdaki adımları uygulayarak şifrelemeyi Azure ile çalışacak şekilde yapılandırın:
altında
/usr/local/sbin/azure_crypt_key.sh
, içeriği aşağıdaki betikte olacak şekilde bir dosya oluşturun. Azure tarafından kullanılan parola dosya adı olduğundan KeyFileName'e dikkat edin.#!/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
/etc/crypttab içindeki şifreleme yapılandırmasını değiştirin. Şu şekilde görünmelidir:
xxx_crypt uuid=xxxxxxxxxxxxxxxxxxxxx none luks,discard,keyscript=/usr/local/sbin/azure_crypt_key.sh
Betike yürütülebilir izinler ekleyin:
sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
Satırları ekleyerek düzenleyin
/etc/initramfs-tools/modules
:vfat ntfs nls_cp437 nls_utf8 nls_iso8859-1
Etkili olması
keyscript
için initramfs'ı güncelleştirmek için komutunu çalıştırınupdate-initramfs -u -k all
.Artık VM'nin sağlamasını kaldırabilirsiniz.
Sonraki adıma geçin ve VHD'nizi Azure'a yükleyin.
Şifrelenmiş VHD'yi bir Azure depolama hesabına yükleme
DM-Crypt şifrelemesi etkinleştirildikten sonra yerel şifrelenmiş VHD'nin depolama hesabınıza yüklenmesi gerekir.
Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]
Önceden şifrelenmiş VM'nin gizli dizisini anahtar kasanıza yükleyin
Bir Microsoft Entra uygulaması (önceki sürüm) kullanılarak şifrelenirken, daha önce edindiğiniz disk şifreleme gizli dizisinin anahtar kasanıza gizli dizi olarak yüklenmesi gerekir. Anahtar kasasının, Microsoft Entra istemciniz için disk şifrelemesi ve izinlerinin etkinleştirilmesi gerekir.
$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
KEK ile şifrelenmemiş disk şifreleme gizli dizisi
Anahtar kasanızda gizli diziyi ayarlamak için Set-AzKeyVaultSecret komutunu kullanın. Parola bir base64 dizesi olarak kodlanır ve ardından anahtar kasasına yüklenir. Ayrıca, anahtar kasasında gizli diziyi oluştururken aşağıdaki etiketlerin ayarlandığından emin olun.
# 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
KEK kullanmadan işletim sistemi diskini eklemek için sonraki adımda öğesini kullanın.
KEK ile şifrelenen disk şifreleme gizli dizisi
Gizli diziyi anahtar kasasına yüklemeden önce, isteğe bağlı olarak bir anahtar şifreleme anahtarı kullanarak şifreleyebilirsiniz. Anahtar şifreleme anahtarını kullanarak gizli diziyi şifrelemek için sarmalama API'sini kullanın. Bu sarmalama işleminin çıktısı base64 URL ile kodlanmış bir dizedir ve ardından cmdlet'ini Set-AzKeyVaultSecret
kullanarak gizli dizi olarak karşıya yükleyebilirsiniz.
# 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
KEK kullanarak işletim sistemi diskini eklemek için ve $secretUrl
sonraki adımda kullanın$KeyEncryptionKey
.
İşletim sistemi diski eklerken gizli url belirtme
KEK kullanmadan
İşletim sistemi diskini eklerken geçirmeniz gerekir $secretUrl
. URL, "KEK ile şifrelenmemiş disk şifreleme gizli dizisi" bölümünde oluşturulmuştur.
Set-AzVMOSDisk `
-VM $VirtualMachine `
-Name $OSDiskName `
-SourceImageUri $VhdUri `
-VhdUri $OSDiskUri `
-Linux `
-CreateOption FromImage `
-DiskEncryptionKeyVaultId $KeyVault.ResourceId `
-DiskEncryptionKeyUrl $SecretUrl
KEK kullanma
İşletim sistemi diskini eklediğinizde, ve $secretUrl
geçirin$KeyEncryptionKey
. URL, "KEK ile şifrelenen disk şifreleme gizli dizisi" bölümünde oluşturulmuştur.
Set-AzVMOSDisk `
-VM $VirtualMachine `
-Name $OSDiskName `
-SourceImageUri $CopiedTemplateBlobUri `
-VhdUri $OSDiskUri `
-Linux `
-CreateOption FromImage `
-DiskEncryptionKeyVaultId $KeyVault.ResourceId `
-DiskEncryptionKeyUrl $SecretUrl `
-KeyEncryptionKeyVaultId $KeyVault.ResourceId `
-KeyEncryptionKeyURL $KeyEncryptionKey.Id