はじめに
Fastly の NGWAF はクラウドやオンプレを問わず様々な環境に導入することが可能ですが、もちろん Fastly の CDN 上で動作させる事も出来ます。
通常 WAF を適用する場合はすべてのリクエストに対して処理が行われますが、Fastly の CDN 上に実装(Edge Deploy)した場合、VCL を利用する事で NGWAF を適用する対象を自由に選択することが出来ます。
この記事では設定手順について説明します。
NGWAF の処理対象外とする方法
Fastly の NGWAF が有効化されているサービス(配信設定)では、 vcl_miss と vcl_pass、つまりオリジンにコンテンツを取得しに行く際に NGWAF の処理を実行する call edge_security
が実行されます。
この関数が call される前に、x-sigsci-no-inspection
というヘッダーをリクエストに付与しておくことで、NGWAF の処理の対象外となります。ヘッダーの値はなんでも構いません。
※ セキュリティー上の観点から NGWAF の処理対象外になるのは VCL 内部でこのヘッダーを付与した場合に限ります。ブラウザなどからこのヘッダーを付与してリクエストを送っても NGWAF の処理対象外にはなりません。
設定手順
それでは具体的な設定手順を説明します。
x-sigsci-no-inspection
は vcl_miss と vcl_pass で call edge_security;
される直前に付与されるのが望ましいです。
設定の追加には Snippet を利用します。条件を変更する際に一箇所の変更で済むように2つのサブルーチンでそれぞれ設定するよりも vcl_init 内に共通のファンクションを作成し、2つのサブルーチンからそれぞれ呼び出す形で設定をします。
つまり以下のように合計3つの Snippet を追加することになります。
vcl_init
NGWAF の処理対象外を設定する条件
sub waf_bypass_check {
# Bypass Edge WAF for specified conditions
if (req.url.ext ~ "(?i)^(gif|png|jpe?g|webp)$" ) {
set bereq.http.x-sigsci-no-inspection = "bypasswaf_extension";
}else if (req.url ~ "^/no_ngwaf") {
set bereq.http.x-sigsci-no-inspection = "bypasswaf_path";
}
}
vcl_miss
上記ファンクションの呼び出し
call waf_bypass_check;
vcl_pass
上記ファンクションの呼び出し
call waf_bypass_check;
x-sigsci-no-inspection
に設定する値はなんでも構いませんが、後々にどういう条件で NGWAF がバイパスされたのかを判断できるような内容を入れておくと便利だと思います。
上記のコードの例だと 拡張子がマッチしたものは bypasswaf_extension, パスがマッチしたものは bypasswaf_path としています。
この値を Fastly から送信されるログに含めることも可能です。
あとはこのバイパスの条件を要件にあうように自由にカスタマイズして下さい。
設定を行うサンプルを Fastly Fiddle で作成しましたのでこちらを Clone して挙動をテストすることも出来ます。
https://fiddle.fastly.dev/fiddle/552ea0a0
※ あくまで上記ヘッダを付与するコードサンプルでこの Fiddle では NGWAF は動作していません。
また、Fiddle でテスト後に実際のサービスに適用した際は、生成された vcl から処理が正しく call edge_security;
の前に設定されていることの確認をするようにしましょう。
まとめ
Fastly の NGWAF の Edge Deploy では VCL を利用して NGWAF の適用範囲を自由に制御することが出来ます。適切な設定を適用してアプリケーションを攻撃から防御しましょう。