Megosztás a következőn keresztül:


Azure Disk Encryption-mintaszkriptek Linux rendszerű virtuális gépekhez

Figyelemfelhívás

Ez a cikk az End Of Life (EOL) állapotú Linux-disztribúcióra, a CentOS-ra hivatkozik. Fontolja meg a használatát, és ennek megfelelően tervezze meg. További információ: CentOS End Of Life útmutató.

A következőkre vonatkozik: ✔️ Linux rendszerű virtuális gépek rugalmas méretezési ✔️ csoportjai

Ez a cikk példaszkripteket tartalmaz az előre titkosított virtuális merevlemezek és egyéb feladatok előkészítéséhez.

Feljegyzés

Minden szkript az ADE legújabb, nem AAD-verziójára hivatkozik, kivéve, ha fel van jegyezve.

Minta PowerShell-szkriptek az Azure Disk Encryptionhez

  • Az előfizetésben lévő összes titkosított virtuális gép listázása

    Ezzel a PowerShell-szkripttel megtalálhatja az összes ADE-titkosított virtuális gépet és a bővítményverziót az előfizetésben található összes erőforráscsoportban.

    Alternatív megoldásként ezek a parancsmagok az összes ADE-titkosított virtuális gépet megjelenítik (a bővítményverziót azonban nem):

    $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}
    
  • Az előfizetés összes titkosított VMSS-példányának listázása

    Ezzel a PowerShell-szkripttel megtalálhatja az összes ADE-titkosított VMSS-példányt és a bővítményverziót az előfizetésben található összes erőforráscsoportban.

  • A kulcstartóban lévő virtuális gépek titkosításához használt összes lemeztitkosítási titkos kód listázása

    Get-AzKeyVaultSecret -VaultName $KeyVaultName | where {$_.Tags.ContainsKey('DiskEncryptionKeyFileName')} | format-table @{Label="MachineName"; Expression={$_.Tags['MachineName']}}, @{Label="VolumeLetter"; Expression={$_.Tags['VolumeLetter']}}, @{Label="EncryptionKeyURL"; Expression={$_.Id}}
    

Az Azure Disk Encryption előfeltételeinek PowerShell-szkript használata

Ha már ismeri az Azure Disk Encryption előfeltételeit, használhatja az Azure Disk Encryption előfeltételeinek PowerShell-szkriptet. Ennek a PowerShell-szkriptnek a használatára példaként tekintse meg a virtuális gép titkosítása rövid útmutatóját. A szkript egy szakaszából eltávolíthatja a megjegyzéseket a 211. sortól kezdve, ha egy meglévő erőforráscsoportban lévő meglévő virtuális gépek összes lemezét titkosítja.

Az alábbi táblázat azt mutatja be, hogy mely paraméterek használhatók a PowerShell-szkriptben:

Paraméter Leírás Kötelező?
$resourceGroupName Annak az erőforráscsoportnak a neve, amelyhez a KeyVault tartozik. Ha nem létezik ilyen nevű erőforráscsoport, létrejön egy új erőforráscsoport. Igaz
$keyVaultName Annak a KeyVaultnak a neve, amelyben a titkosítási kulcsokat el kell helyezni. Ha nem létezik, létrejön egy ilyen nevű új tároló. Igaz
$location A KeyVault helye. Győződjön meg arról, hogy a titkosítandó KeyVault és virtuális gépek ugyanazon a helyen találhatók. A helyek listáját a következővel érheti el: Get-AzLocation. Igaz
$subscriptionId A használni kívánt Azure-előfizetés azonosítója. Az előfizetés-azonosítóját a következővel érheti el: Get-AzSubscription. Igaz
$aadAppName Annak a Microsoft Entra-alkalmazásnak a neve, amely titkos kulcsokat fog írni a KeyVaultba. Ha a megadott néven még nem létezik alkalmazás, a rendszer létrehoz egyet a beírt néven. Ha ez az alkalmazás már létezik, adja át az aadClientSecret paramétert a szkriptnek. Hamis
$aadClientSecret A korábban létrehozott Microsoft Entra-alkalmazás ügyfélkódja. Hamis
$keyEncryptionKeyName Az opcionális kulcstitkosítási kulcs neve a KeyVaultban. Ha nem létezik, létrejön egy új kulcs ezzel a névvel. Hamis

Virtuális gépek titkosítása vagy visszafejtése Microsoft Entra-alkalmazás nélkül

Virtuális gépek titkosítása vagy visszafejtése Egy Microsoft Entra-alkalmazással (korábbi kiadás)

Operációsrendszer-meghajtó titkosítása futó Linux rendszerű virtuális gépen

