お久しぶりにH2Oネタなのですが、このブログにDDos対策による設定を追加してみました。
NginxだとRate Limitingであるngx_http_limit_req_moduleを使って設定できるのですが、
もちろんH2Oでも可能です。mrubyなのでちゃちゃっと導入してみましょう!!
■Configure > Using DoS Detection
https://h2o.examp1e.net/configure/dos_detection.html
Basic Usage
Below example uses the mruby script to detect DoS attacks. The default detecting strategy is simply counting requests within configured period. If the count exceeds configured threshold, the handler returns a 403 Forbidden response. Otherwise, the handler returns a 399 response, and the request is delegated internally to the next handler.
(訳)
mrubyスクリプトを使用してDoS攻撃を検出します。 構成された期間内の要求をカウントすることができて、しきい値を超えた場合ハンドラは403 Forbidden応答を返します。 それ以外の場合、ハンドラは399応答を返し、内部的に次のハンドラに委譲されます。
IPアドレスベースで一定期間BANしてくれる!
■enviroments
1 2 3 4 5 6 7 8 9 10 |
# tree h2o h2o ├── conf.d │ ├── adachin.me.conf │ ├── adachin.server-on.net.conf │ └── blog.adachin.me.conf ├── h2o.conf └── mruby ├── dos_detector.rb #追加 └── htpasswd.rb |
・dos_detector.rb
https://github.com/h2o/h2o/blob/master/share/h2o/mruby/dos_detector.rb
上記のmrubyスクリプトを配置します。
■blog.adachin.me.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
~省略~ "blog.adachin.me:443": listen: port: 443 ssl: certificate-file: /etc/letsencrypt/live/blog.adachin.me/fullchain.pem key-file: /etc/letsencrypt/live/blog.adachin.me/privkey.pem paths: "/": mruby.handler: | #ここから追記 require "dos_detector.rb" DoSDetector.new({ :strategy => DoSDetector::CountingStrategy.new({ :period => 60, :threshold => 300, :ban_period => 300, }), }) #ここまで file.dir: /var/www/wordpress ~省略~ |
デフォルトでも良さそうですが一分間に300リクエスト来たら300秒間BANするように追記しました。
■Test BAN
実際に10秒間に3リクエストしたらBANするようにテストしてみましょう(ほぼ403で見れないww)
危険なのでちゃんとiPhoneのWifiはオフります。
ちゃんと動いてるのでOK!!
■まとめ
オプションのcallbackでアラート飛ばしたりログ吐かせたりカスタマイズできるみたいですね。
fail2banでよく設定したけどH2Oの設定でいらんな…しかし簡単!!皆さんもお試しあれ!!
ワロタ。ブログアクセスしまくったら403になったw 効果は抜群だ!
— adachin?SRE (@adachin0817) September 22, 2018
設定しくじるとこうなるのでうまく調整しましょう!!w
0件のコメント