Aracılığıyla paylaş


Linux VM'leri için örnek betikler Azure Disk Şifrelemesi

Dikkat

Bu makalede, Kullanım Süresi Sonu (EOL) durumuna yakın bir Linux dağıtımı olan CentOS'a başvuruda bulunur. 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

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. SELinux'i devre dışı bırakma", VM'deki SELinux Kullanıcı ve Yönetici istrator Kılavuzu'ndadır.
  • 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ının oturumunu kapatın.

  4. İş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 ile SIGKILLbirlikte 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.

  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ı 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 ve DataVolumesEncrypted bazı dağıtımlarda olduğu gibi Unknown görünmektedir. 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ç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:

  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, anahtar kasasına yüklediğiniz paroladır.

    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. Satırları ekleyerek düzenleyin /etc/initramfs-tools/modules :

     vfat
     ntfs
     nls_cp437
     nls_utf8
     nls_iso8859-1
    
  5. Etkili olması keyscript için initramfs'ı güncelleştirmek için komutunu çalıştırınupdate-initramfs -u -k all.

  6. Artık VM'nin 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 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 $secretUrlgeç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