Azure 仮想マシン ディスク暗号化

スポンサーリンク

Microsoft Azureの仮想マシンが使用するディスクを暗号化する方法をまとめます。暗号化手法には、「Azure Disk Encryption (ADE)」「Server-Side Encryption (SSE)」「ホストでの暗号化」など、いくつかの手法があります。

参考資料

参考になる公式ドキュメントを以下に示します。

事前準備

以下、仮想ネットワーク等のリソースを作成します。

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

ポータルで「キーコンテナ」の「キー」画面を開き、想定通りのキーが作成されている事を確認します。

Azure 作成済キーの確認

ディスク暗号化セット

ディスクをどのように暗号化するかの設定を定義した「ディスク暗号化セット」と呼ばれる定義体を作成します。

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

ポータルから想定通りの「ディスク暗号化セット」が作成された事を確認します。

「すべてのサービス」から辿る場合は、「その他」「ディスク暗号化セット」の順に画面遷移します。

Azure ディスク暗号化セットの確認

キーコンテナのアクセスポリシー

前述の操作で作成した「ディスク暗号化セット」が「キーコンテナ」にアクセス可能なように権限を付与します。最低限必要となる権限は「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

ポータルで「キーコンテナ」の「アクセスポリシー」画面を開き、「ディスク暗号化セット」に対して権限が付与されている事を確認します。

Azure キーコンテナのアクセスポリシー

仮想マシンの操作例

仮想マシンの新規作成する場合

仮想マシンの新規作成時にディスクを暗号化するには、仮想マシン作成時の引数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」と書かれている事を確認します。

Azure CMKによるSSEの設定例 01

作成済ディスクを暗号化する場合

動作確認用の仮想マシンを作成します。

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」と書かれている事を確認します。

Azure CMKによるSSEの設定例 02

ホストでの暗号化

概要

ホストでの暗号化は、ストレージ(サーバ)側ではなく仮想マシン(クライアント)側で暗号化する手法です。

機能有効化(リソースプロバイダー)

「ホストでの暗号化」機能はデフォルトでは有効になっていません。この機能を有効化するには、以下のコマンドを使用します。

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 ホストでの暗号化 01

「ホストでの暗号化」欄を確認します。

Azure ホストでの暗号化 02

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 (ボリューム暗号化用)」が有効になっている事を確認します。

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」と表示される事を確認します。

Azure Disk Encription

タイトルとURLをコピーしました