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

こんにちは、菊池です。

本日(2017/6/22)AWS WAFの新機能が発表され、リクエストレートによるルールが作成可能になりました!

レートベースのルールを適用することで、同一IPアドレスからの大量リクエストをブロック可能になります。DDoS攻撃やブルートフォースアタックといった攻撃からの防御が、簡単に実装可能です。詳細な動作仕様は公式ドキュメントを合わせて参照ください。

How AWS WAF Works | AWS WAF Developer Guide

  • 5分間に同じIPから指定回数を超えたリクエストがあるとトリガー
  • 条件(Condition)との組み合わせが可能
  • 条件を指定しない場合には全てのリクエストが対象

試してみた

さっそく試してみました。

ルールとACLの作成

AWS WAFのコンソールから、[Rules] -> [Create rules]へと進みます。

waf-raterule-001

[Rule type]に[Rate-based rule]が選択可能になっていますので、こちらを選びます。

waf-raterule-002

[Rate-based rule]を選択すると、[Rate limit]を指定する必要があります。これが、5分間に許容するリクエストの上限です。設定可能な最小値は2000となっています。

waf-raterule-003

ルールが作成できました。なお、今回はALBに設定したかったので、Regionをap-northeast-1に設定しました。

waf-raterule-004

この状態では、Conditionを設定していませんので、全てのリクエストが対象となります。

作成したルールを適用したACLを作成します。Ruleに一致した場合にはブロック、それ以外は許可します。

waf-raterule-005

ALCが作成できました。

動作確認

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

作成したACLの動作を確認してみます。WAFを適用したALBに対してApacheBenchでリクエストをかけてみます。

$ ab -n 3000 -c 1 http://xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com/
This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~

Concurrency Level:      1
Time taken for tests:   26.701 seconds
Complete requests:      3000
Failed requests:        0
Total transferred:      792000 bytes
HTML transferred:       15000 bytes
Requests per second:    112.35 [#/sec] (mean)
Time per request:       8.900 [ms] (mean)
Time per request:       8.900 [ms] (mean, across all concurrent requests)
Transfer rate:          28.97 [Kbytes/sec] received

~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~

設定した上限2000を超える、3000回のリクエストをかけましたが、全てのリクエストが成功しています。1分程度時間を置いて再度実行しました。

$ ab -n 3000 -c 1 http://xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com/
This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~

Concurrency Level:      1
Time taken for tests:   3.708 seconds
Complete requests:      3000
Failed requests:        0
Non-2xx responses:      3000
Total transferred:      846000 bytes
HTML transferred:       402000 bytes
Requests per second:    808.98 [#/sec] (mean)
Time per request:       1.236 [ms] (mean)
Time per request:       1.236 [ms] (mean, across all concurrent requests)
Transfer rate:          222.79 [Kbytes/sec] received

~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~

今度は、Non-2xx responsesが3000となってますので、全てのリクエストがブロックされたようです。

wgetで確認してみるとERROR 403: Forbiddenが返っていました。

$ wget http://xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com/
--2017-06-22 01:40:40--  http://xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com/
Resolving xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com (xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com)... xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx
Connecting to xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com (xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com)|xxx.xxx.xxx.xxx|:80... connected.
HTTP request sent, awaiting response... 403 Forbidden
2017-06-22 01:40:40 ERROR 403: Forbidden.

しばらく時間をおいて再度リクエストすると、

$ wget http://xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com/
--2017-06-22 01:52:38--  http://xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com/
Resolving xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com (xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com)... xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx
Connecting to xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com (xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com)|xxx.xxx.xxx.xxx|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5 
Saving to: ‘index.html’

index.html                               100%[================================================================================>]       5  --.-KB/s    in 0s

2017-06-22 01:52:38 (1.22 MB/s) - ‘index.html’ saved [5/5]

200 OKとなりましたのでブロックが解除されたことがわかります。

まとめ

AWS WAFにレートベースのルールが追加されたことで、短時間の大量アクセスに対する防御が簡単に実装可能になりました。

DDoS防御については、これまでもAWS ShieldによってL3/L4レイヤは防御されてました。今回のアップデートによりアプリケーションレイヤでもある程度の防御が可能になります。

機能が充実し、AWSのサービスだけでも防御できる範囲が広がるのはうれしいですね。