概要
やりたいこと
AWS WAF の Rate-based ルールを利用して DDoS 対策を行いたい。AWS WAFの検証 を参考にして、AWS WAF 検証用環境を作成する。
- AWS WAF は ALB に紐付ける
- WAF のバージョンは 2
- HTTP接続
- EC2 には OWASP Juice shop をホスティング
OWASP Juice shop
OWASP Juice shop とは OWASP TOP 10 に記載されている脆弱性を含む、多数の脆弱性のある Web アプリケーション。
CTF の練習なんかに使える。
AWS WAF
AWS WAF についてはクラスメソッドのブログがとてもわかりやすくまとまっている。こちらより AWS WAF 用語を引用させていただく。
- WebACL
- 1つのWAFの設定の塊
- CloudFront / ALB / API Gatewayに割り当てる単位
- 1つのリソースに対して1つのWebACLのみ割り当て可能
- 複数のリソースに対して同じWebACLを割り当て可能
- 複数のルール/ルールグループを内包する
- ルール
- リクエストに対する条件のまとまり
- 例えば指定したIPにマッチするか、特定のクエリストリングがあるか等
- ルールグループ
- ルールをまとめたもの
- 事前に定義可能
- アクション
- リクエストをルールに照らし合わせた結果をどう扱うかの設定
- ALLOW / BLOCK / COUNTがある
- ルール毎にアクションがあり、すべてのルールに当たらなければWebACLに設定されたDefault Actionに沿って処理される
設定
EC2作成
EC2を作成し、OWASP Juice shop を閲覧できるようにする。
- EC2 コンソールより
- EC2 インスタンスを別のアベイラビリティーゾーンで2個作成
- EC2 へログインし、dockerコンテナとして OWASP Juice shop を起動
EC2 へログインしてから行うことは以下。
yum update -y
yum install -y docker
service docker start
docker pull bkimminich/juice-shop
docker run -d -p 80:3000 bkimminich/juice-shop
ブラウザよりパブリック DNS でアクセスし、 Owasp Juice shop の画面が出ればOK。
ALB作成
OWASP Juice shop を ALB 経由で閲覧できるようにする。
- EC2 コンソールより
- ターゲットグループを作成
- ターゲットグループにインスタンスを登録
- ロードバランサー (ALB) を作成し、ターゲットグループを指定
ALB のパブリック DNS で OWASP Juice shop の画面にアクセスできることを確認。
AWS WAF 作成
空の Web ACL を作成する。
- AWS Firewall Manager -> AWS WAF コンソールより
- Create web ACL
- Resource Type を 「Regional resources (Application Load Balancer and API Gateway)」
- 「Add AWS Resources」 をクリック
- Application Load Balancer を選択し、上記で作成した ALB にチェックし Add
- ルールは後で作るので全て「Next」で飛ばし、最後に「Create web ACL
Web ACLs に作成した WebACL が作成されていることを確認。
※WebACL を削除する場合、ALB と ACL を紐付けている設定(Associated AWS resources)を先に削除しておかないと、消すことができない。
AWS WAF ルール追加 (Rate-based)
今回はDDoS 対策のため、単位時間あたりのアクセス数でアクセス元 IP をブロックする Rate-based Condition の検証を行う。AWS WAF のルールを Condition と呼ぶ。
5分以内に100件以上の場合にアクセス元IPをブロックする。
- 作成した Web ACL を選択する
- Rules タグを選択
- Add Rules
- Add my own rules and rule groups
- Rule Builder
- Rate-based rule
- Rate limit を 100
- Action を「Block」
- Add rule
- Save
OWASP Juice shop に対して F5 アタックを100回繰り返すと、101回目でアクセスできないようになった。
コメント