2024-04-05
自社のコーポレートドメインを Cloudflare の DNS 経由に変更しました。
それに伴い、自社のウェブサイトも Cloudflare でプロキシさせて配信することにしました。
自社のウェブサイトは Azure App Service にてホストしていますが、 Cloudflare 経由に切り替えた際にうまく切り替えができなかったので、その際の内容と注意点を公開します。
Azure App Service のサイトを Cloudflare 経由でホストする際の注意点の前に、まずはCloudflareとは何か、そしてなぜこれが重要なのかを理解することが必要です。
Cloudflareは、サイトのセキュリティ強化、高速化、および信頼性向上を目的としたグローバルなCDN(コンテンツデリバリーネットワーク)サービス提供者です。Webトラフィックを最適化し、DDoS攻撃やデータ盗難といった脅威から保護する機能を備えています。
また、Cloudflareは、DNSサービスを通じてウェブサイトの可用性を高めるとともに、ユーザーに近いサーバーからコンテンツを提供することで、サイトのロード時間を短縮します。このような特長を持つCloudflareを経由してAzure App Serviceでホストされるサイトを運用することは、パフォーマンスとセキュリティの両方の観点で大きなメリットがあります。
しかし、Azure App ServiceのサイトをCloudflare経由でホストする際、いくつかの注意点があるため解説します。
細かい部分は公式サイトの利用開始ガイドに書いてあるため、ここでは詳しくは触れません。
今回は Cloudflare に対して自社ドメインでホストしているサイトを登録し、 Cloudflare DNS 経由で自社サイトをホストすることにしました。
万が一 Cloudflare がダウンした場合はサイトに接続不可となりますが、それは Azure であっても同様なので今回はあまり気にしないことにします。
Cloudflare でサイトを登録し、 DNS 関連の設定を行うと Cloudflare 経由で App Service でホストしているサイトにアクセス可能になります。
Cloudflare がプロキシする(Cloudflare経由でアクセス)状態になると、下記のような表示になります。
DNSの情報が伝播するまで少し待ち、しばらくしてサイトにアクセスしてみます。
が、リダイレクトループ (ERR_TOO_MANY_REDIRECTS) が発生してうまくアクセスできません。
App Service はデフォルトで HTTP アクセスを HTTPS にリダイレクトする設定になっています。
App Sercice -> 対象のアプリ -> 左のブレード -> 構成 -> 全般設定 -> HTTPS のみ
また、Cloudflare の SSL/TLS 設定ではデフォルトで下記のように “フレキシブル” の設定になっています。
Cloudflare ダッシュボード -> 左のブレード -> SSL/TLS -> 概要
この設定ではイメージ図にもあるように、SSLのオフロードが Cloudflare で行われ、 Cloudflare からオリジン (今回は App Service) までの間は HTTP で行われます。
しかし、前述の App Service の “HTTPSのみ” 設定によって HTTP アクセスは HTTPS へとリダイレクトされるため、 HTTPS でアクセス -> Cloudflare でオフロード -> App Service へは HTTP でアクセス…
となり無限ループになっていたものと思います。
上記の事象に対して採れる案は
1. App Service の “HTTPS のみ” を解除して HTTP でのアクセスも許可する
2. Cloudflare 側でエンドツーエンドの暗号化 (つまりオリジンサーバーへのアクセスまで全てHTTPS通信) を有効化する
の2つの方法があると思いますが、 1 については App Service 自体のデフォルトドメイン (azurewebsites.net) は非公開にできないため、 HTTP アクセスを開放するのは避けたいところです。
そこで、 Cloudflare 側の SSL/TLS 設定を変更しオリジンまで HTTPS にすることで対応します。
先ほどの Cloudflare での SSL/TLS 設定で “フル(厳密)” を選択することで、 App Service で規定で付与されるマネージド証明書によって Cloudflare からオリジン間のアクセスも HTTPS として通信することができ、問題なくサイトを表示することができました。
(”フル” というのもありますが、これはどういうケースで使うのでしょうか。とりあえずオレオレ証明書みたいなのを入れたサーバー向けとかですかね。)
App Service にてカスタムドメインを設定し、そのドメインの SSL 証明書を無料の App Service マネージド証明書で運用している場合、 Cloudflare にプロキシさせると DNS の A レコードの IP アドレスが Cloudflare のものになってしまいます。
その結果、Azure 側での App Service マネージド証明書の自動更新時に DNS による所有権確認が失敗し、証明書が自動更新されないことが分かりました。
Cloudflare の URL 書き換えルールなどで既定ドメイン (azurewebsites.net) に書き換えるような設定にすれば App Service 側のカスタムドメインが不要になり問題なくなるのかもしれませんが、そこまでの検証ができていません。
以上のことから、Cloudflare + App Service でカスタムドメインを使用する際には App Service マネージド証明書の自動更新を諦めるか、 Cloudflare で無料で提供されるオリジンサーバー向けのオリジン証明書を App Service 証明書として設定する必要があります。
以下、引用
・Web アプリの IP アドレスを指す A レコードが必要です。
Azure App Service で TLS/SSL 証明書を追加および管理する – 無料のマネージド証明書を作成する
・パブリックにアクセスできないアプリではサポートされません。
・Traffic Manager と統合されたルート ドメインではサポートされません。
・証明書の発行と更新が正常に行われるには、上記のすべてが満たされている必要があります。
弊社の運用としては App Service マネージド証明書を諦め、 Cloudflare から提供される証明書を有効期限最長(15年)にして App Service に適用し、ひとまず様子を見ることにしました。
弊社ではAzure構築・アドバイザリーサービスを提供しております。
マイクロソフト出身、 Azure 認定資格を保持するエンジニアが Azure に関するアドバイスや、環境構築などのご支援をいたします。
また、マイクロソフトのAzureサポートとのやり取りも弊社にお任せいただけます。
サポート担当とのやり取りは、慣れていない場合適切な情報を引き出すことができず、連絡の往復が続き問題解決までに時間がかかることが多いです。
弊社のアドバイザリーサービスでは、弊社で回答できる部分は迅速に回答し、Azure内部の調査が必要な場合などはAzureサポートと連携して問題解決にあたることができます。
Azure をより活用し、最適な構成を構築するご支援をいたしますので、ご検討の方はお気軽にお問い合わせください。