Partager via


Exemples de scripts Azure Disk Encryption

S’applique à : ✔️ Machine virtuelles Windows

Cet article fournit des exemples de scripts pour la préparation de disques durs virtuels préchiffrés et d’autres tâches.

Notes

Sauf mention contraire, tous les scripts font référence à la dernière version hors AAD d’ADE.

Exemples de scripts PowerShell pour Azure Disk Encryption

  • Répertorier toutes les machines virtuelles chiffrées dans votre abonnement

    Vous pouvez rechercher toutes les machines virtuelles chiffrées avec ADE et la version de l’extension, dans tous les groupes de ressources d’un abonnement, à l’aide de ce script PowerShell.

    À l’inverse, ces cmdlets affichent toutes les machines virtuelles chiffrées avec ADE (sans la version de l’extension) :

    $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}
    
  • Répertorier toutes les instances VMSS chiffrées de votre abonnement

    Vous pouvez rechercher toutes les instances Virtual Machine Scale Sets chiffrées avec ADE et la version de l’extension, dans tous les groupes de ressources d’un abonnement, à l’aide de ce script PowerShell.

  • Répertorier tous les secrets de chiffrement de disque utilisées pour chiffrer les machines virtuelles dans un coffre de clés

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

Utilisation du script PowerShell des prérequis Azure Disk Encryption

Si vous êtes déjà familiarisé avec les prérequis d’Azure Disk Encryption, vous pouvez utiliser le script PowerShell des prérequis d’Azure Disk Encryption. Vous trouverez un exemple d’utilisation de ce script PowerShell dans Démarrage rapide du chiffrement d’une machine virtuelle. Vous pouvez supprimer les commentaires d’une section du script, en commençant à la ligne 211, pour chiffrer tous les disques des machines virtuelles d’un groupe de ressources existant.

Le tableau suivant présente les paramètres pouvant être utilisés dans le script PowerShell :

Paramètre Description Obligatoire ?
$resourceGroupName Nom du groupe de ressources auquel appartient le coffre de clés. Un groupe de ressources portant ce nom sera créé s’il n’existe pas encore. True
$keyVaultName Nom du coffre de clés dans lequel les clés de chiffrement doivent être placées. Un coffre portant ce nom sera créé s’il n’existe pas encore. True
$location Emplacement du coffre de clés. Assurez-vous que le coffre de clés et les machines virtuelles à chiffrer se trouvent au même emplacement. Obtenez une liste des emplacements avec Get-AzLocation. True
$subscriptionId Identificateur de l’abonnement Azure à utiliser. Vous pouvez obtenir votre ID d’abonnement avec Get-AzSubscription. True
$aadAppName Nom de l’application Microsoft Entra utilisée pour écrire des secrets dans KeyVault. S’il n’existe aucune application de ce nom, une nouvelle application sera créée en utilisant le nom que vous avez saisi. Si cette application existe déjà, appliquez le paramètre aadClientSecret au script. False
$aadClientSecret Secret client de l’application Microsoft Entra qui a été créée précédemment. False
$keyEncryptionKeyName Nom de la clé de chiffrement principale facultative dans KeyVault. Une clé portant ce nom sera créée si elle n’existe pas encore. False

Modèles Resource Manager

Chiffrer ou déchiffrer des machines virtuelles sans application Microsoft Entra

Chiffrer ou déchiffrer des machines virtuelles avec une application Microsoft Entra (version précédente)

Préparer un disque dur virtuel Windows déjà chiffré

Les sections qui suivent sont nécessaires pour préparer un disque dur virtuel Windows déjà chiffré qui sera déployé comme disque dur virtuel chiffré dans Azure IaaS. Utilisez ces informations pour préparer et démarrer une nouvelle machine virtuelle Windows (disque dur virtuel) sur Azure Site Recovery ou Azure. Pour plus d’informations sur la préparation et le chargement d’un disque dur virtuel, consultez Charger un disque dur virtuel généralisé et l’utiliser pour créer des machines virtuelles dans Azure.

Mettre à jour la stratégie de groupe pour permettre la protection autre que par module de plateforme sécurisée pour la protection du système d’exploitation

Configurez le paramètre de stratégie de groupe BitLocker Chiffrement de lecteur BitLocker qui se trouve sous Stratégie de l’ordinateur local>Configuration ordinateur>Modèles d’administration>Composants Windows. Remplacez ce paramètre par Lecteurs du système d’exploitation>Exiger une authentification supplémentaire au démarrage>Autoriser BitLocker sans un module de plateforme sécurisée compatible comme indiqué dans la figure ci-dessous :

Microsoft Antimalware dans Azure

Installer les composants de fonctionnalité BitLocker

