銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Azure CLI を使ってLinux VMにAzure Disk Encryptionを適用する

Azure Storageの暗号化については、すでにほとんど、くらう道さんでわかりやすく説明されています。

www.cloudou.net

最近のManaged DiskであればStorage Service Encryption(SSE)でデフォルトで暗号化されているので、これで十分ということも多いでしょう。

docs.microsoft.com

ただ、場合によってはAzure Disk Encryption (ADE)による暗号化が必要になるケースもあると聞きます。

docs.microsoft.com

ADEについてもくらう道さんの記事でPowerShellを使った方法は紹介されているのですが、Azure CLIを使った方法について今回まとめてみました。

Linux VMの場合、注意すべきがベンダーによるサポートの有無です。ADEの適用がベンダーによりサポートされていないケースもあるので、まずそこはご確認ください。そのうえで実際に試した手順になります。 まず、WALinuxAgentを最新版にしておきましょう。手元の環境だと、古いバージョンだとなぜか処理がスタックして動かないことがありました。

そして、Azure CLIを使って、Service Principalを作ります。証明書を使う方法はLinux VMではサポートされないのでパスワードを利用します。RBAC用のService Principakと違ってパスワードは自動生成されないようなので、指定しています。また、indentifier urlはアクセスするURIとしては使いませんが、ユニークな値を指定しないといけないので適当に指定しておきます。最初のコマンドの実行結果に表示されている application_id を次のコマンドのオプションに指定します。このIDは先でも使います。

$ az ad app create --display-name <name> --identifier-uris https://<name> --Password <password>

$ az ad sp create --id <application_id>

次にKeyVaultを作成します。仮想マシンと同じリソースグループ、同じロケーションにある既存のKeyVaultを利用することもできます。新規に作る場合は同じリソースグループ、同じロケーションに作るようにします。最初のコマンドは場合によって必要になります。一度、同じキーで複数の仮想マシンの暗号化をしようとしたらうまくいかなかったので、もしかすると仮想マシンごとに用意する必要があるかもしれません。

$ az provider register -n Microsoft.KeyVault
$ az keyvault create -n <keyvalue_name> -g <resource_group> --enabled-for-disk-encryption True

$ az keyvault set-policy --name <keyvalue_name> --spn <application_id> --key-permissions wrapKey  --secret-permissions set

$ az keyvault key create --vault-name <keyvalue_name> --name <keyname> --protection software

そして、VMの暗号化を実行します。このコマンドが実行してしばらくするとVMは再起動します。時間がかかるので処理されているか気になる場合は、WALinuxAgentのログをtailしておくといいでしょう。 また、--volume-typeはOSディスクのみ(OS)、DATAディスクのみ(DATA)、すべて(ALL)の3つが選べます。なお、OSディスクが有効になっている場合のみ、データディスクが追加された場合に暗号化が有効になります。OSディスクの暗号化が有効になっていないと、DATAディスクの暗号化が有効になっていてても、そのあと追加されたDATAディスクの暗号化は実行されませんでした。

$ az vm encryption enable -g <resourcegroup_name> -n <vm_name> --aad-client-id <application_id> --aad-client-secret <password> --disk-encryption-keyvault <keyvalue_name>  --key-encryption-key  <keyname> --volume-type DATA

VMの再起動後もしばらく暗号化処理は実行されます。状態の確認はAzure CLIコマンドで行います。また、VMを再起動するたびに起動後しばらくは暗号化処理が行われています*1

$ az vm encryption show -g <resourcegroup_name> -n <vm_name>

暗号化が完了しているとこういうメッセージが表示されます。

{
  "dataDisk": "NotEncrypted",
  "osDisk": "Encrypted",
  "osDiskEncryptionSettings": {
    "diskEncryptionKey": {
      "secretUrl": "...",
      "sourceVault": {
        "id": "..."
      }
    },
    "enabled": true,
    "keyEncryptionKey": {
      "keyUrl": "...",
      "sourceVault": {
        "id": "..."
      }
    }
  },
  "osType": "Linux",
  "progressMessage": "Encryption succeeded for data volumes"
}

というわけで暗号化は完了です。暗号化のために、/dev/sdcにデバイスがマウントされていますが、これはBek Volumeといって重要なのでかってに消したりしてはだめなのはくらう道で説明されている通りです。という/dev/sdc関連でトラブルがおきるというのを次のエントリで紹介します。

*1:すくなくとも、deallocate/startでは確認済み