去年から Application Gateway の v2 SKU で Key Vault 連携が行われるという話が出たっきり音沙汰無しだったのですが、最近になって PowerShell で Key Vault 連携を行うドキュメントが公開されていました。
現在は PowerShell か ARM の API を直接叩くぐらいしかないです。そして CDN や Front Door のように簡単に設定は行えず、User Assigned Identity を用意して行う必要があります。
System Assigned ではないのでかなり面倒ですが、2019 年にもなって PFX を手動で管理とかやりたくないので、とりあえず手順と動作を確認しておきました。
あと Azure PowerShell が嫌いすぎるので Azure CLI を使って作業を行いました。
User Assigned Identity を作成する
Application Gateway が Key Vault にアクセスするために使う User Assigned Identity を作成します。これぐらいは Azure Portal でも作れそうですが、コマンドでも 1 行で終わるので作ります。
az identity create -g <RESOURCE GROUP> -n <IDENTITY NAME>
リソースグループは Application Gateway と同じものを指定しました。
作成した User Assigned Identity に対して、証明書が入っている Key Vault の Access policy から Secret への get を許可するパーミッションを追加します。
この辺りは App Service や Front Door での Key Vault 連携と同じです。
Access policy の設定が終わったので、Application Gateway に User Assigned Identity を割り当てます。assign コマンドとかは実装されていないので、ARM を意識して処理を書きます。
az network application-gateway update -n <NAME> -g <RESOURCE GROUP> --set identity.type='UserAssigned' \ identity.userAssignedIdentities="{'/subscriptions/**/resourcegroups/**/providers/Microsoft.ManagedIdentity/userAssignedIdentities/**:{}}"
将来的には az network application-gateway identity assign
とかが実装されるのではないかと。
実行してリソースの状態を確認すると、ちゃんと Identity に割り当てられています。
これで Application Gateway が指定した Key Vault へのアクセスを行えるようになりました。まだ準備段階ですが、既にこの時点で面倒でした。
Key Vault から証明書をインポート
Key Vault に格納されている証明書の ID を使って、Application Gateway にインポートを行うわけですが、これもコマンドはまだ用意されていないので ARM を意識して書きます。
とはいえ keyVaultSecretId
だけで済むので割と楽です。
az network application-gateway update -n <NAME> -g <RESOURCE GROUP> --add sslCertificates \ "{'name':'daruyanagi','properties':{'keyVaultSecretId':'https://**.vault.azure.net/secrets/**/'}}"
上のコマンドを実行すると Key Vault 周りでのエラーが発生しました。 エラーメッセージはターミナルに全然出てなかったのですが、Activity log には残されていました。
KeyVault Secrets 'https://**.vault.azure.net/secrets/**/' associated with Application Gateway Certificate '/subscriptions/**/resourceGroups/**/providers/Microsoft.Network/applicationGateways/**/sslCertificates/**' should have Recovery Level supporting Recoverable attribute. Please enable Soft Delete feature on the assocaited Key Vault.
確認すると Key Vault の Soft Delete を有効化しろとありました。よく読むとドキュメントの方では新しく Key Vault 作成時に、明示的に Soft Delete を有効化していました。
Azure CLI では例によって設定できないみたいなので、これも ARM を直接叩いて設定します。
ARM Explorer では API Version の関係上出てこないので、CLI を使うしか方法は無さそうです。
az resource update --ids /subscriptions/**/resourceGroups/**/providers/Microsoft.KeyVault/vaults/** --set properties.enableSoftDelete=true
Soft Delete の有効化後、もう一度 Key Vault から証明書のインポートを行うと、今度は無事に成功しました。思ったよりも時間はかかったので、気長に待つ必要があります。
ちゃんと証明書の一覧を確認すると Key Vault からだと判別できます。
これで後は Azure Portal から設定が行えるようになります。そして気になる証明書の更新ですが、同じ名前で再度インポートを実行すればやってくれるようです。
HTTPS 用の Listener を追加する
ここからは Key Vault 関係ないのでサクッと行きます。新しい Listener の作成時に HTTPS を選ぶと、先ほど Key Vault からインポートして証明書が選べるようになっているはずです。
HTTPS の Listener を作成して、適当にルールを割り当てて、Public IP に Azure DNS からドメインを割り当てると、HTTPS 対応の Application Gateway が出来上がります。
Key Vault で管理しているので、前に Front Door で使うために作成した証明書をそのまま Application Gateway でも使うことが出来ました。
他のサービスと比べて面倒でしたが、Azure Portal でのサポートがされると多少はマシになるのではないかと思います。とはいえ、個人的には Front Door が良いなと思っています。