Fastly NG-WAF のブロックの仕組みと閾値の変更手順

```
特に記載がない限り本記事の記載内容はデフォルト設定での挙動となります。
Fastlyの正式なサポート情報は https://docs.fastly.com/ を参照して下さい。
```

この記事では Fastly NG-WAF が攻撃を検知した場合のブロックの仕組みと、ブロックが開始されるための閾値とその変更手順について説明します。

なお、NG-WAF にはワークスペースごとに設定可能な以下の3つのモードがあります。

・Blocking
・Not blocking
・Off

実際にリクエストがブロックされるのは Blocking モードが設定されている場合のみになります。Not Blocking モードの場合はリクエストのデータは収集されますがリクエストはブロックされません。 Off の場合はリクエストの検査自体を行いません。


# Fastly NG-WAF のブロックの仕組み

Fastly NG-WAF では SQLi, XSS などといったような攻撃を検知すると、リクエストには (Attack) Signal が付与されます。

Attack Signal が付与された場合も原則としては即時にブロックは行いません。一定期間内に閾値を超える攻撃が確認された場合、その対象の IP を一定期間（デフォルトでは24時間)ブロック対象とします。

これは攻撃者がサイトを本格攻撃する際に、通常はリサーチ目的で事前に複数のリクエストを送るためひとつのリクエストでいきなり攻撃が成功することは考えにくいこと。
また、即時ブロックをすることで誤検知により正規ユーザーがサービスを利用出来なくなることがないように、という思想に基づいた設計となっています。


この特定の IP がブロック対象となっている状態のことを Fastly NG-WAF では IP が flag されている、といいます。
Not Blocking モードでも IP は flag されますがリクエスト情報が記録されるだけで実際にブロックはされません。

~~なお、閾値は各 Attack シグナルの種類ごとにカウントされます。例えば特定の Attack シグナルの閾値が 5 だった場合に 6 種類の異なる Attack シグナルが検知されても各 Attack シグナルのカウント数が 1 になるだけで IP は flag されません。~~

2023年9月の修正でデフォルトの閾値によるブロックはすべての Attack シグナルを含むリクエストの合算に変更されました。

Attack シグナルの種類は以下のページに記載されています。
https://docs.fastly.com/signalsciences/faq/system-tags/#attacks

## flag されている IP のブロック対象について

特定の IP が flag されている場合の挙動ですが、この IP からの全てのリクエストがブロックされるわけではありません。

flag されている IP から送られてきたリクエストで、エージェントにより Attack シグナルが付与されたもののみがブロック対象となります。

また、ブロックは閾値を超え flag の原因となった Attack シグナルだけでなく、すべての Attack シグナルが対象となります。

現在のインターネット環境では特定の IP の後ろに複数のユーザーがいることは少なくないため、特定の攻撃者のために攻撃者と同じIPからアクセスをしてくる正規のユーザーまでがサービスを利用できなくなることを防ぐための設計となっています。

## ブロックの開始タイミング
閾値を超えた際に実際にブロックが開始されるまでには最大１分程度の時間差があります。これは IP の flag 判断が各エージェント（アプリケーション実行環境にインストールされる NG-WAF の検査プログラム）ではなく、Cloud Engine で行われているためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/aeb6b3af-451a-449f-b759-c182e19b0674.png)

エージェントは一つの環境だけでなく複数環境で動作することが可能です。Cloud Engine はすべてのエージェントと情報を約30秒ごとに同期し、収集したデータを合計して flag の判断を行い結果を各エージェントにフィードバックする仕組みになっています。

こうすることで複数のクラウド環境やオンプレミス環境にわたって動作しているアプリケーションに対しての分散した攻撃についても正確に検知が可能な仕組みになっています。


# ルールのチューニングについて
従来の WAF では攻撃を検知するために正規表現の一致で確認される多くのルールが存在しており、誤検知が発生すると個別のルールを無効化したり、ルールに除外設定を行うといったような運用が必要となっていました。

Fastly NG-WAF では個別のルールといったものがないため、ルールごとのチューニングは基本的には不要となっています。

そのため WAF 機能を導入する際に考慮が必要なのは各 Attack シグナルの閾値のみとなっております。

