【AWS】WAFを使ってIP制限を実施する


最近AWSをWAFと戦い続けているのでWAFについて少し書きたいと思います。

# WAFについて
Amazonが提供するマネージドWAFです。
CloudFrontと一緒に使うため、WAFを使用する際はまず、CloudFrontの構築をする必要があります。

# WAFの用語
WAFには３つの用語が存在します

* condition：条件指定（このIPアドレスからの接続」, 「User-Agentに○○が含まれている」など）
* rule：複数のconditionをまとめたもの
* ACL：ruleに[Allow], [Block]. [Count]を指定してルールに基づいた制限をかける

# condition

conditionに設定できるのは以下のとおりです。

* IP match conditions
* String match conditions
* Size constraint conditions
* Cross-site scripting match conditions
* SQL injection match conditions

### IP match conditions
IPアドレスのホワイトリスト/ブラックリストを作成し、そのリストにもとづいてアクセスの拒否/許可を設定します。

### String match conditions
リクエスト中に特定の文字列が存在するかどうか、ホワイトリスト/ブラックリストを作成し、そのリストにもとづいてアクセスの拒否/許可を設定します。

### Size constraint conditions
リクエストサイズについて、指定した値より大きいサイズのリクエストかどうか評価します

### Cross-site scripting match conditions
AWSが内部で作成している評価ルールにもとづいて、リクエストがXSSの疑いがあるかどうか評価します

### SQL injection match conditions
AWSが内部で作成している評価ルールにもとづいて、リクエストがSQL
インジェクションの疑いがあるかどうか評価します

# 注意事項
実際に使用する際には以下のことに注意してください

* ログを見るのが恐ろしく面倒
	WAFのコンソールからログを見ることができがすが、1.5時間ほどしか残りません
	詳細なログに関しては、CloudFrontログを確認することになります
* XSS/SQLインジェクションのルールを設定している場合何がダメだったかログに出ない
	XSS/SQLインジェクションのルールについては、AWSが独自に実装しているルールに基づいて評価されますが、これは外部に仕様が公開されていません。
	また、ログ上にも何がダメでアクセスが弾かれたか残らないため、擬陽性のアクセスが来た際など特定するのが非常に大変です
* 設定できる項目の上限
	WAFはconditionsはルールに設定できる項目の上限数があります。
	この上限数は現状（2016/05現在）緩和することが出来ません。
	限られた範囲内で頭を使いましょう
	
以上、が試した中で感じた点です。
実際に使用する場合、IP制限等を噛ませる/文字列マッチングで特定のアクセスを弾くと言った使い方が良いのではないでしょうか。
SQLインジェクションの評価を入れたらブログ投稿時 __styleタブ__ が評価されてエラーになるが、原因がわからなくて大変でした。

# 設定（ACLの作成）

では、実際にIPアクセス制限をかけていきます。

![AWS_WAF_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/54f74db5-c789-2079-8b8b-ff553b195762.jpeg "AWS_WAF_01.jpg")

![AWS_WAF_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/4bfcac83-fb3c-89c4-2ec5-8ac298a49701.jpeg "AWS_WAF_02.jpg")

全部スルーして右下の次へ

![AWS_WAF_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/14de7bd3-1bb3-7dd4-5f0c-cfe31a28205e.jpeg "AWS_WAF_03.jpg")

ACL名を入力して次へ

![AWS_WAF_04.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/29765a41-2ba6-9b08-a6a4-34f1e8602e84.jpeg "AWS_WAF_04.jpg")

![AWS_WAF_05.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/6e405e94-de75-e918-12c6-071cc8be040a.jpeg "AWS_WAF_05.jpg")

![AWS_WAF_06.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/1c92970f-5e2f-7229-50f3-073a6e825e8e.jpeg "AWS_WAF_06.jpg")

最後にサマリが出てくるので確定してACLを作成します。

# 設定(IP match conditionsの作成)

次に、IPの制限ルールを作っていきます。

![AWS_WAF_07.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/21eeced8-b203-540f-980f-6749a3490534.jpeg "AWS_WAF_07.jpg")

IPアドレスの欄を選択し、Create Condition を選択します

### conditionsの評価の注意
__conditionsに指定した項目はOR評価されます。__
__従って、ここに設定した値のうち、1つでも合致すれば真と評価されることになります。__

# 設定（ルールの作成）
ACLに紐付けるためルールを作成します

![AWS_WAF_09.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/168e820c-f835-f778-4634-3f48807c4f63.jpeg "AWS_WAF_09.jpg")

![AWS_WAF_10.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/822277ac-2c8e-c851-a6ad-c8f4780f0ec5.jpeg "AWS_WAF_10.jpg")

### ルールの評価の注意
__conditionがOR評価されたのに対し、ルールは指定した項目をAND評価します__
__即ち、指定した全ての項目が満たされた時のみ真と評価されるため注意が必要です__

# ルールをACLに紐付ける
![AWS_WAF_11.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/6efea302-3bdb-1329-d310-984deaf45a4e.jpeg "AWS_WAF_11.jpg")

![AWS_WAF_12.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/754626a0-86f4-9648-c4fd-c0c3d58aa6d0.jpeg "AWS_WAF_12.jpg")

ルールのEdit web ACL を押下します

![AWS_WAF_13.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/435f80a8-c75c-56f7-5c0b-b774930ebf8a.jpeg "AWS_WAF_13.jpg")

### 設定例
自分のIPだけ許可するといった場合は、IPを書いたルールが真の時”Allow”
デフォルト（ルールに当てはまらなかった時）は"Block"とします

作成したACLをCloudFrontに適応することでWAFは機能するようになります

__おしまい__