Azure Disk Şifrelemesi için Linux VM'lere yönelik örnek betikler

Önemli

Azure Disk Şifrelemesi 15 Eylül 2028'de kullanımdan kaldırılıyor. Bu tarihe kadar Azure Disk Şifrelemesi'ni kesinti olmadan kullanmaya devam edebilirsiniz. 15 Eylül 2028'de ADE özellikli iş yükleri çalışmaya devam edecek, ancak VM yeniden başlatıldıktan sonra şifrelenmiş disklerin kilidi açılamaz ve hizmet kesintisine neden olur.

Yeni VM'ler için ev sahibi şifrelemesi kullanın veya gizli bilgi işlem yükleri için işletim sistemi disk şifrelemesi ile Gizli VM boyutlarını göz önünde bulundurun. Hizmet kesintisini önlemek için tüm ADE özellikli VM'lerin (yedeklemeler dahil) kullanımdan kaldırma tarihinden önce konakta şifrelemeye geçirilmesi gerekir. Ayrıntılar için bkz. Azure Disk Şifrelemesi'nden konakta şifrelemeye geçiş .

Dikkat

Bu makalede, kullanım süresi sonu (EOL) durumu olan bir Linux dağıtımı olan CentOS'a başvuruda bulunur. Kullanımınızı göz önünde bulundurun ve buna göre 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, Microsoft Entra ID 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 sırlarını listeleyin

    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 "VM'i Şifreleme Hızlı Başlatma"ya bakın. 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 kullanabileceğiniz parametreler gösterilmektedir:

Parametre Açıklama Zorunlu mu?
$resourceGroupName KeyVault'un ait olduğu kaynak grubunun adı. Betik, bu adda bir kaynak grubu yoksa yeni bir kaynak grubu oluşturur. Doğru
$keyVaultName Şifreleme anahtarlarının yerleştirildiği KeyVault'un adı. Betik, böyle bir kasa mevcut değilse bu adla yeni bir kasa oluşturur. Doğru
$location KeyVault konumu. Şifrelenmesi gereken KeyVault ve VM'lerin aynı konumda olduğunu doğrulayın. Get-AzLocation komutu ile bir konum listesi alın. Doğru
$subscriptionId Kullanılacak Azure aboneliğinin tanımlayıcısı. ile Get-AzSubscriptionAbonelik Kimliğinizi alın. Doğru
$aadAppName Key Vault’a gizli anahtarlar yazan Microsoft Entra uygulamasının adı. Betik, mevcut değilse bu adla yeni bir uygulama oluşturur. Eğer bu uygulama zaten mevcutsa, betiğe aadClientSecret parametresini geçirin. Yanlış
$aadClientSecret Daha önce oluşturulan Microsoft Entra uygulamasının istemci parolası. Yanlış
$keyEncryptionKeyName KeyVault'ta isteğe bağlı anahtar şifreleme anahtarının adı. Betik, böyle bir anahtar yoksa bu adlı yeni bir anahtar oluşturur. Yanlış

Microsoft Entra uygulaması olmadan VM'leri şifreleme veya şifresini çözme

Microsoft Entra uygulamasıyla VM'leri şifreleme veya şifresini çözme (önceki sürüm)

Ç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

  1. Daha önce belirtilen dağıtımlardan birini kullanarak bir VM oluşturun.

  2. 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.

  3. SSH oturumlarından çıkış yapın.

  4. İşletim sistemini şifrelemek için şifrelemeyi etkinleştirdiğinizde volumeType değerini Tümü veya işletim sistemi olarak belirtin.

    Not

    SIGKILL ile systemd hizmetleri olarak çalışmayan tüm kullanıcı alanı işlemlerini sonlandırın. 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.

  5. Sonraki bölümde yer alan yönergeleri kullanarak şifrelemenin ilerleme durumunu düzenli aralıklarla izleyin.

  6. 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ı kaydedin.

