DDoSとの戦いの実際のエピソード

ある若い男性は、テーマのあるリソースを誓うのがとても好きでした。 このため、彼は定期的に禁止されました。 そして、彼らは一度取り、禁止を解除しませんでした。



若い男は気分を害し、復venすることにしました。 お金を貯めて、それを取り、DDoSリソースを注文しました。 幸いなことに、これはロシア連邦の犯罪者ではなく、残念なことに、罰すべき行為です。



若者がなんとか蓄積したDDoSは、ボットの軍隊に同じHTTPリクエストを送信することにありました。



いつものように、うるさい管理者にとっては、HTTPログを読み取り、禁止する必要のあるアドレスを提供するだけの満足のいく解決策はありませんでした。

したがって、私はこれとこれらの非常に独自のlunaparkを構築する必要がありました。 Kamrad メタキーは、IPを禁止に割り当てる実際のロジックを作成し、謙虚な使用人が残りのバインディングを設定しました。



(おそらく)オリジナルのヘミングウェイを読んだ人はすぐにここ行くことができます 。 そこでもコードを見つけることができます。







残りすべてと怠け者のために-私はここから続けます。 申し訳ありませんが、写真はありません。 しかし、すべてが事実です...



log2ban





log2banの仕組み




ボットを検出するために、サーバーへの各リクエストには、リクエストプロパティ(たとえば、IPアドレスとURL:「1.2.3.4/login.php」)からの識別子が付けられます。 特定のIDを持つ呼び出しの数が設定された制限に達すると、検出時間ウィンドウ内で、クライアントIPが引数として外部コマンド(BAN_IP_COMMAND)に渡されるか、パケットブロッキングのために収集されます(「ブロッキングリスト」を参照)。



Log2banはサーバーログに対してリアルタイムで機能し、ログアーカイブアナライザーとして使用することを意図していません。 ファイアウォールツールを使用して、ブロック自体を実行する必要があります(この例では、ipsetの設定とスクリプトが添付されています)。



スクリプトは、構成に示されているように、たとえば「tail -f」または同様のコマンドを使用して、ログをリアルタイムで読み取ります。 コマンドがEOFを送信すると、log2banは終了します。 コマンドがログエントリの標準出力への書き込みを停止すると、log2banプロセスは永久にハングします。



カスタマイズ




デフォルトでは、Apache / Nginxログテンプレートがサポートされています。 フォーマットに加えられた変更は、変数ACCESS_LOG_RECORD_FORMATに反映される必要があります。



検出ルールを構成することもできます。 最も重要なパラメーターはTOLERANCE_MARGIN(ウィンドウ内のヒット数)です。 2番目に重要なのは、WINDOW_SIZE(スロット内のウィンドウサイズ)とSLOT_INTERVALです。 (スロットサイズ(秒))間隔を短くしてサイズを大きくすると、検出が向上します(パフォーマンスが低下します)。



IDの計算ルールを変更するには、create_server_hit_id関数を変更します。



ログの行をスキップするためのルールを変更するには、スキップ機能を変更します。 デフォルトでは、静的ファイルタイプのリクエストは無視されます。



リストのブロック




リストのロックを使用するには、データベースをオンにし、しばらくログを処理してから実行します



python log2ban.py print (banned | allbanned)







収集されたIPアドレスを標準出力に出力します。 「禁止」は、新しいIPアドレスのみを印刷します(最後に印刷が禁止されたため)。「禁止」は、以前に印刷されたかどうかにかかわらず、禁止されたすべてのIPを印刷します。



数日後、それらのリストを取得するためにIPアドレスは禁止されなくなります:



python log2ban.py print (unbanned)







このコマンドは、current_time-DAYS_UNBANの期間中に禁止されたすべてのIPを出力し、データベースからレコードを削除します。



性能




log2banはそれ自体で十分に高速ですが、非常に急速に成長するログの場合、クエリ処理が問題になる可能性があります。 画像、スクリプト、スタイルシートなどの静的リソースのリクエストの登録を無効にすることを検討してください。 さらなる最適化には、デフォルト形式を使用する代わりに、より単純なログ形式(CSV)が含まれる場合があります。これは、正規表現を通じてapachelogモジュールによって処理されます。



インストールとファイアウォールの統合





このプロセスはDebian Squeeze 6.0で説明されていますが、他のディストリビューションでは異なる場合があります。



ipsetをインストールします。



sudo apt-get install module-assistant xtables-addons-source

sudo module-assistant prepare

sudo module-assistant auto-install xtables-addons-source

depmod -a









動作することを確認してください。

ipset -L









空でない回答、たとえば「モジュールip_setが見つかりません」というエラーを受け取った場合、ipsetは正しくインストールされていません。 特定のインストールに関するこの問題の解決策については、Googleをご覧ください。 一般的な考え方は、ip_setカーネルモジュールをローカルでコンパイルし、カーネルにロードする必要があるということです。



MongoDB、Python、およびPIPをインストールします。





sudo apt-get install mongodb python-pip









Python用のモジュールをインストールします。



sudo pip install apachelog pexpect pymongo









log2banリポジトリのクローンを作成します。



git clone git://github.com/unicodefreak/log2ban.git









log2ban.pyファイルで、必要に応じて次のコマンドを構成します。



ECHO_LOG_COMMAND = "tail -f /var/log/nginx/access.log"









/etc/logrotate.d/nginxに次のテキストを追加します。



/var/log/nginx/*log {

daily

rotate 10

missingok

notifempty

compress

sharedscripts

postrotate

[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`

/etc/init.d/log2ban stop

/etc/init.d/log2ban start

endscript

}









スクリプトをインストールする



sudo mkdir /opt/log2ban

sudo cp log2ban/log2ban.py /opt/log2ban/

sudo cp log2ban/ipset-control.sh /opt/log2ban/

sudo cp log2ban/init-scripts/log2ban-debian.sh /etc/init.d/log2ban

sudo chmod +x /etc/init.d/log2ban

sudo chmod +x /opt/log2ban/ipset-control.sh









MongoDBを起動します

sudo /etc/init.d/mongodb start









log2banを実行する



sudo /etc/init.d/log2ban start









ルートcronスクリプトに次のコマンドを追加します。たとえば、5分ごとにアドレスを更新します

*/5 * * * * /opt/log2ban/ipset_control.sh update









しばらく動作させてください。 ブロックされているIPがあるかどうかを確認します。

sudo ipset -L









リストが真実のように見える場合、最後のステップは残っています-iptablesを接続します。



行を追加します。



-A INPUT -m set --match-set autoban src -j DROP







/etc/firewall.confファイルに実行します



sudo /etc/init.d/networking restart









すべて、あなたはシャンパンを開くことができます...そして他の飲み物を味わうことができます。



All Articles