Fluentd(td-agent)とNorikraを活用したDoS対策をメディアに導入したお話

こんにちは。インフラチームの高畑です。

今回、弊社で運営しているメディアに Fluentd と Norikra を活用した DoS攻撃対策を導入したのでご紹介いたします!

導入に至った背景

これまでは Apache のモジュールである「mod_dosdetector」を利用して DoS攻撃の対策を行なっていました。

mod_dosdetector とは
同一 IP アドレスから一定回数のアクセスがあった場合に、環境変数「SuspectDoS」または「SuspectHardDoS」をセットするモジュール。
セットされた環境変数の値を使い、「mod_rewrite」で DoS攻撃と判定されたアクセスを 503 へリダイレクトさせることによりアクセスを遮断する。

しかしながら、 mod_dosdetectorApache 2.4 以上には対応していないため、最新の Apache を導入している場合などには利用ができませんでした。 また、全サーバに対してアクセス制限ができない、ファイアウォールで防げないという問題もあり mod_dosdetector の利用を諦めることになりました。

そこで、ログ収集管理ツールであるFluentdとログのストリーミング解析ができるNorikraを活用して DoS攻撃対策を行うことにしました!

Fluentd とは
全てのログをJSONとして扱うことを目的として開発されたログ収集管理ツール。
入出力のプラグインが豊富で、S3やElasticsearchなどにもログを送信することができる。
Norikra とは
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 サーバに同居させることになりました。

f:id:tkhttty:20180907113546p:plain

  1. Norikra サーバに対して各メディアのフロントサーバから Fluentd でアクセスログを送信
  2. ログを受け取った Norikra サーバは登録された SQL をもとにアクセスログを解析
  3. 検出されたイベントを Norikra サーバの Fluentd でキャッチし、各サーバに対してイベントを送信
  4. イベントを受け取った各サーバはシェルスクリプトからファイアウォールに該当 IP アドレスを登録
  5. 一定時間が経過したらアクセス制限を解除

これにより、検出された IP アドレスに対して全サーバで同時にアクセス制限をかけることが可能となりました。

おわりに

Fluentd と Norikra を組み合わせることにより、すごく手軽に DoS 対策を行うことができました。

NorikraでDoS攻撃を検知した際に Slack やメールで通知を行うこともできるので、より早く発見できるようになりました!

AWS Shield などのサービスが使えないような環境にはとてもおすすめです。