İş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'taki GitHub sorunu #388 nedeniyle, OsVolumeEncrypted ve DataVolumesEncrypted bazı dağıtımlarda Unknown olarak görünür. WALinuxAgent sürüm 2.1.5 ve üzeri ile bu sorun otomatik olarak düzeltilir. Çıktıda görüyorsanız Unknown 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.

    VM Örneği Görünümü

  • Ö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çmayın. Günlükleri yalnızca diğer iki yöntem başarısız olduğunda kopyalayın.

Önceden şifrelenmiş bir Linux VHD hazırla

Ö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:

  1. Diskleri bölümlerken Şifrelenmiş birimleri yapılandır'ı seçin.

    Ubuntu 16.04 Kurulumu - Şifrelenmiş birimleri yapılandırma

  2. Şifrelenmemesi gereken ayrı bir önyükleme sürücüsü oluşturun. Kök sürücünüzü şifreleyin.

    Ubuntu 16.04 Kurulumu - Şifrelenmesi gereken cihazları seçin

  3. Parolayı belirtin. Bu parolayı anahtar kasasına yüklemişsiniz.

    Ubuntu 16.04 Kurulumu - Parola sağlayın

  4. Bölümleme işlemini tamamlayın.

    Ubuntu 16.04 Kurulumu - Bölümleyi bitirme

  5. VM'yi önyüklerken parola istendiğinde, 3. adımda sağladığınız parolayı kullanın.

    Ubuntu 16.04 Kurulumu - Önyüklemede parola sağlayın

  6. 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:

  1. 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
    
  2. /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
    
  3. Betike yürütülebilir izinler ekleyin:

     sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
    
  4. Düzenlemek için /etc/initramfs-tools/modules öğesine satır ekleyin:

     vfat
     ntfs
     nls_cp437
     nls_utf8
     nls_iso8859-1
    
  5. Initramfs'ı güncelleştirmek için update-initramfs -u -k all komutunu çalıştırın, böylece keyscript etkili olur.

  6. Artık sanal makinenin (VM) sağlamasını kaldırabilirsiniz.

    Ubuntu 16.04 Kurulumu - update-initramfs

  7. 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 sırrını anahtar kasanıza yükleyin

Microsoft Entra uygulaması (önceki sürüm) kullanılarak şifreleme yaparken, daha önce edindiğiniz disk şifreleme sırrının anahtar kasanıza sır 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 sırrı

Anahtar kasanızda gizli bilgiyi 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 gizliyi 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

Sonraki adımda, KEK kullanmadan işletim sistemi diskini eklemek için $secretUrl öğesini kullanın.

KEK ile şifrelenen disk şifreleme anahtarı

Gizli anahtarı anahtar kasasına yüklemeden önce, isteğe bağlı olarak bir anahtar şifreleme anahtarı (KEK) kullanarak şifreleyebilirsiniz. Gizliyi şifrelemek için anahtar şifreleme anahtarını kullanarak sarma API'sini kullanın. Bu wrap işleminin çıktısı, base64 URL ile kodlanmış bir dizedir ve ardından bunu Set-AzKeyVaultSecret cmdlet'ini kullanarak gizli bilgi 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 by 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

$KeyEncryptionKey ve $secretUrl öğelerini, bir sonraki adımda KEK kullanarak İşletim Sistemi diskini eklemek için kullanın.

İşletim sistemi diski eklerken gizli url belirtme

KEK kullanmadan

İşletim sistemi diskini eklerken iletmeniz gerekir $secretUrl. URL, "KEK ile şifrelenmemiş disk şifreleme parolası" bölümünde oluşturulur.

    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, $KeyEncryptionKey ve $secretUrl geçirin. URL, "KEK ile şifrelenmiş disk şifreleme gizli anahtarı" bölümünde oluşturulur.

    Set-AzVMOSDisk `
            -VM $VirtualMachine `
            -Name $OSDiskName `
            -SourceImageUri $CopiedTemplateBlobUri `
            -VhdUri $OSDiskUri `
            -Linux `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl `
            -KeyEncryptionKeyVaultId $KeyVault.ResourceId `
            -KeyEncryptionKeyURL $KeyEncryptionKey.Id