こんにちは。インフラチームの高畑です。
今回、弊社で運営しているメディアに Fluentd と Norikra を活用した DoS攻撃対策を導入したのでご紹介いたします!
導入に至った背景
これまでは Apache のモジュールである「mod_dosdetector」を利用して DoS攻撃の対策を行なっていました。
同一 IP アドレスから一定回数のアクセスがあった場合に、環境変数「SuspectDoS」または「SuspectHardDoS」をセットするモジュール。
セットされた環境変数の値を使い、「mod_rewrite」で DoS攻撃と判定されたアクセスを 503 へリダイレクトさせることによりアクセスを遮断する。
しかしながら、 mod_dosdetector は Apache 2.4 以上には対応していないため、最新の Apache を導入している場合などには利用ができませんでした。 また、全サーバに対してアクセス制限ができない、ファイアウォールで防げないという問題もあり mod_dosdetector の利用を諦めることになりました。
そこで、ログ収集管理ツールであるFluentdとログのストリーミング解析ができるNorikraを活用して DoS攻撃対策を行うことにしました!
Norikra is an open-source Stream Processing Server with SQL.
・Schema-less event streams (called as 'target')
・SQL processing with window specifier supports, and JOINs, SubQueries
・Complex input/output events with nested Hashes and Arrays, and Query supports
・Dynamic query registration/removing, without any restarts
・Ultra fast bootstrap and small start
・UDF plugins
(公式githubより引用)
Fluentd + NorikraでDoS攻撃の対策をする
当初、 Norikra で検出されたイベントを各サーバが取りに行く構成にしようと思っていたところ、一度でもイベントを取得したらそのイベントは消え、そのほかのサーバがイベントを受け取れないという状況になりました。
そのため、下図のような構成に変更を行いイベントを受け取る Fluentd を Norikra サーバに同居させることになりました。
- Norikra サーバに対して各メディアのフロントサーバから Fluentd でアクセスログを送信
- ログを受け取った Norikra サーバは登録された SQL をもとにアクセスログを解析
- 検出されたイベントを Norikra サーバの Fluentd でキャッチし、各サーバに対してイベントを送信
- イベントを受け取った各サーバはシェルスクリプトからファイアウォールに該当 IP アドレスを登録
- 一定時間が経過したらアクセス制限を解除
これにより、検出された IP アドレスに対して全サーバで同時にアクセス制限をかけることが可能となりました。
おわりに
Fluentd と Norikra を組み合わせることにより、すごく手軽に DoS 対策を行うことができました。
NorikraでDoS攻撃を検知した際に Slack やメールで通知を行うこともできるので、より早く発見できるようになりました!
AWS Shield などのサービスが使えないような環境にはとてもおすすめです。