AWS WAFの動作チェックを試みる

この記事は[NTTコムウェア Advent Calendar 2021](https://qiita.com/advent-calendar/2021/nttcomware) 7日目の記事です！

こんにちは。
NTTコムウェアで歌って踊れるエンジニアを目指すhirousiです。

## はじめに
Webサービスを公開する際に、セキュリティ対策として、とりあえずCloudFrontやAPI-GatewayにAWS WAFをアタッチする方が多いかと思います。中でもAWSの管理ルールとして提供されているAWSManagedRulesCommonRuleSetについて、どんな事をしてくれているのかを紐解いてみようと思います。
本記事の想定読者は下記の通りです

- 本当に守られているのか不安（テストしたい）な方
- どんな攻撃から守られているのか知りたいな方
- Webサービスにセキュリティ対策を実施したい方

## そもそもAWS WAFって何よ？
いわずとしれたクラウドサービス[AWS](https://aws.amazon.com/jp/)(Amazon Web Service)が提供する、[WAF](https://aws.amazon.com/jp/waf/)(Web Application Firewall)サービスです。

AWSの提供する管理ルールや、サードパーティの提供するルール、自身でのカスタマイズを組み合わせ、外部の脅威から自身のWebAPを守るために利用されます。
中でもAWSManagedRulesCommonRuleSetは、Webアプリケーションのセキュリティを守る非営利団体[OWASP](https://owasp.org/)(Open Web Application Security Project)がWebセキュリティとして警戒をしなければいけないとして挙げている様々な項目への対応を謳っており、利用している方も多いかと思います。

> コアルールセット (CRS)
VendorName AWS, 名前: AWSManagedRulesCommonRuleSet, WCU: 700
コアルールセット (CRS) ルールグループには、ウェブアプリケーションに一般的に適用可能なルールが含まれています。これにより、OWASP の出版物に記載されている高リスクの脆弱性や一般的な脆弱性など、さまざまな脆弱性の悪用に対する保護が提供されます。Owasp Top 10。すべての AWS WAF ユースケースでこのルールグループを使用することを検討してください。
出典：[AWS管理ルールルールグループリスト](https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-list.html)

## じゃあWAFって具体的に何をしてくれるの？
というのが本記事の内容となります。
どんなリクエストからWebAPを守ってくれているのかを、実際のリクエスト例と紐づけて紹介します。


### 注意事項

- 本内容については、不正アクセスを助長するものではございません。
- 本ページの内容については、悪用を禁止致します。
    - あくまで自身のサイトのテスト目的での利用に限ります。
    - 悪用した場合、不正アクセス禁止法等で訴えられる可能性がございます。


## このページの見方（凡例）
#### ルール名
> [AWSドキュメント](https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-list.html)上で示される説明内容

解説をここに記載

```text:リクエスト例
curlでの実際のリクエスト例（ドメインはサンプル）
```

- [類似するルール名1]
- [類似するルール名2]

---
#### NoUserAgent_HEADER
> HTTP User-Agent ヘッダーのないリクエストをブロックします。

通常、ブラウザやツール（Curl等）でアクセスすると、何からアクセスしたかを示すUser-Agent情報が
サーバへ送付されるのですが、このUser-Agentが無いリクエストを検知します。
※User-Agentが無い=ブラウザ等では無いので、悪意があるリクエストである可能性がある、ということでしょうか。

```bash:リクエスト例
curl https://example.com -H "User-Agent: "
```

---

#### UserAgent_BadBots_HEADER
> リクエストに、不正なボットであることを示す一般的な User-Agent ヘッダー値がないかを検査します。パターンの例には、nessus、nmap などがあります。
ボット管理については、[AWS WAFボット制御ルールグループ](https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-list.html#aws-managed-rule-groups-bot)。

nessusやnmap等の、ポートスキャンや脆弱性スキャンに用いるツールに用いられているUser-Agentからのリクエストを検知します。

```bash:リクエスト例
curl https://example.com -H "User-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; http://nmap.org/book/nse.html)
```

---

#### SizeRestrictions_QUERYSTRING

> URI クエリ文字列の長さが最大 2,048 バイトであることを確認します。

クエリ文字列（サーバへ送信する情報の中で、URLに含まれるもの）が一定サイズを超える場合にリクエストを検知します。
サービスの仕様に依っては、検知をブロック、正常にリクエストを受けられない問題が発生する可能性があります。

```bash:リクエスト例
curl https://example.com?123457890…(2048バイト以上)
```

- SizeRestrictions_Cookie_HEADER
- SizeRestrictions_BODY
- SizeRestrictions_URIPATH

---

#### GenericLFI_QUERYARGUMENTS

> クエリ引数に、ローカルファイルインクルージョン (LFI) を悪用する形跡がないかを検査します。例には、../../ などの手法を使用したパストラバーサルの試行があります。

LFI(サーバ内のローカル上のファイルを読み込んでしまう脆弱性)に対する攻撃を検知します。
下記のリクエストは、パストラバーサルの脆弱性を利用して、`/etc/passwd`を参照しようとする例です。
基本的にIPA刊行の[安全なウェブサイトの作り方](https://www.ipa.go.jp/security/vuln/websecurity.html)等に準拠して開発をしていれば、アプリケーション側で対策されていますが、万が一対策漏れしたアプリがリリースされていても、WAFで検知してくれます（過信は禁物）。

```bash:リクエスト例
curl https://example.com/script.php?page=../../../../../../etc/passwd
```

- GenericLFI_URIPATH
- GenericLFI_BODY

---

#### RestrictedExtensions_URIPATH

> リクエストの URI パスに、クライアントが読み取りや実行を禁止されているシステムファイルの拡張子が含まれていないかを検査します。パターンの例には、.log や .ini などの拡張子があります。

設定ファイル等を直接参照するようなリクエストを検知します。
アクセス権限が適切に設定されていないWebサーバ等で、設定ファイルが公開されてしまっている例などにも、本ルールを適用していれば検知されます（過信は禁物）

```bash:リクエスト例
curl https://example.com/test.ini
```

- RestrictedExtensions_QUERYARGUMENTS

---

#### GenericRFI_QUERYARGUMENTS

> すべてのクエリパラメータの値を検査し、ウェブアプリケーションの RFI (リモートファイルインクルージョン) を悪用しようとするリクエストをブロックします。パターンの例には、:// などがあります。

RFI（リモート上のファイルを参照できてしまう脆弱性）に対する攻撃を検知します。
例えばDMZに配置されたWebサーバに、ユーザの指定するファイルを参照するスクリプトが配置してあり、リモート上のファイルを指定できるような作りになっている場合、内部セグメントのファイルを読み取れる可能性がありますが、こういった脆弱性を突く攻撃を検知してくれます（過信は禁物）。

```bash:リクエスト例
curl https://example.com/display.php?FORMAT=http://192.168.11.1/test.txt
```

- GenericRFI_BODY
- GenericRFI_URIPATH

---

#### CrossSiteScripting_QUERYARGUMENTS

> の組み込み XSS 検出ルールを使用して、クエリ引数の値を検査し、一般的なクロスサイトスクリプティング (XSS) パターンをブロックします。AWS WAF。パターンの例には、<script>alert("hello")</script> などのスクリプトあります。

言わずと知れたクロスサイトスクリプティングを検知してくれます。
例えば掲示板サイトに攻撃サイトへ自動遷移するjavascriptタグを埋め込む等の攻撃を検知します。

```bash:リクエスト例
curl "https://example.com?script=<script>alert("hello")</script>"
```

- CrossSiteScripting_COOKIE
- CrossSiteScripting_BODY
- CrossSiteScripting_URIPATH

---

#### EC2MetaDataSSRF_QUERYARGUMENTS

> リクエストクエリ引数から Amazon EC2 メタデータを盗み出す試みがないかを検査します。

EC2のメタデータを参照するようなリクエストを検知します。

```bash:リクエスト例
curl https://example.com?site=http://169.254.169.254/latest/meta-data/
```

- EC2MetaDataSSRF_BODY
- EC2MetaDataSSRF_COOKIE
- EC2MetaDataSSRF_URIPATH

---

参考資料：
https://owasp.org/www-project-top-ten/
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-list.html
https://www.ipa.go.jp/security/vuln/websecurity.html