AWS WAFを利用して、毎日来るDDos攻撃を防ぐ環境をサクッと実装してみました。今回は簡単に設定方法をブログします。
■Protect Web Sites & Services Using Rate-Based Rules for AWS WAF
https://aws.amazon.com/jp/blogs/aws/protect-web-sites-services-using-rate-based-rules-for-aws-waf/
レートベースのルールを適用すると、同一IPアドレスからの大量リクエストをブロックできます。DDoS攻撃やブルートフォースアタックといった攻撃からの防御が簡単にできるわけです。
・5分間に同じIPから指定回数を超えるトリガー
・条件(Condition)との組み合わせが可能
・条件を指定しない場合には全てのリクエストが対象
■AWS WAF & Shield >Create rule
とりあえずruleを作成しましょう。Rate limitは2000がデフォルトなので、5分間にリクエストが来た場合に自動的にブロックしてくれます。上記のように設定してみてください。
※ちなみにRate limitは1分間で1000などのカスタマイズはできないので注意!
■Web ACLs > Create web ACL
ここでは先程作ったruleにWebACLを紐付けます。今回はconditionsの設定はデフォルトで、対処のサーバのELBを指定してるだけです。ちなみにActionをCountにすると、BlockせずにアタックしてきたIPを確認することができます。テストしてみましょう。
■Go Attack!!!
・Now status
1 2 3 4 5 6 7 8 9 |
$ curl -I -s https://hoge.jp Every 2.0s: curl -I -s https://hoge.jp Thu Aug 2 06:59:25 2018 HTTP/1.1 200 OKr Server: awselb/2.02 Date: Thu, 02 Aug 2018 08:09:08 GMTF Content-Type: text/html Content-Length: 134 Connection: keep-alive |
まずは200が返ってきています。
・AB Test!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
$ ab -n 10 -c 1 https://hoge.jp/ This is ApacheBench, Version 2.3 <$Revision: 1706008 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking hoge.jp (be patient).....done Server Software: nginx Server Hostname: hoge.jp Server Port: 443 SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128 Document Path: / Document Length: 122313 bytes Concurrency Level: 1 Time taken for tests: 2.657 seconds Complete requests: 10 Failed requests: 0 Total transferred: 1231910 bytes HTML transferred: 1223130 bytes Requests per second: 3.76 [#/sec] (mean) Time per request: 265.736 [ms] (mean) Time per request: 265.736 [ms] (mean, across all concurrent requests) Transfer rate: 452.72 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 4 4 0.2 4 4 Processing: 248 262 15.6 259 303 Waiting: 237 252 15.4 248 292 Total: 252 266 15.7 263 307 Percentage of the requests served within a certain time (ms) 50% 263 66% 263 75% 267 80% 272 90% 307 95% 307 98% 307 99% 307 100% 307 (longest request) |
ApacheBenchで3000リクエストを投げて403が返ってくればOK。ちなみにインスタンスタイプはスケールアップしました(負荷で503になってしまうため)
・curlでステータスコードを確認
1 2 3 4 5 6 7 8 9 |
$ curl -I -s https://hoge.jp Every 2.0s: curl -I -s https://hoge.jp Thu Aug 2 06:59:25 2018 HTTP/1.1 403 Forbidden Server: awselb/2.02 Date: Thu, 02 Aug 2018 08:09:08 GMTF Content-Type: text/html Content-Length: 134 Connection: keep-alive |
403になりました。
Web ACLの管理画面からBlockされてますね。数分後に自動で解除されました。
■CloudWatch x Slack
http://blog.serverworks.co.jp/tech/2016/02/16/lambda-cloudwatch-alarm-to-slack/
DDosが来ていることをCloudWatchやLambdaを利用してSlack通知すると計測ができますね。
https://github.com/RVIRUS0817/waf_block-ip
・Lambda
・IAM
・SNS
・CloudWatch
・Python 3.6.2
■まとめ
もっと細かく設定するにはconditionsで可能なので、あとで試してみたいと思います。あとはTerraform化かな。(以下書いた)
※追記
https://aws.amazon.com/jp/about-aws/whats-new/2019/08/lower-threshold-for-aws-waf-rate-based-rules/
Rate-based ルールが100リクエストから指定可能になったので良き!それとV2に推奨されてるのでみんな移行しよう!
参考:
https://techblog.recochoku.jp/4070
0件のコメント