【AWS セキュリティ対策】AWS WAF編

# 構成
こちらの記事は AWS セキュリティサービスを使ってみた シリーズの Part.1 の記事です。
他にも以下のサービスについてまとめております、ぜひご覧ください。

Part.1
AWS WAF （本記事）
Part.2
[Amazon GuardDuty](https://qiita.com/m-ide/private/ccc87341eed291e606ee)
Part.3
[AWS Detective](https://qiita.com/omiyu/private/7e00bcbe685db53cdc9f)
Part.4
[AWS Security Hub](https://qiita.com/banana-877/private/b7292043fb6da2d8bc13)

【随時更新】 AWS セキュリティ製品一覧：
https://qiita.com/omiyu/private/830477c436b4000ae680

## AWS WAFとは

>AWS WAF は、Amazon CloudFront ディストリビューション、Amazon API Gateway REST API、Application Load Balancer、AWS AppSync GraphQL API のいずれか に転送される HTTP および HTTPS リクエストのモニタリング可能にするウェブアプリケーションファイアウォールです。

引用元：https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/what-is-aws-waf.html

### web ACLとは
AWS WAF では **web ACL（ウェブアクセスコントロールリスト）** を作成し、web ACL にルールを追加することで、紐づけたAWSリソースを保護します。
web ACL に適用するルールにより、ウェブリクエストへの処理方法が指定されます。

### マネージド ルールグループとは
AWS WAF では **マネージド ルールグループ** といって、事前定義されたすぐに使用できる ルールのコレクション が用意されております。
web ACL にワンクリックで追加して 適用することができます。

マネージド ルールグループ一覧：https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/waf-managed-rule-groups.html

## できること
基本的に、AWS WAF では以下のいずれかの動作を選択できます。

- 指定したリクエスト以外のすべてのリクエストを許可する
- 指定したリクエスト以外のすべてのリクエストをブロックする 
- 指定したプロパティに一致するリクエストをカウントする

## 保護条件のプロパティ

AWS WAF では、AWSより提供されるマネージド ルールグループの適用のほか、独自でルールを定義して適用することも可能です。
保護条件のプロパティは以下の通りです。

- リクエストの発生元の IP アドレス
- リクエスト送信元の国
- リクエストヘッダーの値
- リクエストに表示される文字列
- リクエストの長さ
- 悪意のある可能性がある SQL コードの有無
- 悪意のある可能性があるスクリプトの有無

## あわせて使いたいサービス
AWS Firewall Manager や AWS Shield を組み合わせて使用することで、包括的なセキュリティソリューションを作成できます。

**AWS Firewall Manager**：AWS WAF の管理を簡素化できます。
アカウント間で AWS WAF を使用したり、AWS WAF 設定を高速化したり、新しいリソースの保護を自動化したりします。

**Shield Advanced**：AWS WAF の専用サポートや高度なレポート機能・DDoS Response Team (DRT)の機能を追加します。
視性の高いウェブサイトを所有している場合やDDoS、頻繁に攻撃を受けやすい場合に有効です。

## 料金

作成する各 web ACL および web ACL ごとに作成する各ルールに対して請求されます。
さらに、web ACL によって処理された web リクエストの数に対して請求されます。

|リソースタイプ|料金 |
|---|---|
|Web ACL|5.00USD、月あたり (時間で案分)|
|ルール|1.00USD、月あたり (時間で案分)|
|リクエスト|0.60USD 100 万リクエストあたり|

また、AWS Marketplace にて有料で提供されるマネージドルールグループを購入する場合は、出品者による料金設定に基づいて追加料金が請求されます。

詳細：https://aws.amazon.com/jp/waf/pricing/
こちらのリンク先に埋め込まれている料金計算ツールを使って、概算を見積もることも可能です。

# 開始方法

## ゴール
今回は、web ACLの作成をするところまでやります。
独自のルール作成と、マネージド ルールグループの適用を行います。

## 前提条件
1. AWS アカウントにサインアップする
1. IAM ユーザーを作成する

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/setting-up-waf.html

## 手順

手順はざっくり以下の通りです。

1. web ACL を作成する
2. 文字列一致ルールの追加
3. AWS マネージド ルールグループ の追加
3. web ACL の設定を完了する
3. リソースのクリーンアップ

### 1. web ACL を作成する

AWS マネジメントコンソールにサインインし、[AWS WAF](https://console.aws.amazon.com/wafv2/) を開きます。

[Create web ACL] から web ACLの作成に入ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/70b1729a-327f-8cf1-aa6b-018bc977088e.png)

**web ACLの作成とAWS リソースへの関連付け**

Name：web ACLの名前を入力します。
Description：web ACLの説明を入力します。（オプション）
CloudWatch metric name：必要に応じて CloudWatch 名を変更します。
Resource type：CloudFront ディストリビューションを選択します。
Region：Resource typeでCloudFront ディストリビューションを選択したことにより、自動でグローバルが選択されます。
Associated AWS resources：紐づける AWS リソースを追加します。今回は割愛します。

上記の設定が完了したら [Next] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/d5edb7ff-2544-3275-6bfc-54fcb9863156.png)

### 2. 文字列一致ルールの追加

**独自のルールを作成する**

[Add rules] → [Add my own rules and rule groups]の順に選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/c0ca2ed6-9707-afb2-c824-622b6c69c133.png)

Rule type で Rule builderを選択 → Rule visual editor を選択します。
※Rule visual editor のほかに Rule JSON editor も用意されております。
web ACLs 間で設定をコピーする際に便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/0f79e3a2-2504-8f00-bd27-785086f70418.png)

