Azure Front Door と Application Gateway を Key Vault と連携させる方法 と TLS/SSL 証明書 の整理

# はじめに
Azure Front Door や Application Gateway v2 は、Key Vault との統合をサポートしています。
Key Vault を利用することで、サーバー証明書の更新等が楽になりますし、セキュリティの観点からも望ましいかと思います。
また、Azure Front Door で独自の証明書を利用する場合には、[連携が必須](https://learn.microsoft.com/ja-jp/azure/frontdoor/domain#import-a-certificate-to-azure-key-vault )ですので、 Key Vault との連携方法や、利用可能な証明書などを整理しておきます。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/0cdb961a-0b7e-ea81-8f09-ce46e9b57121.png)


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

| 利用できる証明書 | Azure Front Door | Application Gateway |
|:-:|:-:|:-:|
| マネージド証明書 |  [利用できる](https://learn.microsoft.com/ja-jp/azure/frontdoor/domain?pivot=front-door-standard-premium#certificate-requirements ) |  - |
| CA (証明機関) 証明書 |  [利用できる](https://learn.microsoft.com/ja-jp/azure/frontdoor/domain?pivot=front-door-standard-premium#certificate-requirements ) |  [利用できる](https://learn.microsoft.com/ja-jp/azure/application-gateway/ssl-overview#certificates-supported-for-tls-termination ) |
| EV (拡張された検証) 証明書 | -  |  [利用できる](https://learn.microsoft.com/ja-jp/azure/application-gateway/ssl-overview#certificates-supported-for-tls-termination ) |
| ワイルドカード証明書  | [利用できる](https://learn.microsoft.com/ja-jp/azure/frontdoor/front-door-wildcard-domain?pivots=front-door-standard-premium#add-a-wildcard-domain-and-certificate-binding )  |  [利用できる](https://learn.microsoft.com/ja-jp/azure/application-gateway/ssl-overview#certificates-supported-for-tls-termination ) |
| 自己署名証明書  | -  |  [利用できる](https://learn.microsoft.com/ja-jp/azure/application-gateway/create-ssl-portal ) |
| 証明書を持ち込む方法 | PFX ファイル を Key Vault にアップロード | PFX ファイル を Key Vault にアップロード <br>　PFX ファイル を 直接 Application Gateway にアップロード |


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

Application Gateway には、自己署名の証明書（オレオレ証明書）も持ち込めるなど、Azure Front Door といくつか差があります。
なお、Application Gateway は、[証明書を直接アップロードする](https://learn.microsoft.com/ja-jp/azure/application-gateway/renew-certificates#certificates-on-an-application-gateway )ことができますが、セキュリティ観点からは、Key Vault 連携の方がよいですね。

- [AzureFrontDoorの証明書要件](https://learn.microsoft.com/ja-jp/azure/frontdoor/domain?pivot=front-door-standard-premium#certificate-requirements )
- [Application Gateway の証明書要件](https://learn.microsoft.com/ja-jp/azure/application-gateway/key-vault-certs#supported-certificates )


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

| ID | Azure Front Door | Application Gateway |
|:-:|:-:|:-:|
| サービスプリンシパル  | [利用できる](https://learn.microsoft.com/ja-jp/azure/frontdoor/standard-premium/how-to-configure-https-custom-domain?tabs=powershell#register-azure-front-door ) | -  |
| システム マネージド ID  | [利用できる(プレビュー)](https://learn.microsoft.com/ja-jp/azure/frontdoor/managed-identity "Azure Front Door Standard/Premium とともにマネージド ID を使用する (プレビュー)")  |  - |
| ユーザー割り当てマネージド ID  |  [利用できる(プレビュー)](https://learn.microsoft.com/ja-jp/azure/frontdoor/managed-identity "Azure Front Door Standard/Premium とともにマネージド ID を使用する (プレビュー)")  |  [利用可能](https://learn.microsoft.com/ja-jp/azure/application-gateway/key-vault-certs#obtain-a-user-assigned-managed-identity ) |


マネージド ID を使用して他のサービスにアクセスできる Azure サービスの一覧は [こちらの公開ドキュメント](https://learn.microsoft.com/ja-jp/azure/active-directory/managed-identities-azure-resources/managed-identities-status ) にまとまっていますが、 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 全体管理者権限が求められ、テナントレベルで１回限りのコマンド実行があるなど、検証するにも少しハードルがある感じもありますので、個人的にはマネージド ID 利用が早く GA になってほしい感じです。

# Key Vault 側アクセス制御（アクセス ポリシー / Azure RBAC）と 設定方法の違いなど
 [Key Vault 連携に利用できる ID](#key-vault-連携に利用できる-id) は、いわゆる認証の部分（どういったIDを利用できるか）ですが、認可の部分（その ID が Key Vault に対して何ができるか）についても確認しておきます。

Key Vault は、コンテナー アクセス ポリシー と Azure ロールベースのアクセス制御 (Azure RBAC)  、2種類のアクセス制御を提供しています。
基本的には、RBAC の方が後から利用可能になった制御方法で、より望ましい、という位置づけです。
２つの違いなどは [こちら](https://learn.microsoft.com/ja-jp/azure/key-vault/general/rbac-migration#access-policy-templates-to-azure-roles-mapping) に概ね記載があります。
Key Vault 側では、連携に用いる サービスプリンシパル か マネージドID に対して、証明書が取得できるようアクセスを許可する必要があります。

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

| Key Vault のアクセス制御方式 | Key Vault で 付与する権限 | Azure Front Door | Application Gateway |
|:-:|:-:|:-:|:-:|
| コンテナー アクセス ポリシー<br>で制御していた場合  | [シークレットのアクセス許可]の下の [リスト] と [取得]　証明書の取得   | サービスプリンシパル を作成するか、 [ID (プレビュー)]よりマネージドID を設定することで、Key Vault 内の証明書を利用可能。<br>[設定手順はこちら](https://learn.microsoft.com/ja-jp/azure/frontdoor/managed-identity#configure-key-vault-access-policy )  | リスナーの設定画面より、Key Vault へアクセスするマネージドIDを指定して設定することで、Key Vault 内の証明書を利用可能。<br>[設定手順はこちら]( https://learn.microsoft.com/ja-jp/azure/application-gateway/key-vault-certs#key-vault-permission-vault-access-policy-model) |
| RBAC<br>で制御していた場合  | Key Vault Secrets User |  サービスプリンシパル を作成するか、 [ID (プレビュー)]よりマネージドID を設定することで、Key Vault 内の証明書を利用可能。<br>ただし公開ドキュメントはない…  | ARM テンプレート、Bicep、CLI、PowerShellなどで構成することで、Key Vault 内の証明書を利用可能。<br>[PowerShell で構成する例はこちら](https://learn.microsoft.com/ja-jp/azure/application-gateway/key-vault-certs#key-vault-azure-role-based-access-control-permission-model) |


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

| 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/4c098183-148e-e46f-791e-e747a78868b7.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/405689ff-2398-2f3f-ed98-f43d3f3a148c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/d48eb384-7601-37c5-1c08-9df5f3959d28.png)

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

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

:::note info
アプリケーションには秘密キーを持つ証明書のシークレット部分が必要であるため、Key Vault Certificate User はありません。
アプリケーションが証明書を取得するには、Key Vault Secrets User ロールを使用する必要があります。
:::

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/abac57b3-73b8-6a19-d321-9b7b7de79fcd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/abdcb5d7-a86a-6e16-068a-48811d199124.png)

これで、ユーザー割り当てマネージド ID が Key Vault 内の証明書を取得できるようになったはずです。
続いて、 Application Gateway の ID として、ユーザー割り当てマネージド ID を割り当てます。
公開ドキュメントには PowerShell の例が紹介してありますので、 [こちら](https://learn.microsoft.com/ja-jp/azure/application-gateway/key-vault-certs#key-vault-azure-role-based-access-control-permission-model ) を利用します。

``` 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/36f62ac2-eef2-e21f-20d3-db117db5543e.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/e082211c-5ddd-3c25-d962-97e564cd1198.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/ccc8005a-863b-9707-5adb-af0a83477264.png)


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

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

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

Azure Front Door 自体は、[このあたりのチュートリアル](https://learn.microsoft.com/ja-jp/azure/frontdoor/create-front-door-portal#create-front-door-profile---quick-create )で作成しておきます。
今回、ユーザー割り当てマネージド ID の作成や、 Key Vault へ委任は、Application Gateway の検証で済ませているので、そのまま流用しています。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/d49dbfc3-647d-4a06-7be7-9919b3725248.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/cc628663-87b2-9ad0-3ee5-844c8845983b.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/7e38cac2-0a57-9de1-b7ff-056b9ed27125.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/b73e7a5c-0bd4-4e9f-ae98-1f8a476ac964.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/5bb1cd3d-0157-6e1b-280b-ce87a4ad9224.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/0cdb961a-0b7e-ea81-8f09-ce46e9b57121.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/a9a6f423-1435-9506-a132-6a598f88a38d.png)


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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/be3a0951-52a9-fe60-5d74-5a602c59bc0d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/d846b1bc-1a7b-9f3b-ba04-c3bd73437fe0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/1e018264-39fc-43c7-7910-5e25f9176528.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/c821b4f3-452b-f390-821d-5c506e4a42c6.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/0bdcaa3b-a248-1b89-9037-3788ac1171c9.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 の サービスプリンシパル を登録します。
公開ドキュメントにも記載の通りですが、以下の注意事項があります。

:::note warn
注意
- このアクションには、Azure AD で "全体管理者" のアクセス許可が必要です。登録は、Azure AD テナントごとに 1 回だけ実行する必要があります。
- 205478c0-bd83-4e1b-a9d6-db63a3e1e1e1c8 のアプリケーション ID は、すべての Azure テナントとサブスクリプションに渡って、Front Door の Standard および Premium レベルで Azure によって事前に定義されています。 Azure Front Door (クラシック) のアプリケーション ID は異なります。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/873a7d6a-5cd4-0eff-7283-d284ea3051f9.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/8b5e6cf4-18ea-4d60-d272-6bbaa9970998.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/7de237b4-3901-57c0-7dd6-558858d03869.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/379afe8c-df09-9ed4-e5bd-29244f915cbd.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