🥕

Azure Front Door と Application Gateway を Key Vault と連携させる方法

2023/04/09に公開

はじめに

Azure Front Door や Application Gateway v2 は、Key Vault との統合をサポートしています。
Key Vault を利用することで、サーバー証明書の更新等が楽になりますし、セキュリティの観点からも望ましいかと思います。
また、Azure Front Door で独自の証明書を利用する場合には、連携が必須ですので、 Key Vault との連携方法や、利用可能な証明書などを整理しておきます。

また、現時点ではパブリック プレビューではありますが、マネージド ID を利用した Azure Front Door と Key Vault の連携も試してみました。

image.png

利用できる証明書

早速利用できる証明書を整理しておきます。

利用できる証明書 Azure Front Door Application Gateway
マネージド証明書 利用できる -
CA (証明機関) 証明書 利用できる 利用できる
EV (拡張された検証) 証明書 - 利用できる
ワイルドカード証明書 利用できる 利用できる
自己署名証明書 - 利用できる
証明書を持ち込む方法 PFX ファイル を Key Vault にアップロード PFX ファイル を Key Vault にアップロード
 PFX ファイル を 直接 Application Gateway にアップロード

Azure Front Door のいいところは、マネージド証明書が利用できるところですね。
マネージド証明書であれば、有効期限が近づくと、勝手に Azure が証明書を更新してくれます。
Application Gateway だと、マネージド証明書は利用できないので、持ち込む必要があります。

Application Gateway には、自己署名の証明書(オレオレ証明書)も持ち込めるなど、Azure Front Door といくつか差があります。
なお、Application Gateway は、証明書を直接アップロードすることができますが、セキュリティ観点からは、Key Vault 連携の方がよいですね。

Key Vault 連携に利用できる ID

Key Vault に格納した証明書を取得する際に、Azure Front Door や Application Gateway がそれぞれ利用できる ID を確認しておきます。

ID Azure Front Door Application Gateway
サービスプリンシパル 利用できる -
システム マネージド ID 利用できる(プレビュー) -
ユーザー割り当てマネージド ID 利用できる(プレビュー) 利用可能

マネージド ID を使用して他のサービスにアクセスできる Azure サービスの一覧は こちらの公開ドキュメント にまとまっていますが、 Azure Front Door は記載がありません。(2023年3月時点)
これは、Azure Front Door とマネージド ID の統合が、2022年11月にパブリック プレビューとしてアナウンスされ、本記事時点でもパブリック プレビュー段階なためかと思います。

https://azure.microsoft.com/ja-jp/updates/public-preview-azure-front-door-integration-with-managed-identities/

Azure Front Door でサービスプリンシパルを利用する手順には、Azure AD 全体管理者権限が求められ、テナントレベルで1回限りのコマンド実行があるなど、検証するにも少しハードルがある感じもありますので、個人的にはマネージド ID 利用が早く GA になってほしい感じです。

Key Vault 側アクセス制御(アクセス ポリシー / Azure RBAC)と 設定方法の違いなど

Key Vault 連携に利用できる ID は、いわゆる認証の部分(どういったIDを利用できるか)ですが、認可の部分(その ID が Key Vault に対して何ができるか)についても確認しておきます。

Key Vault は、コンテナー アクセス ポリシー と Azure ロールベースのアクセス制御 (Azure RBAC) 、2種類のアクセス制御を提供しています。
基本的には、RBAC の方が後から利用可能になった制御方法で、より望ましい、という位置づけです。
2つの違いなどは こちら に概ね記載があります。
Key Vault 側では、連携に用いる サービスプリンシパル か マネージドID に対して、証明書が取得できるようアクセスを許可する必要があります。

さて実は、Key Vault 側のアクセス許可モデルがロールベースのアクセス制御の場合、 Application Gateway の設定をポータル経由ですることはできません。
また、Azure Front Door の場合には、そもそも利用できるかや設定方法についてのドキュメントが確認できませんでしたが、手元で検証した結果、うまく動作しています。

Key Vault のアクセス制御方式 Key Vault で 付与する権限 Azure Front Door Application Gateway
コンテナー アクセス ポリシー
で制御していた場合
[シークレットのアクセス許可]の下の [リスト] と [取得] 証明書の取得 サービスプリンシパル を作成するか、 [ID (プレビュー)]よりマネージドID を設定することで、Key Vault 内の証明書を利用可能。
設定手順はこちら
リスナーの設定画面より、Key Vault へアクセスするマネージドIDを指定して設定することで、Key Vault 内の証明書を利用可能。
設定手順はこちら
RBAC
で制御していた場合
Key Vault Secrets User サービスプリンシパル を作成するか、 [ID (プレビュー)]よりマネージドID を設定することで、Key Vault 内の証明書を利用可能。
ただし公開ドキュメントはない…
ARM テンプレート、Bicep、CLI、PowerShellなどで構成することで、Key Vault 内の証明書を利用可能。
PowerShell で構成する例はこちら

