Microsoft Azureの仮想マシンが使用するディスクを暗号化する方法をまとめます。暗号化手法には、「Azure Disk Encryption (ADE)」「Server-Side Encryption (SSE)」「ホストでの暗号化」など、いくつかの手法があります。
参考資料
参考になる公式ドキュメントを以下に示します。
- マネージド ディスク暗号化オプションの概要
- Azure Disk Storage のサーバー側暗号化
- Azure CLI を使用して、マネージド ディスクでカスタマー マネージド キーを使用し、サーバー側の暗号化を有効にする
- Azure CLI を使用して、ホストでの暗号化を使用したエンドツーエンドの暗号化を有効にする
- Linux VM に対する Azure Disk Encryption
- クイック スタート:Azure CLI を使用して Linux VM を作成、暗号化する
事前準備
以下、仮想ネットワーク等のリソースを作成します。
az group create --name MyResourceGroup --location japaneast az network vnet create \ -g MyResourceGroup \ -n MyVnet \ --address-prefix 172.16.0.0/16 \ --subnet-name MySubnet \ --subnet-prefix 172.16.0.0/24 az network nsg create -g MyResourceGroup -n MyNsg az network nsg rule create \ --resource-group MyResourceGroup \ --nsg-name MyNsg \ --name MyNsgRule0100 \ --priority 100 \ --destination-port-ranges 22 \ --access Allow \ --protocol Tcp
Server-Side Encryption (SSE)
概要
Server-Side Encryption(SSE)は、仮想マシン(クライアント)がストレージ(サーバ)にデータを書き込む時に、ストレージ(サーバ)側で暗号化する手法です。
暗号化の操作例
キーコンテナ(KeyVault)の作成
ディスクを暗号化する時に使用する鍵を格納するキーコンテナと呼ばれる入れ物を作成します。キーコンテナはAzureで一意な名前をつける必要がありますので、「sample01」のような他の人が使ってそうな名前は使用できません。
az keyvault create -n KeyVaultGokatei01 \ --resource-group MyResourceGroup \ --location japaneast \ --retention-days 7 \ --enable-purge-protection true
キーの作成
キーコンテナの中には、キーや証明書を格納し暗号化に関する処理を管理する事ができます。キーコンテナの中にキーを作成します。
az keyvault key create \ --vault-name KeyVaultGokatei01 \ --name KeyGokatei01 \ --protection software
ポータルで「キーコンテナ」の「キー」画面を開き、想定通りのキーが作成されている事を確認します。
ディスク暗号化セット
ディスクをどのように暗号化するかの設定を定義した「ディスク暗号化セット」と呼ばれる定義体を作成します。
KEY_VAULT_ID=$(az keyvault show -n KeyVaultGokatei01 \ --resource-group MyResourceGroup \ --query "id" \ --output tsv ) KEY_VAULT_ID_URL=$(az keyvault key show -n KeyGokatei01 \ --vault-name KeyVaultGokatei01 \ --query "key.kid" \ --output tsv ) az disk-encryption-set create \ --resource-group MyResourceGroup \ --location japaneast \ --name MyDiskEncryption01 \ --source-vault ${KEY_VAULT_ID} \ --key-url ${KEY_VAULT_ID_URL} \ --enable-auto-key-rotation true
ポータルから想定通りの「ディスク暗号化セット」が作成された事を確認します。
「すべてのサービス」から辿る場合は、「その他」「ディスク暗号化セット」の順に画面遷移します。
キーコンテナのアクセスポリシー
前述の操作で作成した「ディスク暗号化セット」が「キーコンテナ」にアクセス可能なように権限を付与します。最低限必要となる権限は「wrapkey(キーを折り返す)」「unwrapkey(キーの折り返しを解除)」「get(取得)」です。
DES_IDENTITY=$(az disk-encryption-set show \ --resource-group MyResourceGroup \ --name MyDiskEncryption01 \ --query "identity.principalId" \ --output tsv ) az keyvault set-policy -n KeyVaultGokatei01 \ --resource-group MyResourceGroup \ --object-id ${DES_IDENTITY} \ --key-permissions wrapkey unwrapkey get
ポータルで「キーコンテナ」の「アクセスポリシー」画面を開き、「ディスク暗号化セット」に対して権限が付与されている事を確認します。
仮想マシンの操作例
仮想マシンの新規作成する場合
仮想マシンの新規作成時にディスクを暗号化するには、仮想マシン作成時の引数os-disk-encryption-setやdata-disk-encryption-setsに「暗号化ディスクセット」のidを指定します。
DISK_ENCRYPTION_SET_ID=$(az disk-encryption-set show \ --resource-group MyResourceGroup \ --name MyDiskEncryption01 \ --query "id" \ --output tsv ) az vm create \ --resource-group MyResourceGroup \ --name linux010 \ --image UbuntuLTS \ --size Standard_B2s \ --admin-username azureuser \ --authentication-type ssh \ --ssh-key-values ~/.ssh/authorized_keys \ --os-disk-encryption-set ${DISK_ENCRYPTION_SET_ID} \ --data-disk-sizes-gb 16 32 \ --data-disk-encryption-sets ${DISK_ENCRYPTION_SET_ID} ${DISK_ENCRYPTION_SET_ID}
「仮想マシン」の「ディスク」画面で、「CMKによるSSE」と書かれている事を確認します。
作成済ディスクを暗号化する場合
動作確認用の仮想マシンを作成します。
az vm create \ --resource-group MyResourceGroup \ --name linux011 \ --image UbuntuLTS \ --size Standard_B2s \ --admin-username azureuser \ --authentication-type ssh \ --ssh-key-values ~/.ssh/authorized_keys \ --data-disk-sizes-gb 16
仮想マシンにアタッチ(接続)されたディスクを暗号化する事はできません。暗号化するにはデタッチ(取り外し)をする必要があります。
DISK_NAME=$(az vm show \ --resource-group MyResourceGroup \ --name linux011 \ --query "storageProfile.dataDisks[0].name" \ --output tsv ) az vm disk detach \ --resource-group MyResourceGroup \ --vm-name linux011 \ --name ${DISK_NAME}
ディスクを暗号化します。
DISK_ENCRYPTION_SET_ID=$(az disk-encryption-set show \ --resource-group MyResourceGroup \ --name MyDiskEncryption01 \ --query "id" \ --output tsv ) az disk update \ --resource-group MyResourceGroup \ --name ${DISK_NAME} \ --encryption-type EncryptionAtRestWithCustomerKey \ --disk-encryption-set ${DISK_ENCRYPTION_SET_ID}
暗号化されたディスクを再びアタッチ(接続)します。
az vm disk attach \ --resource-group MyResourceGroup \ --vm-name linux011 \ --name ${DISK_NAME}
「仮想マシン」の「ディスク」画面で、「CMKによるSSE」と書かれている事を確認します。
ホストでの暗号化
概要
ホストでの暗号化は、ストレージ(サーバ)側ではなく仮想マシン(クライアント)側で暗号化する手法です。
機能有効化(リソースプロバイダー)
「ホストでの暗号化」機能はデフォルトでは有効になっていません。この機能を有効化するには、以下のコマンドを使用します。
az feature register \ --namespace Microsoft.Compute \ --name EncryptionAtHost
今現在、機能が有効化どうかを確かめるには、以下のようなshowコマンドを使います。
az feature show \ --namespace Microsoft.Compute \ --name EncryptionAtHost
暗号化の操作例
「キーコンテナ(KeyVault)」や「暗号化ディスクセット」を作成します。設定方法は「Server-Side Encryption(SSE)」と全く同じですので、説明を省略します。
仮想マシンの操作例
ホストで暗号化する場合は、仮想マシン作成時にencryption-at-hostという引数を付与します。それ以外の引数の指定方法は「Server-Side Encryption(SSE)」と同じです。
DISK_ENCRYPTION_SET_ID=$(az disk-encryption-set show \ --resource-group MyResourceGroup \ --name MyDiskEncryption01 \ --query "id" \ --output tsv ) az vm create \ --resource-group MyResourceGroup \ --name linux020 \ --image UbuntuLTS \ --size Standard_B2s \ --admin-username azureuser \ --authentication-type ssh \ --ssh-key-values ~/.ssh/authorized_keys \ --encryption-at-host \ --os-disk-encryption-set ${DISK_ENCRYPTION_SET_ID} \ --data-disk-sizes-gb 16 32 \ --data-disk-encryption-sets ${DISK_ENCRYPTION_SET_ID} ${DISK_ENCRYPTION_SET_ID}
ホスト(クライアント)側で暗号化されるか、ストレージ(サーバ)側で暗号化されるかは、仮想マシンのsecurityProfileのencryptionAtHostを見ると確認ができます。
$ az vm show \ --resource-group MyResourceGroup \ --name linux020 \ --query "securityProfile" { "encryptionAtHost": true, "securityType": null, "uefiSettings": null }
ポータルで確認する場合は、「仮想マシン」「ディスク」の画面にて「追加設定」を押下します。
「ホストでの暗号化」欄を確認します。
Azure Disk Encription (ADE)
概要
Azure Disk Encriptionは、WindowsならばBitLockerを、LinuxならばDM-Cryptを使用した暗号化の仕組みです。これら暗号化で使用されるキーとシークレットはキーコンテナ(KeyVault)に格納して管理されます。
暗号化の操作例
キーコンテナ(KeyVault)の作成
ディスクを暗号化する時に使用する鍵を格納するキーコンテナと呼ばれる入れ物を作成します。キーコンテナはAzureで一意な名前をつける必要がありますので、「sample01」のような他の人が使ってそうな名前は使用できません。
「Server-Side Encryption (SSE)」と異なり、enabled-for-disk-encryptionを指定しなければならない事に注意ください。
az keyvault create -n KeyVaultGokatei02 \ --resource-group MyResourceGroup \ --location japaneast \ --retention-days 7 \ --enable-purge-protection true \ --enabled-for-disk-encryption
「キーコンテナ」「アクセスポリシー」の画面にて、「Azure Disk Encryption (ボリューム暗号化用)」が有効になっている事を確認します。
仮想マシンの操作例
動作確認用の仮想マシンを作成します。仮想マシンはメモリは8G以上にしてください。
なお、Azure Disk Encriptionを使用するには、ディストリビューションやメモリサイズに一定の制約があります。制約条件は「Linux VM に対する Azure Disk Encryption」を参照ください。
az vm create \ --resource-group MyResourceGroup \ --name linux030 \ --image OpenLogic:CentOS:8_4:latest \ --size "Standard_D2S_V3"\ --admin-username azureuser \ --authentication-type ssh \ --ssh-key-values ~/.ssh/authorized_keys
Azure Disk Encription (ADE)を使用するには、az vm encryption enableコマンドを使用します。
az vm encryption enable \ --resource-group MyResourceGroup \ --name linux030 \ --disk-encryption-keyvault KeyVaultGokatei02
コマンドを実行しても暗号化は即時完了しません。以下のようにshowコマンドを使用すると、「Progress: 56.0%」のように暗号化の進捗を確認する事ができます。
$ az vm encryption show \ --resource-group MyResourceGroup \ --name linux030 \ --query "[status,substatus]" [ [ { "code": "ProvisioningState/succeeded", "displayStatus": "Provisioning succeeded", "level": "Info", "message": "Background encrypting /dev/mapper/osencrypt - Progress: 56.0%, ETA 04:11, 16650 MiB written, speed 52.1 MiB/s", "time": null } ], [ { "code": "ComponentStatus/Microsoft.Azure.Security.AzureDiskEncryptionForLinux/succeeded", "displayStatus": "Provisioning succeeded", "level": "Info", "message": "{\"data\": \"NotMounted\", \"os\": \"EncryptionInProgress\"}", "time": null } ] ]
暗号化が完了すると、以下のように表示されます。
$ az vm encryption show \ --resource-group MyResourceGroup \ --name linux030 \ --query "[status,substatus]" [ [ { "code": "ProvisioningState/succeeded", "displayStatus": "Provisioning succeeded", "level": "Info", "message": "Encryption succeeded for OS volume", "time": null } ], [ { "code": "ComponentStatus/Microsoft.Azure.Security.AzureDiskEncryptionForLinux/succeeded", "displayStatus": "Provisioning succeeded", "level": "Info", "message": "{\"data\": \"NotMounted\", \"os\": \"Encrypted\"}", "time": null } ] ]
念のため、ポータルでも確認してみましょう。「仮想マシン」の「ディスク」画面で、「PMK と ADE による SSE」と表示される事を確認します。