Pour Windows Server 2012 ou version ultérieure, utilisez la commande suivante :

dism /online /Enable-Feature /all /FeatureName:BitLocker /quiet /norestart

Pour Windows Server 2008 R2, utilisez la commande suivante :

ServerManagerCmd -install BitLockers

Préparer le volume du système d’exploitation pour BitLocker à l’aide de bdehdcfg

Pour compresser la partition du système d’exploitation et préparer la machine pour BitLocker, exécutez si nécessaire bdehdcfg :

bdehdcfg -target c: shrink -quiet

Protéger le volume du système d’exploitation à l’aide de BitLocker

Utilisez la commande manage-bde pour activer le chiffrement sur le volume de démarrage à l’aide d’un protecteur de clé externe. Placez également la clé externe (fichier .bek) sur le disque ou le volume externe. Le chiffrement sera activé sur le volume système/de démarrage au prochain redémarrage.

manage-bde -on %systemdrive% -sk [ExternalDriveOrVolume]
reboot

Notes

Préparez la machine virtuelle avec un disque dur virtuel de données/de ressources distinct pour obtenir la clé externe à l’aide de BitLocker.

Télécharger des disques durs virtuels cryptés dans un compte de stockage Azure

Une fois le chiffrement BitLocker activé, le disque dur virtuel chiffré local doit être chargé sur votre compte de stockage.

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

Charger le secret pour la machine virtuelle préchiffrée dans votre coffre de clés

Le secret de chiffrement de disque obtenu précédemment doit être chargé en tant que secret dans votre coffre de clés. Pour ce faire, vous devez accorder l’autorisation de définition de secret et l’autorisation wrapkey au compte qui chargera les secrets.

# Typically, account Id is the user principal name (in user@domain.com format)
$upn = (Get-AzureRmContext).Account.Id
Set-AzKeyVaultAccessPolicy -VaultName $kvname -UserPrincipalName $acctid -PermissionsToKeys wrapKey -PermissionsToSecrets set

# In cloud shell, the account ID is a managed service identity, so specify the username directly
# $upn = "user@domain.com"
# Set-AzKeyVaultAccessPolicy -VaultName $kvname -UserPrincipalName $acctid -PermissionsToKeys wrapKey -PermissionsToSecrets set

# When running as a service principal, retrieve the service principal ID from the account ID, and set access policy to that
# $acctid = (Get-AzureRmContext).Account.Id
# $spoid = (Get-AzureRmADServicePrincipal -ServicePrincipalName $acctid).Id
# Set-AzKeyVaultAccessPolicy -VaultName $kvname -ObjectId $spoid -BypassObjectIdValidation -PermissionsToKeys wrapKey -PermissionsToSecrets set

La clé secrète de chiffrement de disque non chiffré avec une clé de chiffrement à clé KEK

Utilisez Set-AzKeyVaultSecret pour configurer la clé secrète dans votre coffre de clés. La phrase secrète est encodée sous forme de chaîne en base64, puis chargée dans le coffre de clés. Assurez-vous également que les balises suivantes sont définies lors de la création de la clé secrète dans le coffre de clés.


 # 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

Utilisez $secretUrl à l’étape suivante pour attacher le lecteur du système d’exploitation sans utiliser de clé de chiffrement à clé.

Disque chiffré avec une clé secrète de chiffrement de disque à clé KEK

Avant de télécharger la clé secrète dans le coffre de clés, vous pouvez éventuellement la chiffrer à l’aide d’une clé de chiffrement à clé. Utilisez l’API de retour à la ligne pour chiffrer d’abord la clé secrète à l’aide de la clé de chiffrement à clé. La sortie de cette opération de retour à la ligne est une chaîne d’URL encodée en base64 que vous pouvez ensuite charger comme clé secrète à l’aide de l’applet de commande Set-AzKeyVaultSecret.

    # 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

Utilisez $KeyEncryptionKey et $secretUrl à l’étape suivante pour attacher le lecteur du système d’exploitation à l’aide de la clé de chiffrement à clé.

Spécifier une URL secrète lorsque vous attachez un lecteur de système d’exploitation

Sans utiliser de clé de chiffrement à clé KEK

Lorsque vous attachez le lecteur du système d’exploitation, exécutez la commande $secretUrl. L’URL a été générée dans la section « La clé secrète de chiffrement de disque non chiffrée avec une clé de chiffrement à clé ».

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

À l’aide d’une clé de chiffrement à clé KEK

Lorsque vous attachez le lecteur du système d’exploitation, exécutez les commandes $KeyEncryptionKey et $secretUrl. L’URL a été générée dans la section « Secret de chiffrement de disque chiffré avec une clé KEK ».

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