Azure Disk Encryption のサンプル スクリプト

Important

Azure Disk Encryption は、 2028 年 9 月 15 日に廃止される予定です。 その日まで、中断することなく Azure Disk Encryption を引き続き使用できます。 2028 年 9 月 15 日に、ADE 対応ワークロードは引き続き実行されますが、暗号化されたディスクは VM の再起動後にロック解除に失敗し、サービスが中断されます。

新しい VM の ホストで暗号化 を使用するか、 コンフィデンシャル コンピューティング ワークロード用の OS ディスク暗号化を使用して機密 VM サイズ を検討します。 サービスの中断を回避するために、すべての ADE 対応 VM (バックアップを含む) を提供終了日より前にホストで暗号化に移行する必要があります。 詳細については、「 Azure Disk Encryption からホストでの暗号化への移行 」を参照してください。

適用対象: ✔️ Windows VM

この記事は、事前に暗号化された VHD の準備およびその他のタスクのためのサンプル スクリプトを提供します。

すべてのスクリプトは、特に明記されている場合を除き、非 AAD の最新バージョンの ADE を参照します。

Azure Disk Encryption 用の PowerShell スクリプトのサンプル

  • サブスクリプション内の暗号化された VM をすべて一覧表示する

Find_1passAdeVersion_VM.ps1 PowerShell スクリプトを使用すると、サブスクリプションに存在するすべてのリソース グループ内のすべての ADE で暗号化された VM と拡張機能のバージョンを確認できます。

または、これらのコマンドレットでは、ADE で暗号化されたすべての VM が表示されます (拡張機能のバージョンは表示されません)。

$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}
  • サブスクリプション内のすべての暗号化された VMSS インスタンスを一覧表示する

    Find_1passAdeVersion_VMSS.ps1 PowerShell スクリプトを使用すると、サブスクリプションに存在するすべてのリソース グループ内のすべての ADE で暗号化された仮想マシン スケール セット インスタンスと拡張機能バージョンを検索できます。

  • キー コンテナー内の VM を暗号化するために使用されるディスクの暗号化シークレットをすべて一覧表示する

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 Encryption の前提条件である PowerShell スクリプトの使用

Azure Disk Encryption の前提条件に既に精通している場合は、Azure Disk Encryption の前提条件である PowerShell スクリプトを使用できます。 この PowerShell スクリプトの使用例については、VM の暗号化のクイック スタートに関するページを参照してください。 既存のリソース グループ内の既存の VM のすべてのディスクを暗号化するために、スクリプトの 211 行目から始まるセクションのコメントを削除できます。

次の表に、PowerShell スクリプトで使用できるパラメーターを示します。

パラメーター 説明 必須かどうか
$resourceGroupName キー コンテナーが属するリソース グループの名前。 スクリプトは、この名前の新しいリソース グループが存在しない場合に作成します。 True
$keyVaultName 暗号化キーを配置するキー コンテナーの名前。 この名前のボールトが存在しない場合、スクリプトは新しいボールトを作成します。 True
$location キー ボールトの場所。 暗号化するキー コンテナーと VM が同じ場所にあることを確認します。 Get-AzLocation を使用して場所の一覧を取得します。 True
$subscriptionId 使用するAzure サブスクリプションの識別子。 Get-AzSubscriptionでサブスクリプション ID を取得します。 True
$aadAppName シークレットをKey Vaultに書き込むMicrosoft Entra アプリケーションの名前。 スクリプトは、この名前の新しいアプリケーションが存在しない場合に作成します。 このアプリが既に存在する場合は、aadClientSecret パラメーターをスクリプトに渡します。 False
$aadClientSecret 前に作成したMicrosoft Entra アプリケーションのクライアント シークレット。 False
$keyEncryptionKeyName Key Vaultの省略可能なキー暗号化キーの名前。 この名前のキーが存在しない場合、スクリプトは新しいキーを作成します。 False

Resource Manager テンプレート

Microsoft Entra アプリを使用せずに VM を暗号化または暗号化解除する

Microsoft Entra アプリを使用して VM を暗号化または復号化する

事前に暗号化された Windows VHD を準備する

次のセクションでは、IaaS で暗号化された VHD として展開するために、事前に暗号化されたWindows VHD Azure準備する方法について説明します。 この情報を使用して、Azure Site RecoveryまたはAzureで新しいWindows VM (VHD) を準備して起動します。 VHD を準備してアップロードする方法の詳細については、「一般化された VHD をアップロードし、それを使用してAzureに新しい VM を作成する」を参照してください。

グループ ポリシーを更新して非 TPM で OS を保護できるようにする

[ローカル コンピューター ポリシー]>>> の下にある、[BitLocker ドライブ暗号化] という BitLocker グループ ポリシー設定を構成します。 次の図に示すように、[オペレーティング システムのドライブ]>[スタートアップ時に追加の認証を要求する]>[互換性のある TPM が装備されていない BitLocker を許可する] の順に選択して、この設定を変更します。

Azure の Microsoft Antimalware

BitLocker 機能コンポーネントのインストール

Windows Server 2012 以降の場合は、次のコマンドを使用します。

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

Windows Server 2008 R2 の場合は、次のコマンドを使用します。

ServerManagerCmd -install BitLockers

bdehdcfg を使用して BitLocker の OS ボリュームを準備する

OS のパーティションを圧縮して、BitLocker 用にマシンを準備するには、必要に応じて、bdehdcfg を実行します。

bdehdcfg -target c: shrink -quiet

BitLocker を使用して OS ボリュームを保護する

manage-bde コマンドを使用して、外部キー保護機能を使用してブート ボリュームの暗号化を有効にします。 また、外部ドライブまたは外部ボリューム上に外部キー (.bek ファイル) を配置します。 システム/ブート ボリュームでの暗号化は、次回のリブート後に有効になります。

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

BitLocker を使用して外部キーを取得する場合は、そのためのデータ/リソース VHD を別個に使用して VM を準備してください。

暗号化された VHD を Azure ストレージ アカウントにアップロードする

BitLocker 暗号化を有効にした後、ローカル環境で暗号化された VHD をストレージ アカウントにアップロードする必要があります。

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

事前に暗号化された VM 用のシークレットをキー コンテナーにアップロードする

以前にシークレットとして取得したディスク暗号化シークレットをキー コンテナーにアップロードします。 これを行うには、シークレットの設定アクセス許可とラップキーアクセス許可を、シークレットをアップロードするアカウントに付与します。

# 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

KEK で暗号化されないディスク暗号化シークレット

キー コンテナーにシークレットを設定するには、Set-AzKeyVaultSecret を使用します。 パスフレーズが base64 文字列としてエンコードされてから、キー コンテナーにアップロードされます。 また、キー コンテナーにシークレットを作成するときには、次のタグが設定されます。


 # 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 で暗号化されるディスク暗号化シークレット

必要に応じて、シークレットをキー コンテナーにアップロードする前に、キー暗号化キーを使用してシークレットを暗号化できます。 ラップ API を使用して、最初にキー暗号化キーを使用してシークレットを暗号化します。 このラップ操作の出力は、base64 URL エンコードされた文字列です。これは、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 by using a 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する次の手順では、$secretUrlを使用します。

OS ディスクをアタッチするときにシークレット URL を指定する

KEK を使用しない

OS ディスクを接続するときに、 $secretUrl渡します。 URL は、"KEK で暗号化されていないディスク暗号化シークレット" セクションで生成されます。

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

KEK を使用する

OS ディスクをアタッチするときに、$KeyEncryptionKey$secretUrl を渡します。 URL は、"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