Name：ルール名を入力します。
Type：Regular ruleを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/e4498453-05a9-4961-f03b-3315ac2b5bcc.png)

値 User-Agent のウェブリクエストの BadBot ヘッダーを検査するように設定していきます。

If a request：matches the statement（リクエストの場合ステートメントに一致）を選択します。
Inspect（検査）：Headerを選択します。
Header field name（検査するヘッダー）：User-Agentを入力します。この値では大文字と小文字は区別されません。
Match type（指定した文字列が User-Agent ヘッダーに表示される場所）：Exactly matches string（文字列に完全一致）を選択します。
String to match（検索する文字列を指定）：BadBotを入力します。
Text transformation（テキスト変換）：Noneを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/8f6c4b63-2b61-ce7f-3ce8-5d1e90f66ea2.png)

Action：Countを選択します。これにより、ルールに一致するウェブリクエストのメトリクスが作成されます。ルールが許可されるか、ブロックされるかどうかには影響しません。

[Add rule]を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/426a30c8-4b39-89c7-d63b-1b53571b69a9.png)

### 3. AWS マネージド ルールグループ の追加

Add rules → Add managed rule groups の順に選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/8e05db1f-e7be-4189-6b2d-85519f6d8d3b.png)

**AWS managed rule groups**の一覧を展開します。
追加するルールグループの [Action] 列の [Add to web ACL] の切り替えをオンにします。
今回は Core rule set をオンにします。

**Core rule set とは**
> コアルールセット (CRS) ルールグループには、ウェブアプリケーションに一般的に適用可能なルールが含まれています。これにより、OWASP の出版物に記載されている高リスクの脆弱性や一般的な脆弱性など、幅広い脆弱性の悪用から保護されます。すべての AWS WAF ユースケースでこのルールグループを使用することを検討してください。

引用元：https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-list.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/38e68d8e-2110-3aaa-b5c3-45ed79a97904.png)

[Add rules] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/1d8b5af2-c698-fbc3-86d0-50ed6acf449b.png)

### 4. ウェブ ACL の設定を完了する

更に追加したいルールがある場合は先程と同様の手順で追加します。
無い場合、 [Next] で次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/eb39ad17-5aac-2d80-71b4-8030233420b4.png)

**Set rule priority（ルールの優先順位の設定）**

web ACL 内のルールおよびルールグループの処理順序を確認できます。

[Next] で次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/6e7adcee-2af6-1e25-d0f8-7bb0f78f2a10.png)

**Configure metrics（メトリクスの設定）]**

Amazon CloudWatch metrics：Amazon CloudWatch metrics で、ルールおよびルールグループに計画されたメトリクスを確認できます。
必要に応じて選択を解除したり、メトリクス名を変更したりします。

[Next] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/53b5f6c0-8b9c-beea-9389-311aec12b3b1.png)

**Review and create web ACL（web ACLの作成と確認）**

設定内容に問題が無いか確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/23e7af82-09a3-56f5-c90e-d98f390f7e3a.png)

[Create web ACL] で web ACL が作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/9f8e6f67-5cc1-0269-f82a-04693e5562d3.png)

web ACL が作成され、web ACL の一覧に表示されたことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/b9b67f23-53fc-c8a5-8d28-1a6dd1433297.png)

### 5. リソースのクリーンアップ

削除対象の web ACL を選択 → [Delete] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/b154911f-0a9a-519a-f8a1-2c4a032306e3.png)

確認の画面が出るので「delete」と入力して削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/f0dca3ff-b24f-331f-c21b-b02084888105.png)

# さいごに
AWS WAF ではルールセットが多数用意されており、使いたいものをオンにするだけで簡単に使えることが分かりました。
次は 今回作成した web ACL を 他 AWS リソースに紐づけてみて、そのパフォーマンスを見ていきたいと思います。

# 参考ドキュメント
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/getting-started.html