※ 従来型の WAF に比べると発生率は少ないですが、誤検知が発生する場合は設定した特定の条件で Attack シグナルを無効化することはあります。


# Attack シグナルの閾値

各 Attack シグナルに設定されている[デフォルトの閾値](https://docs.fastly.com/signalsciences/using-signal-sciences/features/site-alerts/#about-system-alerts) は1分間、10分間、60分間の 3 種類がありそれぞれ閾値は以下のようになっています。

| 計測時間 | 閾値 | チェック間隔 |
|:-:|:-:|:-:|
１分間 | 50回 | 20秒ごとに確認
10分間 | 350回 | 3分ごとに確認
60分間 | 1800回 | 20分ごとに確認


# 閾値の変更手順

デフォルトの閾値を変更したい場合は、NGWAF コンソールにログインして右上の Manage から `Site Setting` を選択して下さい。　

*2023年12月時点では本機能は限定的に提供されています。このリンクが表示されない場合はサポートまでご連絡下さい。*

左側のメニューから Attack Thresholds を選択すると以下のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/c2b8bfc5-738b-a9bd-097e-f7f5549e3139.png)

ご希望の閾値を入力して Update をクリックすると設定は完了です。

上述の通りここで設定する閾値は Attack シグナルの合計値に対する閾値です。以下の手順で個別のシグナルに対しても閾値を設定することができます。

# 個別のシグナルに対する閾値の設定
### Professional, Premier パッケージをご利用の場合

1. NG-WAF のコンソールにログインし対象の Site を選択
2. 右上の **Rules** から **Site Alerts** を選択
3. **Add site alert** ボタンをクリック。以下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/67fe9f15-2b5a-bb09-da61-a535920818fd.png)

3. **Long name** フィールドに適当な名前を入力(例: Override XSS default)
3. **Signal** メニューから上書き対象の Signal を選択
3. **Threshold** フィールドに閾値と、Interval で上書きしたい計測期間を選択
閾値は 1 - 10,000 まで設定可能です。
3. **When an IP hits the threshold** で閾値を超えた場合の挙動を指定します。
 今回はデフォルトの閾値を上書きするので `Flag IP and block...` を選択
なお、Anomaly シグナルを選択している場合は Flag IP and log のみ選択可能です。
3. 閾値を超え flag された IP が flag 状態を維持する時間を **Take action for** で指定 
3. 閾値を超えた場合に設定した Slack やメールアドレスに通知を送りたい場合は **Notifications** をチェック
3. **Status** を Enabled に設定
3. **Save** alert をクリック

以上で指定した Attack シグナルへの閾値の上書きは完了です。他の Attack Signal の閾値も上書きしたい場合はこの作業を各 Attack Signal に繰り返して下さい。

英文となりますがオフィシャルのドキュメントによる手順は[こちら](https://docs.fastly.com/signalsciences/using-signal-sciences/features/site-alerts/#adding-a-site-alert)から確認可能です。

### Essential パッケージをご利用の場合

Essential パッケージでサービスをご利用の場合は以下の手順で個別のシグナルに対して閾値を変更することが出来ます。

1. NG-WAF のコンソールにログインし対象の Site を選択
1. 画面上部のタブからの **Signals** をクリック
1. 対象の **Tag(Signal)** の View をクリック。Signal の Activity が表示されます。
※　左側の Type から Attack を選択すると Attack シグナルのみが表示されます。
1. 画面右上の **Configuration** をクリック。Configuration が表示されます。
1. **Alerts** を選択
1. **Add Alert** ボタンをクリック。
1. Alerts/Add 画面が表示されるので閾値が設定可能です。
設定内容は Professional/Premier パッケージと同じなので上述の Professional/Peremier の設定手順を参照して下さい。

閾値を変更したいそれぞれのシグナルに対して同様の手順で設定を行なって下さい。


# まとめ

以上で Fastly NG-WAF の閾値の上書き設定は完了です。flag された（閾値を超えた）リクエストはダッシュボードの Events から時系列で情報を確認することが出来ます。

しばらく運用を続けてみて設定した閾値で問題がないかを確認し、必要に応じてデフォルトの閾値や、各 Attack シグナルの閾値を調整して下さい。