App Service証明書を利用してApplication GatewayのHTTPSリスナーを構成する
モチベ
-
この前の記事でApplication GatewayにHTTPSリスナーを設けてWebサイトをHTTPSで公開するという検証をした
- ただ、自己署名証明書を利用しておりあくまで検証用という感じ
- AzureにはApp Service証明書というサービスがあり、証明書を発行できる
- 今回はこちらを利用して正式なHTTPS化対応をしていきたい
App Service 証明書の作成
-
Azure Portalにて「証明書」と検索
-
画面に従って作成
- 作成時に指定したドメインと、
www.<ドメイン名>
がその証明書で証明される
- 作成時に指定したドメインと、
-
作成後、リソースを開き「証明書の構成」の手順に従い利用準備をしていく
手順1:格納
- 証明書を格納するKey Vaultが必要になるため、新規作成するか既存のものを選択する。今回は画面に従って新規作成する
- 手順1が完了したことを確認し、手順2へ
手順2:ドメインの検証
- App Service証明書を作成する際に入力したドメインをきちんと保有しているかの確認
- いくつか確認方法があるため環境に適した方法を選択
- 手元の環境ではApp ServiceドメインをAzureから購入しているため、「ドメインの検証」からそのまま検証できるはずだがAzure Portal側のエラーなのかうまくいかなかったため「手動で検証」を実施
- 特定のTXTレコードをApp Serviceドメインのルートドメインに登録する
- 登録し、数分待つと検証が完了する
- 手順2が完了したことを確認する
- 手順3のチェックボックスは、作成した証明書が利用されたタイミングで自動的にチェックされるため、証明書リソース上での操作は特に不要
Application Gatewayへの関連付け
上記で作成した証明書を関連付けていく
-
前回作成したApplication Gatewayリソースの「リスナー」から「Listener TLS certificates」を開く(これは最近Previewになった、複数の証明書管理のためのビュー)
-
「証明書を追加する」から「キーコンテナーから証明書を取得する」を選択し、先ほどのキーコンテナーを選択 -
ここで、マネージドIDに対する権限エラーが発生してしまうため、Key Vaultリソース上のIAM設定を変更しに行く
-
証明書の構成中に作成したKey Vaultのアクセス許可モデルが「コンテナーのアクセスポリシー」となっているため、RBACではなく「アクセスポリシー」で制御する
-
シークレットと証明書の取得権限をマネージドIDに付与
気を取り直して
下記サポートブログに記載の手順で、証明書をエクスポートせずApplication Gatewayで利用する
- Application Gateway用のマネージドIDを作成
- マネージドIDにKey Vaultのシークレットへのアクセスポリシーを設定
ここからはAzure Portalでできない操作が含まれるためAzure Cloud Shellで実行する
- 対象Application Gatewayの取得
PS > $appgwname = 'appgw-tls-apache'
PS > $rgname = '20230414-appgw-TLS'
PS > $appgw = Get-AzApplicationGateway -Name $appgwname -ResourceGroupName $rgname
- マネージドIDをApplication Gatewayへ割り当て
PS > $midname = 'mid-appgw-tls'
PS > $subscriptionId = '<place-holder>'
PS > Set-AzApplicationGatewayIdentity -ApplicationGateway $appgw -UserAssignedIdentityId "/subscriptions/${subscriptionId}/resourceGroups/${rgname}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/${midname}"
- Key Vault内のシークレットの取得
PS > $secret = Get-AzKeyVaultSecret -VaultName "kv-cert-msext
" -Name "<place-holder>"
- Application GatewayにKey Vaultに格納されたApp Service証明書を追加
PS > $secretId = $secret.Id.Replace($secret.Version, "")
PS >Add-AzApplicationGatewaySslCertificate -KeyVaultSecretId $secretId -ApplicationGateway $appgw -Name $secret.Name
- 今までの変更の適用
PS > Set-AzApplicationGateway -ApplicationGateway $appgw
Application Gateway側
-
確かに証明書が追加されている
-
以前のリスナーに関連付けている証明書を入れ替える
実際にApplication Gatewayのフロントエンドへアクセスして確認
- きちんと保護されている!(これが見たかった)
- Application GatewayのフロントIPのDNS構成をwww.<証明書のドメイン>に変更しておく
- そうしないと証明できない
エクスポートせずに利用することのメリット
- 証明書の更新が不要になる
pplication Gateway と App Service 証明書を直接紐づけることで、更新された App Service 証明書が Key Vault に格納されていた場合、Application Gateway に関連付けられている App Service 証明書も自動的に更新された証明書に置き換えられます。 これは Application Gateway が 4 時間ごとに Key Vault を参照し、Key Vault に格納された App Service 証明書の更新バージョンを取得するためです。
一方で Key Vault に格納された App Service 証明書をエクスポートした後に Application Gateway にインポートした場合には、Key Vault に格納された App Service 証明書が更新されたとしても、Application Gateway の App Service 証明書は自動で更新されません。 これは、Key Vault からエクスポートされた App Service 証明書は Key Vault に格納された App Service 証明書を直接参照しないためです。
おわり
- 設定周りが結構面倒だなと思いつつ、Azure上だけで証明書の管理・自動更新含めて完結するのは便利かも
- 証明書持ち込んでやったほうが、自動更新はできないけど直感的にできて楽かもなという印象
Discussion