Fastly NG-WAF でのカスタムシグナルを利用したトラフィックの追跡



# はじめに

Fastly の NG-WAF ではリクエストを検査し、攻撃の特徴や通常のリクエストとは異なる特徴が検出されるとリクエストにシグナルを付与して情報を記録します。「シグナル」は、リクエストにアサインされるタグ/ラベルのようなもので、NG-WAF のコントロールパネルではこのシグナルの発生状況などをグラフで確認したり、シグナルをフィルターとして利用してリクエスト情報の分析を行ったりすることが出来ます。

さらに、Professional 以上のパッケージを利用している場合は、このシグナルを独自のルールに基づいてカスタムシグナルとして付与することが出来ます。

付与したカスタムシグナルもシステムが付与したシグナル同様にコントロールパネルでトラフィックを確認したり分析したりすることが出来ます。

この記事ではカスタムシグナルの付与の方法と、カスタムシグナルをどのようにサイトのセキュリティ向上に利用できるかを説明します。

# カスタムシグナルの利用方法

カスタムシグナルを付与する条件は自由にカスタマイズすることが出来ます。例えば以下のような条件や、その組み合わせを条件として利用することが出来ます。

・特定のブロック対象の国からのアクセス
・サービスへのログイン
・特定の IP のレンジからのリクエスト
・リクエストに特定のヘッダーが含まれていない

これらのカスタムシグナルを付与することで、

・リアルタイムに発生しつつある攻撃の兆候を発見できる
・リスクの高いエンドポイントに対する監視
・ブロックルールをリリースする前にブロックして問題ないかを確認

といったような目的で利用することが出来ます。


## 怪しい 404 リクエストにシグナルをつけて分析する

それではカスタムシグナルを実際の利用シナリオを想定して作成手順とあわせて説明してみたいと思います。


攻撃の兆候として最初に現れることが多いのが 404 レスポンスの増加です。急激に 404 レスポンスが増加している場合、何者かが攻撃可能なポイントを探してアクセスをしている可能性があります。

Fastly の NG-WAF ではデフォルトで 404 レスポンスには `404` シグナルを付与するため、発生状況のダッシュボードのグラフから確認することが出来ます。

Response Anomalies のグラフに以下のように 404 のスパイクが発生していると要注意となります。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/a3509619-f912-19b7-84d3-6e1fc1e2302c.png">

View requests をクリックするとこれらのリクエストの詳細を確認することが出来ます。
確認した結果、どうやらこの 404 のスパイクは日本以外の国からのアクセスが原因で発生していたと仮定します。

そうなると次はこの日本以外の国からの 404 をもう少し詳しく調べてみる必要がありそうです。



<!-- 
同じ時間帯の Traffic Source Anomalies のグラフに目を向けてみると `SigSci IP` というシグナルの発生状況が 404 と同様に発生していることが分かります。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/46a31b53-7a7b-4134-0ec9-bae18e8f049a.png">

`SigSci IP` シグナルは、過去24時間以内に NG-WAF を利用している他のお客様に対して攻撃行動を行ったと判断されブロック対象となった IP からのリクエストに付与されるシグナルです。
--> 



#### カスタムシグナルの追加

国外からの 404 を発生させているリクエストを調査するため、この条件を満たすリクエストに新たな別のシグナルをカスタムシグナルとして付与します。

カスタムシグナルの追加は Rules -> Site Rules -> Add site rule から行います。

<!-- 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/16853d38-8174-e2d3-3855-aff4733c3fce.png)
-->

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/bcccbb1a-e591-db82-8d7e-dffb65867ab5.png)


これで日本以外からのアクセス、かつレスポンスコードが 404 のリクエストには新たに作成した `Non-JP404` シグナルが付与されます。

シグナルの発生状況は Monitor -> Signals Dashboard から確認出来ます。

Signals Dashboard で該当のシグナルをクリックすると以下のようなグラフが表示され発生状況を確認することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/10cbaabf-c7d2-49ab-2700-db3b94c6ba8f.png)