検証

いくつかのパターンで実際に設定してみました。

No. 連携する対象 連携に利用するID Key Vault のアクセス許可 証明書 備考
1 Application Gateway のみ - - 自己証明書 GA
2 Application Gateway と Key Vault ユーザー割り当てマネージド ID RBAC CA証明書(ワイルドカード) GA
3 Azure Front Door と Key Vault ユーザー割り当てマネージド ID RBAC CA証明書(ワイルドカード) プレビュー
4 Azure Front Door と Key Vault システム マネージド ID RBAC CA証明書(ワイルドカード) プレビュー
5 Azure Front Door と Key Vault サービスプリンシパル アクセスロール CA証明書(ワイルドカード) GA

なお、Azure Front Foor + Application Gateway + KeyVault という構成も、例えば No.2 と No.3 や、 No.2 と No.5 といった操作で、構成できます。

Application Gateway - 証明書の直接アップロード

こちらのチュートリアルの通りに行えば、自己証明書を用いて検証ができます。CA証明書を用意できない場合でも確認ができて楽です。
リスナーの設定から、[証明書のアップロード] を選択し、手元のPCから PFX形式の証明書をアップロードして利用できます。

https://learn.microsoft.com/ja-jp/azure/application-gateway/create-ssl-portal#basics-tab

image.png

Application Gateway - Key Vault 連携 ( ユーザー割り当てマネージドID / RBAC )

Application Gateway を Key Vault と連携させ、Key Vault 内の証明書を利用する場合です。
公開ドキュメントでの手順はこちらです。

https://learn.microsoft.com/ja-jp/azure/application-gateway/key-vault-certs#obtain-a-user-assigned-managed-identity

公開ドキュメントの内容に入る前に、まずはKey Vault を作成して証明書をアップロードする必要があります。
おススメは Acmebot です。

https://github.com/shibayan/keyvault-acmebot

こちらを利用することで、Key Vault の作成やTLS 証明書の発行を行ってくれます。素晴らしいです。
今回は ワイルドカード証明書( *.sample01.uuesama.com ) を作成してあります。
以降は公開ドキュメントに従いますが、 ユーザー割り当てマネージド ID の作成を行います。
名前を何でもいいのでつけて作成してあげるだけです。

image.png
image.png

作成した ユーザー割り当てマネージド ID を Key Vault へ委任します。
今回、Key Vault 側は、 RBAC で権限をコントロールします。必要な権限は、 Key Vault Secrets User 以上が必要です。
なお、KeyVaultの権限の詳細は こちら に説明があります。

証明書に関する権限なのに シークレット のロールを選ぶのは若干不思議な感じがするかもしれません。

Key Vault のアクセス制御(IAM)から、ロール割り当てを追加します。

image.png

image.png

これで、ユーザー割り当てマネージド ID が Key Vault 内の証明書を取得できるようになったはずです。
続いて、 Application Gateway の ID として、ユーザー割り当てマネージド ID を割り当てます。
公開ドキュメントには PowerShell の例が紹介してありますので、 こちら を利用します。

Powershell
# Get the Application Gateway we want to modify
$appgw = Get-AzApplicationGateway -Name MyApplicationGateway -ResourceGroupName MyResourceGroup
# Specify the resource id to the user assigned managed identity - This can be found by going to the properties of the managed identity
Set-AzApplicationGatewayIdentity -ApplicationGateway $appgw -UserAssignedIdentityId "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
# Get the secret ID from Key Vault
$secret = Get-AzKeyVaultSecret -VaultName "MyKeyVault" -Name "CertificateName"
$secretId = $secret.Id.Replace($secret.Version, "") # Remove the secret version so AppGW will use the latest version in future syncs
# Specify the secret ID from Key Vault 
Add-AzApplicationGatewaySslCertificate -KeyVaultSecretId $secretId -ApplicationGateway $appgw -Name $secret.Name
# Commit the changes to the Application Gateway
Set-AzApplicationGateway -ApplicationGateway $appgw

-UserAssignedIdentityId の "/subscriptions/..." という部分は、ユーザー割り当てマネージド ID の ID の値に置き換えます。
他、ApplicationGateway名や、ResourceGroup名、KeyVault名、CertificateName名等も置換して、 Azure Cloud Shell などで実行します。

image.png

うまく Application Gateway の ID として割り当てることができると、Key Vault の証明書を参照できるようになるはずです。
Application Gateway の リスナー設定を確認してみます。

