[新機能] AWS WAFのレートベースルールでホワイトリストを利用してみた

AWS WAF

ご機嫌いかがでしょうか、豊崎です。

AWS Blogで6月21日に発表されたAWS WAFの新しいレートベースルールでホワイトリストを利用した際の挙動をご紹介させていただきます。

レートベースルールについては弊社菊池も記事を書いていますので、あわせてご覧ください。

[新機能] AWS WAFでレートベースのルールが作成可能になりました [DDoS/Brute force対策]

それでは早速試してみましょう。

試してみましょう

準備

チュートリアルではCloudFrontを利用していましたが、本記事ではALBにWAFを適用します。 WAFの設定を行う前にALBとその配下にWEBサーバ、ホワイトリストに登録するサーバ、登録しないサーバも用意しておきます。

  • ALB
  • ALB配下のWEBサーバ
  • テスト用サーバA:ホワイトリストに登録している:52.XXX.XXX.118
  • テスト用サーバB:ホワイトリストに登録していない:13.XXX.XXX.57
  • テストツールはabを使用

http://<albエンドポイント>/loginで接続できるテストページを用意しました。

demo-waf-1455046288_ap-northeast-1_elb_amazonaws_com_login

設定

String match Condition

はじめに、String match Conditionをつくっていきます。

AWSマネジメントコンソールからWAF&Shieldダッシュボードを開き、 String matching>Create conditionを押して進みます。

AWS_WAF

次の画面ではリクエストのURIに「/login」が含まれていた時にマッチするフィルターを設定しています。

AWS_WAF_1

フィルターが追加されたことを確認して、Createを押します。

AWS_WAF_2

IP match condition(ホワイトリスト用)

次にIP match conditionをつくります。

IP address>Create conditionを押して進みます。

AWS_WAF_3

ホワイトリストに設定したいIPアドレス(ここでは52.XXX.XXX.118)を入力します。 /8,/16,/24,/32でしか設定できないのでご注意ください。

AWS_WAF_4

追加されていることを確認してCreateを押します。

AWS_WAF_13

Rules

次にRuleを作っていきましょう。

Rules>Create Ruleを押して進みます。

AWS_WAF_11

Rule typeをRate-based Ruleに変更し、Rate limitsを設定しましょう。 Rate limitsは5分間の合計の値になります。設定できる最小値が2000だったので、今回は2000に設定しました。

AWS_WAF_6

次にmatch Conditionで先ほど作成したConditionを以下のように設定してCreateを押します。

AWS_WAF_14

 

Web ACLs

最後にWeb ACLをつくります。

Web ACLs>Create web ACLを押して進みます。

AWS_WAF_8

WAFに紐づけたいリソース(CloudFrontまたは、ALB)を指定します。

AWS_WAF_9

Create Condtions画面では特に設定を行いません。 そのまま次に進んでください。

Create Rulesの画面で先ほど設定した「demo-Rule」を追加します。 ルールにマッチしなかった時のデフォルトの動作は許可、マッチした場合はレートに応じて拒否を行います。

AWS_WAF_10

次の画面で設定を確認し、作成しましょう。

テスト

AWS環境への負荷テスト・侵入テストを実施する際には事前の申請が必要となりますのでご注意ください。

2台のEC2からabを使ってELBに閾値を超えたリクエストを送り、 ホワイトリストに登録したEC2のグローバルIPがブラックリストに登録されないことを確認します。

同じタイミングで数回abコマンドを打ったところでホワイトリストに登録していないサーバ側で「Non-2xx responses」が帰ってきました。

テスト用サーバA:ホワイトリストに登録している:52.XXX.XXX.118

# curl inet-ip.info
52.XXX.XXX.118
# date
Thu Jun 22 02:45:03 UTC 2017
# ab -n 3000 -c 1 http://demo-waf-XXXXXXXXXX.ap-northeast-1.elb.amazonaws.com/login

---中略---
Concurrency Level:      1
Time taken for tests:   8.798 seconds
Complete requests:      3000
Failed requests:        0
Write errors:           0
Total transferred:      819000 bytes
HTML transferred:       60000 bytes
Requests per second:    340.98 [#/sec] (mean)
Time per request:       2.933 [ms] (mean)
Time per request:       2.933 [ms] (mean, across all concurrent requests)
Transfer rate:          90.91 [Kbytes/sec] received

テスト用サーバB:ホワイトリストに登録していない:13.XXX.XXX.57

# curl inet-ip.info
13.XXX.XXX.57
# date
Thu Jun 22 02:40:05 UTC 2017
# ab -n 3000 -c 1 http://demo-waf-XXXXXXXXXX.ap-northeast-1.elb.amazonaws.com/login

---中略---
Concurrency Level:      1
Time taken for tests:   19.578 seconds
Complete requests:      3000
Failed requests:        0
Write errors:           0
Non-2xx responses:      3000
Total transferred:      846000 bytes
HTML transferred:       402000 bytes
Requests per second:    153.23 [#/sec] (mean)
Time per request:       6.526 [ms] (mean)
Time per request:       6.526 [ms] (mean, across all concurrent requests)
Transfer rate:          42.20 [Kbytes/sec] received

AWSマネジメントコンソールからも「13.XXX.XXX.57」がブラックリストに登録されたことが確認できました。 もちろんホワイトリストに設定している「52.XXX.XXX.118」はブラックリストに登録されていませんでした。

 

AWS_WAF_16

まとめ

WAFのレートベースのルールでホワイトリストを試してみました。ブログでもある通り、特定IPからのリクエストについてはリミットなく接続させたいというケースに利用できると思います。レートベースのWAFの登場で利用の幅が広がりましたね。これからいろいろ触ってみたいと思います。