Operációsrendszer-lemeztitkosítás előfeltételei

Lépések

  1. Hozzon létre egy virtuális gépet a korábban megadott disztribúciók egyikével.

  2. Konfigurálja a virtuális gépet az igényeinek megfelelően. Ha az összes (OPERÁCIÓS + adat) meghajtót titkosítja, az adatmeghajtókat meg kell adni, és csatlakoztathatónak kell lennie a /etc/fstab fájlból.

    Feljegyzés

    Use UUID=... adatmeghajtók megadása a blokkeszköz neve helyett az /etc/fstab fájlban (például /dev/sdb1). A titkosítás során a meghajtók sorrendje megváltozik a virtuális gépen. Ha a virtuális gép a blokkeszközök meghatározott sorrendjére támaszkodik, a titkosítás után nem fogja csatlakoztatni őket.

  3. Jelentkezzen ki az SSH-munkamenetekből.

  4. Az operációs rendszer titkosításához adja meg a volumeType értéket mind vagy operációs rendszerként, amikor engedélyezi a titkosítást.

    Feljegyzés

    A szolgáltatásként systemd nem futó összes felhasználótér-folyamatot le kell ölni egy SIGKILL. Indítsa újra a virtuális gépet. Ha operációsrendszer-lemeztitkosítást engedélyez egy futó virtuális gépen, tervezze meg a virtuális gép állásidejét.

  5. A titkosítás előrehaladásának rendszeres monitorozása a következő szakaszban található utasítások használatával.

  6. Miután a Get-AzVmDiskEncryptionStatus megjeleníti a "VMRestartPending" parancsot, indítsa újra a virtuális gépet a bejelentkezéssel, vagy a portál, a PowerShell vagy a parancssori felület használatával.

    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
    

    Az újraindítás előtt javasoljuk, hogy mentse a virtuális gép rendszerindítási diagnosztikáit .

Operációs rendszer titkosítási folyamatának figyelése

Az operációs rendszer titkosításának előrehaladását három módon monitorozhatja:

  • Használja a Get-AzVmDiskEncryptionStatus parancsmagot, és vizsgálja meg a ProgressMessage mezőt:

    Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name
    
    OsVolumeEncrypted          : EncryptionInProgress
    DataVolumesEncrypted       : NotMounted
    OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings
    ProgressMessage            : OS disk encryption started
    

    Miután a virtuális gép elérte az "operációsrendszer-lemez titkosítása elindult", körülbelül 40–50 percet vesz igénybe egy Premium Storage-alapú, támogatott virtuális gépen.

    A WALinuxAgent OsVolumeEncrypted 388-as hibája miatt, és DataVolumesEncrypted bizonyos disztribúciókban is Unknown megjelenik. A WALinuxAgent 2.1.5-ös és újabb verziójával ez a probléma automatikusan ki lett javítva. Ha megjelenik Unknown a kimenet, az Azure Resource Explorer használatával ellenőrizheti a lemeztitkosítás állapotát.

    Nyissa meg az Azure Resource Explorert, majd bontsa ki ezt a hierarchiát a bal oldali kijelölési panelen:

    |-- subscriptions
       |-- [Your subscription]
            |-- resourceGroups
                 |-- [Your resource group]
                      |-- providers
                           |-- Microsoft.Compute
                                |-- virtualMachines
                                     |-- [Your virtual machine]
                                          |-- InstanceView
    

    Az InstanceView-ban görgessen le a meghajtók titkosítási állapotának megtekintéséhez.

    Virtuálisgép-példány nézete

  • Tekintse meg a rendszerindítási diagnosztikát. Az ADE-bővítmény üzeneteinek előtaggal kell rendelkeznie [AzureDiskEncryption].

  • Jelentkezzen be a virtuális gépre SSH-val, és kérje le a bővítménynaplót a következő forrásból:

    /var/log/azure/Microsoft.Azure.Security.AzureDiskEncryptionForLinux

    Javasoljuk, hogy ne jelentkezzen be a virtuális gépre, amíg az operációs rendszer titkosítása folyamatban van. Csak akkor másolja ki a naplókat, ha a másik két metódus sikertelen volt.

Előre titkosított Linux VHD előkészítése

Az előre titkosított virtuális merevlemezek előkészítése a disztribúciótól függően változhat. Példák az Ubuntu, az openSUSE és a CentOS 7 előkészítésére.