image.png

これでApplication Gateway と Key Vault を連携できました。
念のため、適当に IIS を入れたバックエンドも用意して、確認してみました。
しっかり Key Vault から証明書を取得してくれています。

image.png

Azure Front Door - Key Vault 連携 ( ユーザー割り当てマネージドID / RBAC )

公開ドキュメントはこちらです。

https://learn.microsoft.com/ja-jp/azure/frontdoor/managed-identity

Azure Front Door 自体は、このあたりのチュートリアルで作成しておきます。
今回、ユーザー割り当てマネージド ID の作成や、 Key Vault へ委任は、Application Gateway の検証で済ませているので、そのまま流用しています。

Azure Front Door の ID として、ユーザー割り当てマネージド ID を割り当てます。
[ID(プレビュー)] から、[ユーザー割り当て済み] へ進み、[追加] を行い、[ユーザー割り当てマネージド ID]を選択して追加します。

image.png

これで、Azure Front Foor から Key Vault の証明書を利用できるようになりました。
[シークレット] の [証明書の追加] から、Key Vault 内の証明書を選択して、追加できます。
なお、証明書のバージョンも指定する必要があります。
ここで最新 (Latest) を選んでおけば、Key Vault の証明書が更新されると自動的に Azure Front Door の証明書も更新されます。

image.png

参照できるようになった証明書を用いて、カスタムドメインを構成してみます。
[ドメイン] から [追加] へ進み、設定したいカスタムドメインを入力します。

image.png

Key Vault に格納した証明書は、[ Bring Your Own Certificate (BYOC) ] を選ぶことで、[シークレット]のプルダウン部分で選択できます
入力したカスタムドメインに合致する証明書である必要があります。

image.png

その後、検証の状態や、エンドポイントの関連付け、CNAMEの設定等が済ませることでカスタムドメインとして利用することができました。

image.png

実際に組んだ構成は以下のようなもので、Azure Front Door + Application Gateway に加えて、App Service も同じでユーザー割り当てマネージドIDを使って KeyVault 連携しています。
バックエンドの AppService まで End to End で 暗号化できています。

image.png

image.png

Azure Front Door - Key Vault 連携 ( システム割り当てマネージドID / RBAC )

image.png

image.png

image.png

作成したシステム割り当てマネージド ID に対して、Key Vault でアクセス制御(IAM)から、ロール割り当てを追加します。
権限は、 Key Vault Secrets User 以上が必要です。

image.png

Key Vault 側でのアクセス許可が設定まで済むと、
Azure Front Door がマネージド ID を使って Key Vault の証明書を取得していることが確認できるようになりました。

image.png

Azure Front Door - Key Vault 連携 ( サービスプリンシパル / アクセス ポリシー )

https://learn.microsoft.com/ja-jp/azure/frontdoor/standard-premium/how-to-configure-https-custom-domain?tabs=powershell#register-azure-front-door

まずは、 Azure Front Door の サービスプリンシパル を登録します。
公開ドキュメントにも記載の通りですが、以下の注意事項があります。

image.png

続いて、 Key Vault のアクセスポリシーを構成します。
アクセス許可として、 [シークレットのアクセス許可] - [取得]、[証明書のアクセス許可] - [取得]  を許可します。
また、[プリンシパルの選択] で、205478c0-bd83-4e1b-a9d6-db63a3e1e1c8を検索し、[Microsoft.AzureFrontDoor-Cdn] を選択します。

image.png

image.png

これで、Azure Front Foor から Key Vault の証明書を利用できるようになりました。
アクセスロールは AAD アプリケーション となっています。

image.png

まとめ

Azure Front Door と Application Gateway を Key Vault へ連携させる方法や、利用可能な証明書など、いくつか確認してみました。
Azure Front Door と Application Gateway を組み合わせて構成する場合などには、
両方で使うことができる ユーザーマネージド ID を用いた連携が GA すれば、かなり楽になりそうです。

何か誤りなどお気づきの点があれば教えてくださいませ!
では!

参考リンク

https://github.com/shibayan/keyvault-acmebot

https://learn.microsoft.com/ja-jp/azure/application-gateway/key-vault-certs#key-vault-azure-role-based-access-control-permission-model

https://learn.microsoft.com/ja-jp/azure/frontdoor/standard-premium/how-to-configure-https-custom-domain?tabs=powershell

https://learn.microsoft.com/ja-jp/azure/frontdoor/managed-identity

https://learn.microsoft.com/ja-jp/azure/key-vault/general/rbac-guide?tabs=azure-cli#azure-built-in-roles-for-key-vault-data-plane-operations

Microsoft (有志)

Discussion