【Azure】Front Doorで「配信元(origin)」に送るHostヘッダを変更するには:Tech TIPS
Azureのリバースプロキシ/CDNなどのサービスである「Azure Front Door」で、配信元のサーバ/サイトからクライアントへコンテンツが正しく送られない場合がある。その原因の1つである、配信元へ送出される「Host」ヘッダの設定方法や設定上の注意点などを説明する。
対象:Azure Front Door Standard/Premium
Azure Front Door経由だとWebページの表示がおかしくなる!?
リバースプロキシやCDN(コンテンツ配信ネットワーク)、WAF(Webアプリケーションファイアウォール)などが利用できるAzureのサービス「Azure Front Door」で、そのプロファイルに配信元(Origin)のサーバ/サイトを割り当てたとき、以下のようなトラブルが生じることがある。
- 意図していない別のサーバからの応答が返る
- SSLサーバ証明書のエラーが生じる
- 一見正しい応答が返るものの、意図していないホスト名が画像ファイルなどのURLに記載されてしまう
こうしたトラブルの原因の1つとして、Azure Front Doorから配信元に送られるHTTPリクエスト内の「Host」ヘッダが適切でない可能性が考えられる。本Tech TIPSでは、この「Host」ヘッダを変更する方法について説明する。
対象はAzure Front Door Standard/Premiumとし、以前のAzure Front doorクラシックは扱わない。また、Azure CLIやBicepによる設定は、原稿執筆時点ではプレビュー中で、正式版ではないことをご了承いただきたい。
「配信元(origin)」に送るHostヘッダの内容がトラブルを招く!?
Azure Front DoorがクライアントからのHTTPリクエストを受信後、配信元(origin)に中継するHTTPリクエストには、宛先のホスト名を表す「Host」ヘッダ(ホストヘッダ)が含まれる。このHostヘッダに含まれるホスト名は、Azure Front Doorの配信元の設定で変更できる。
そのため、クライアントからリクエストされたホスト名の場合もあれば、配信元のホスト名の場合もあるし、あるいは全く別のホスト名も指定できる(希望通りの動作をするかどうかは別として)。
以下の画面は、配信元としてAzure App Service(Web App)のWebサーバを設定したAzure Front DoorのエンドポイントをWebブラウザでアクセスしたところだ。ここでは、クライアントからのアクセス先ホスト名(=Azure Front Doorエンドポイントに設定されたカスタムドメイン)ではなく、配信元(=Azure App Service)のオリジナルのホスト名が送信されている。
このHostヘッダに設定すべきホスト名は、配信元のサーバやサイトなどによって全く異なる。例えば配信元の実体がバーチャルドメイン方式のレンタルサーバの場合、配信元サーバのホスト名を正しく指定しないと別のバーチャルホストが応答したり、共通名(Common Name)の不一致によるSSLサーバ証明書のエラーが生じたりする恐れがある。
逆に配信元のオリジナルのホスト名を設定すると、例えば上記の画面にあるサーバ変数「HTTP_HOST」を元に生成される各種URLが、本来のAzure Front Doorエンドポイントではなく、配信元サーバを指すようになる。結果としてコンテンツが表示されなくなったり、隠しておきたい内部ホスト名が漏えいしたりする。
そのため、措定すべきホスト名は十分に考慮する必要がある。その上で、以下の手順でホスト名を変更していただきたい。
【Azureポータル】配信元(origin)に送るHostヘッダの内容を変更する
AzureポータルでFront Doorから配信元へ送るHostヘッダの内容を変更する手順は以下の通りだ。クライアントからリクエストされるホスト名を設定したい場合は、設定欄の[配信元のホストヘッダー]を空欄にすること。
■操作手順
- Azureポータルから対象のFront Doorプロファイル(CDNプロファイル)のページを開く
- 左ペインのメニューで[配信元グループ]を選ぶ
- 右ペインに表示された配信元グループ(Origin Group)一覧表で対象の配信元グループの名前をクリックして、[配信元グループの更新]ブレードを開く
- [配信元グループの更新]ブレードの「配信元」欄で配信元(Origin)の名前をクリックして、[配信元の更新]ブレードを開く
- [配信元のホストヘッダー]欄にホスト名を記入する。クライアントからリクエストされるホスト名にしたい場合は、空欄にする
- [適用]ボタンや[更新]ボタンをクリックしていって各ブレードを閉じる
【Azure CLI】配信元(origin)に送るHostヘッダの内容を変更する
Azure CLI(azコマンド)でFront Doorから配信元へ送るHostヘッダの内容を変更するには、「az afd origin update」コマンドの「--origin-host-header」オプションを用いる。
az afd origin update -g <リソースグループ名> --profile-name <Front Doorプロファイル名> --origin-group-name <配信元グループ名> --origin-name <配信元の名前> --origin-host-header <配信元へ送るホスト名>
ただし、筆者が確認した限りでは、<配信元へ送るホスト名>を空にしてクライアントからリクエストされるホスト名に合わせることはできないようだ(以前のFront Doorクラシックでは改善されたのだが)。代わりに前述のAzureポータルか、この後に説明するBicepでのデプロイで実現する必要がある。
変更後のホスト名を確認するには「az afd origin show」コマンドを使う。
az afd origin show -g <リソースグループ名> --profile-name <Front Doorプロファイル名> --origin-group-name <配信元グループ名> --origin-name <配信元の名前>
「az afd origin」コマンドの詳細については、Microsoft Learnの「az afd origin」を参照していただきたい。
【Bicep】デプロイ時に配信元(origin)に送るHostヘッダの内容を変更する
Bicepによるデプロイ時にAzure Front Doorから配信元に送るHostヘッダの内容を設定するには、配信元(Microsoft.Cdn/profiles/originGroups/origins)のリソースを記述する際、「properties」の「originHostHeader」にホスト名を指定すればよい。
resource frontDoorOrigin01 'Microsoft.Cdn/profiles/originGroups/origins@2022-11-01-preview' = {
name: 'origin01-${appName}'
parent: frontDoorOriginGroup
properties: {
hostName: '${appName}.azurewebsites.net'
httpPort: 80
httpsPort: 443
// 配信元へ送るHostヘッダの内容を記述
// クライアントからリクエストされたホスト名を引き継ぐなら、「originHostHeader」は指定しないでおく
originHostHeader: '<配信元へ送るホスト名>'
priority: 1
weight: 1000
enabledState: 'Enabled'
enforceCertificateNameCheck: true
}
}
変数「appName」などは適宜設定していただきたい。
このとき、クライアントからリクエストされたホスト名を引き継ぎたい場合は、「originHostHeader」を指定しない(記述しない)でおくこと。筆者が確認した限りでは、このプロパティの値として空欄、あるいは空文字列を指定することはできなかった。
配信元の他のプロパティなどについては、Microsoft Learnの「Microsoft.Cdn profiles/originGroups/origins 2022-05-01-preview」を参照していただきたい。
■執筆時の各種ツール/APIのバージョン
- Azure CLI: Ver.2.45.0
- Bicep CLI: Ver.0.14.85
- Bicepでのデプロイ時のAPIバージョン: 2022-11-01-preview
■関連リンク
- リバース プロキシとそのバックエンド Web アプリケーションの間で、元の HTTP ホスト名を維持する(Microsoft Learn)
- Azure Front Door の配信元と配信元グループ(Microsoft Learn)
- az afdコマンドのレファレンス(Microsoft Learn)
- Bicep/ARMテンプレート/TerraformによるAzure Front Doorプロファイルのデプロイのレファレンス(Microsoft Learn)
Copyright© Digital Advantage Corp. All Rights Reserved.