リクエストの情報もサンプリングされて記録されているので、Requests から ` tag:site.non-jp404` でフィルターすることでリクエストの情報も確認することが出来ます。

### ダッシュボードにグラフを追加する
カスタムシグナルを作成することで Signals Dashboard からシグナルの発生状況をグラフで確認することが出来ますが、グラフはログイン時に表示されるダッシュボードをカスタマイズすることでダッシュボードにも表示することが出来ます。

カスタムダッシュボードは画面右上の `Add dashboard` から作成できますが、デフォルトのダッシュボードにグラフを追加したい場合は `Make a copy of this dashboard` をクリックして下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/184f41c8-3145-25e8-1e1e-5c3b9f34be69.png)

デフォルトの Overview のダッシュボードのコピーが作成されます。Editボタンから必要に応じてダッシュボードの名前を変更して下さい。

ダッシュボードをスクロールダウンしていくと、`Add card` ボタンが表示されています。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/97468588-b9c4-31ab-e14c-6185ac273f45.png">

Add card をクリックすると、追加するグラフの内容を選択できるので 

**Custom cards** ->  **Signals request cart** -> Signals に `Non-JP404` 
を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/2be044a4-713e-ea5c-cce7-3483c691a4d1.png)
なお、グラフに表示するシグナルは複数選択可能なので他にも同じグラフに表示したいシグナルがある場合はここで選択することが出来ます。

Crate Card をクリックするとダッシュボードに以下のようなグラフが追加されます。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/18fd3b43-f6d2-556e-82d7-f0cccf24ed1e.png">

この小さなグラフはカードと呼ばれますが、マウスオーバーすることで表示される右上の十字の矢印マークをクリックすることでカードの表示場所を変更することも可能です。

サービスにとって重要なシグナルを含むカードを目立つ場所に移動することで、ログイン時に一目で重要なシグナルの発生状況を把握することができる仕組みになっています。



### カスタム Site Alert 設定の追加

続いて `Non-JP404` が一定数以上発生した場合に通知を行ったり、時系列で状況を確認できるように Site Alert を作成してみます。

Site Alert の追加は Rules -> Site Alerts -> Add site alert から行います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/44718a09-bc75-0b9e-ac8e-7058e3dafef9.png)

上記の設定では特定のIPから閾値に指定した値（ここでは1分間に5回以上） `Non-JP404` シグナルが発生した場合に対象の IP をログオプションで flag （攻撃シグナルが確認されてもでブロック対象とはしない）し、Event にリクエストの発生状況を時系列で記録します。

Notification をチェックしているので、IP が flag されたタイミングで連携したメールアドレスや Slack に通知も送られます。


<!--

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/01608684-0eb1-7f66-e66d-23e45ed98847.png)
-->

### イベントの確認
Site Alert で指定した閾値を超えるリクエストが発生した場合、ダッシュボードの Evetns カードに以下のように flag されている IP が表示されます。



<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/145a4acf-e9fb-3ba2-f414-ac3b57a55faa.png">

`View all events` をクリックすると以下の Events 画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/db9875f4-d824-5b27-e1ae-3f364ace8503.png)

Events 画面では対象の IP の概要の情報や、この IP が flag されるに至った経緯を時系列で確認することが出来ます。

また、 View this request をクリックすることで Requests 画面に移動し、リクエストの詳細情報を確認することも出来ます。

# まとめ
この記事ではカスタムシグナルを利用したサービスのモニタリングや閾値ベースでの通知を行う手順を説明しました。

カスタムシグナルは上手く使うと攻撃や攻撃につながるリクエストを早期に発見するために非常に便利な仕組みです。サイトを攻撃から守るために是非活用して下さい。

なお、この記事は Fastly が行った [Surfacing Attacks and Anomalies with the Fastly Next-Gen WAF](https://vimeo.com/734770212)というウェビナーの内容を参考にして作成しました。ウェビナーは英語なのですがよろしければこちらも見てみて頂ければと思います。