若い男は気分を害し、復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
すべて、あなたはシャンパンを開くことができます...そして他の飲み物を味わうことができます。