はじめに
どうも、ATLのヴィリアスです。
最近、Azure の App Service に WAF V1 (Application Gateway) を導入しました。
そこで色々と情報を収集したので、記事にしてまとめることにしました。
※免責事項(必ず、ご一読ください)
本記事の情報により生じた、いかなる損害や損失についても、当社は一切の責任を負いかねます。
また、誤情報が入り込んだり、情報が古くなったりすることもありますので、
必ずしも正確性を保証するものではありません。ご了承ください。
Azure WAF とは?
「SQLインジェクション や クロスサイトスクリプティング (XSS) などの
攻撃から Web アプリケーションを保護する Azure サービス」です。
WAF そのものが単体で存在しているわけではなく、
Azure Application Gateway や Azure Front Door などに含まれる
一つの機能として存在しています。
Application Gateway とは?
「 Web アプリケーションに対するトラフィックを管理できる
Web トラフィックロードバランサー」です。
以下の Learn を受けたり、記事を読んだりすればざっくりと理解できます。
補足: SKU
Application Gateway には SKU が4つ存在します。
SKU |
---|
Standard |
Standard V2 |
WAF |
WAF V2 |
以下のドキュメントに、 V1 (無印) と V2 の機能比較がされています。
WAF SKU と WAF V2 SKU については、
Standard SKU に WAF の機能が追加されたものと考えて大丈夫だと思います。
Application Gateway と Front Door の違いは?
先ほど、Azure WAF とは?にて
「Azure WAF は Application Gateway や Front Door の機能の一部として存在している。」と書きました。
それでは、2つのサービスの違いは何でしょうか?
Microsoft の FAQ から引用します。
主な違いは、 Front Door が非リージョンサービスであるのに対し、
Application Gateway はリージョンサービスであるということです。
つまり、異なるリージョン間のリソースを
一元的に負荷分散したり、 WAF を導入したりしたい場合は Front Door を利用します。
そうでなければ、 Application Gateway でも問題ないということです。
また、課金方式もそれぞれ異なります。
ですが、互いに非常に似ているサービスのようです。
Azure WAF と Azure Firewall の違いは?
Azure WAF に似ている Azure サービスとして、「Azure Firewall」があります。
この2つのサービスの違いは、OSI参照モデルにおける保護する層が異なることです。
サービス | 保護する層 |
---|---|
Azure WAF | アプリケーション層 |
Azure Firewall | ネットワーク層、トランスポート層 |
Azure Firewall については、以下の記事が参考になります。
とりあえずチュートリアルがやりたい!
「仮想マシンに WAF 経由でアクセスできるようにする」というシナリオで
チュートリアルを受けられます。
502 エラーが出るんだけど…
App Service に対して WAF を実装しようとすると 502 エラーが出ることがあります。
その場合は「正常性プローブ」と「バックエンド設定」を正しく設定すると治るかもしれません。
「とりあえず 502 エラーを解決したい!」という場合のために、設定の一例を載せておきます。
正常性プローブ
バックエンド設定
バックエンド設定では、[ホスト名] の設定が 502 エラーに影響する可能性があります。
[新しいホスト名でオーバーライドする] は、 "はい" を選択します。
また、 [ホスト名] に正しいホスト名が入力されていることを確認します。
例えば、hogefuga.com
とかですね。
[カスタムプローブの使用] も "はい" を選択し、
先ほど作成したプローブを選択します。
この設定をすれば、 502 エラーが解消されていると思います。
もし解消されていなければ、
IP アドレスによる通信拒否などがされていないかも確認してください。
証明書はどうやって設定するの?
Application Gateway には「リスナー」と「バックエンド設定」の2つに証明書を配置できます。
証明書の配置としてはこんなイメージ。
リスナーとバックエンド設定に、証明書を配置する・しないは自由です。
ただ、リスナーで証明書を配置しなければ、バックエンド設定で証明書が配置されていても
クライアントからはHTTP通信をしているように見えます。
逆に、リスナーで証明書を配置すれば、バックエンド設定で証明書が配置されていなくても
クライアントからはHTTPS通信をしているように見えます。
リスナーの証明書 | バックエンド設定の証明書 | クライアントから見える通信方式 |
---|---|---|
✕ | ✕ | HTTP |
✕ | ◯ | HTTP |
◯ | ✕ | HTTPS |
◯ | ◯ | HTTPS |
詳細については、以下のドキュメントに記載されています。
リスナー
[プロトコル] として "HTTPS" を選択すると、証明書を設定できます。
バックエンド設定
[バックエンド認証証明書] にて、証明書を設定できます。
バックエンドターゲットが App Service の場合、
App Service に配置されている証明書をそのまま使うこともできます。
App Service にアクセスする前に WAF を経由させたいんだけど…
Application Gateway と App Service の 2 つで設定をします。
Application Gateway
Application Gateway の DNS 名と
Webサイト (App Serviceなど) のカスタムドメイン名を CNAME で紐づけてください。
Application Gateway の DNS 名は、
[フロントエンドパブリック IP アドレス] で確認できます。
App Service
[ネットワーク] のアクセス制限から、 Application Gateway のみを許可するようにしてください。
こうすることで、 App Service への通信は Application Gateway のみ許可されます。
Application Gateway を経由せずに、
直接 App Service にアクセスしようとすると 403 エラーが発生します。
補足: 404 エラーが出るようになった…
以前、 CNAME で 紐づけをしたところ
WAF の先にある App Service にアクセスできなくなったことがありました。 (404 エラー)
この場合、Application Gateway の [リスナー] にて、証明書を設定し直してみてください。
Azure WAF で IP アドレス制限はできる?
WAF V2 の場合、WAF ポリシーを作成することで IP アドレス制限を付与できます。
WAF V1 の場合、 WAF ポリシーを作成できません。
代替案として、 Application Gateway が存在する
仮想ネットワークをネットワークセキュリティグループに所属させることで、IP アドレス制限を付与できます。
WAF を経由してもクライアント IP アドレスは取得できるの?
[X-Forwarded-For] ヘッダーで取得できます。
// HTTPリクエストヘッダーの"X-Forwarded-For"を参照すると、カンマ区切りでIPアドレスが取得できる
// [構文] X-Forwarded-For: <クライアントIP>, <プロキシーサーバーIP1>, <プロキシーサーバーIP2>
var ipAddress = Request.Headers["X-Forwarded-For"].ToString().Split(",")[0];
どうやって WAF の動作確認をするの?
Web アプリの URL にXSSテスト用パラメーターを付与したものをブラウザへ入力し、アクセスします。
例えばこんな URL
https://hogefuga.com?<script>alert(1);</script>
URL にスクリプトが含まれている場合、 WAF によってアクセスが拒否されます。
このように403 エラーが発生したら、WAFは正常に動作しています。
おわりに
なぐり書きレベルで調べたことをつらつらと書き連ねましたが、
この情報がどなたかの参考になれば嬉しいです。
なにかあれば随時、情報を追記したり修正したりしようと思います。