しばやん雑記

ASP.NET Core とメイドさんが大好きなフリーランスのプログラマーのブログ

Application Gateway v2 の Key Vault 連携を試してみた

去年から 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 と同じものを指定しました。

f:id:shiba-yan:20190428170659p:plain

作成した User Assigned Identity に対して、証明書が入っている Key Vault の Access policy から Secret への get を許可するパーミッションを追加します。

f:id:shiba-yan:20190428170718p:plain

この辺りは 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 に割り当てられています。

f:id:shiba-yan:20190428170738p:plain

これで 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 からだと判別できます。

f:id:shiba-yan:20190428170940p:plain

これで後は Azure Portal から設定が行えるようになります。そして気になる証明書の更新ですが、同じ名前で再度インポートを実行すればやってくれるようです。

HTTPS 用の Listener を追加する

ここからは Key Vault 関係ないのでサクッと行きます。新しい Listener の作成時に HTTPS を選ぶと、先ほど Key Vault からインポートして証明書が選べるようになっているはずです。

f:id:shiba-yan:20190428171630p:plain

HTTPS の Listener を作成して、適当にルールを割り当てて、Public IP に Azure DNS からドメインを割り当てると、HTTPS 対応の Application Gateway が出来上がります。

f:id:shiba-yan:20190428171823p:plain

Key Vault で管理しているので、前に Front Door で使うために作成した証明書をそのまま Application Gateway でも使うことが出来ました。

他のサービスと比べて面倒でしたが、Azure Portal でのサポートがされると多少はマシになるのではないかと思います。とはいえ、個人的には Front Door が良いなと思っています。