Konfigurálja a titkosítást a terjesztési telepítés során az alábbi lépések végrehajtásával:

  1. Válassza a Titkosított kötetek konfigurálása a lemezek particionálásakor lehetőséget.

    Ubuntu 16.04 telepítő – Titkosított kötetek konfigurálása

  2. Hozzon létre egy külön rendszerindító meghajtót, amelyet nem szabad titkosítani. Titkosítsa a gyökérmeghajtót.

    Ubuntu 16.04 telepítő – A titkosítandó eszközök kiválasztása

  3. Adjon meg egy jelszót. Ezt a jelszót töltötte fel a kulcstartóba.

    Ubuntu 16.04 beállítás – Jelszó megadása

  4. Fejezze be a particionálást.

    Ubuntu 16.04 telepítő – Particionálás befejezése

  5. Amikor elindítja a virtuális gépet, és jelszót kér, használja a 3. lépésben megadott jelszót.

    Ubuntu 16.04 telepítő – Jelszó megadása rendszerindításkor

  6. Készítse elő a virtuális gépet az Azure-ba való feltöltéshez az alábbi utasítások használatával. Még ne futtassa az utolsó lépést (a virtuális gép leépítését).

A titkosítás konfigurálása az Azure-ral való együttműködéshez az alábbi lépések végrehajtásával:

  1. Hozzon létre egy fájlt az alábbi /usr/local/sbin/azure_crypt_key.shszkript tartalmával. Ügyeljen a KeyFileName névre, mert ez az Azure által használt jelszófájlnév.

    #!/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. Módosítsa a titkosítási konfigurációt a /etc/crypttab fájlban. Ennek így kell kinéznie:

     xxx_crypt uuid=xxxxxxxxxxxxxxxxxxxxx none luks,discard,keyscript=/usr/local/sbin/azure_crypt_key.sh
    
  3. Végrehajtható engedélyek hozzáadása a szkripthez:

     sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
    
  4. Szerkesztés /etc/initramfs-tools/modules sorok hozzáfűzésével:

     vfat
     ntfs
     nls_cp437
     nls_utf8
     nls_iso8859-1
    
  5. Futtassa update-initramfs -u -k all az initramfs frissítését a keyscript hatás érvénybe lépéséhez.

  6. Most már megszüntetheti a virtuális gépet.

    Ubuntu 16.04 telepítő – update-initramfs

  7. Folytassa a következő lépésben, és töltse fel a VHD-t az Azure-ba.

Titkosított VHD feltöltése Azure-tárfiókba

A DM-Crypt titkosításának engedélyezése után a helyi titkosított VHD-t fel kell tölteni a tárfiókba.

    Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]

Az előre titkosított virtuális gép titkos kódjának feltöltése a kulcstartóba

A Microsoft Entra-alkalmazás (korábbi kiadás) használatával történő titkosításkor a korábban beszerzett lemeztitkosítási titkos kulcsot titkos kódként kell feltölteni a kulcstartóba. A kulcstartónak engedélyeznie kell a lemeztitkosítást és az engedélyeket a Microsoft Entra-ügyfél számára.

 $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

A lemeztitkosítás titkos kódja nem KEK-vel van titkosítva

A kulcstartó titkos kulcsának beállításához használja a Set-AzKeyVaultSecret parancsot. A jelszó base64-sztringként van kódolva, majd feltöltve a kulcstartóba. Emellett győződjön meg arról, hogy a kulcstartóban a titkos kód létrehozásakor az alábbi címkék vannak beállítva.


 # 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 A következő lépésben a KEK használata nélkül csatolhatja az operációsrendszer-lemezt.

Lemeztitkosítási titkos kód titkosítása KEK használatával

Mielőtt feltöltené a titkos kulcsot a kulcstartóba, szükség esetén titkosíthatja egy kulcstitkosítási kulccsal. A wrap API használatával először titkosíthatja a titkos kulcsot a kulcstitkosítási kulccsal. A körbefuttatási művelet kimenete egy base64 URL-kódolású sztring, amelyet ezután titkos kódként tölthet fel a Set-AzKeyVaultSecret parancsmag használatával.

    # 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

Használja $KeyEncryptionKey és $secretUrl a következő lépésben csatolja az operációsrendszer-lemezt a KEK használatával.

Titkos URL-cím megadása operációsrendszer-lemez csatolásakor

KEK használata nélkül

Az operációsrendszer-lemez csatolása közben át kell adnia $secretUrla lemezt. Az URL-cím a "Lemeztitkosítási titkos kód nem KEK-vel titkosítva" szakaszban jött létre.

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

KEK használata

Amikor csatlakoztatja az operációsrendszer-lemezt, adja át $KeyEncryptionKey és $secretUrl. Az URL-cím a "Lemeztitkosítási titkos kód KEK-vel titkosítva" szakaszban jött létre.

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