Fail2ban [incremental]:より良く、より速く、より信頼できる

fail2banイメージ

ハブを含め、fail2banについて多くのことが書かれています この記事では、もう少し-保護をさらに信頼性の高いものにする方法と、広く知られているまだ新しいfail2ban機能について少し説明します。 すぐに追加します-開発ブランチについてお話しますが、長い間戦闘で既にテストされています。



簡単な紹介



ほとんどの場合、fail2banは配布キットからインストールされ(通常は何らかの安定した古いバージョンです)、数分でインターネットからのマナに従って構成されます。 その後、管理者の介入なしで何年も機能します。 多くの場合、fail2banが続くように見えるログも表示されません。

だから、私は私の友人の1つのサーバーで起こったケースによってこの投稿を書くように促されました。 ジャンルの古典-アブサが来て、2番目が続いて行きました。 まあ、攻撃者も怠gotでした-彼はログをこすりませんでした、そして彼はlogrotateがログを数ヶ月間保存するように設定されていたのでさえ幸運でした



それはかなり当たり前のことでしたが、彼の管理メールのパスワードを取得しました。これはsshのパスワードでもありました(当然キーなし)。 ルートではなく、sudoer、それが意味するすべてのもの。 彼の最初の質問は:それを拾う方法-私はそこにfail2banがあります。 そして、ここに待ち伏せがあります。今日、それが個々のコンピューターではなく、パスワード選択に関与しているボットネット全体を想像しているわけではありません。 そのため、ログからまさにこれが当てはまることがわかりました。ボットネットをソートしていましたが、実際にはfail2ban(maxRetry = 5、findTime = 600およびbanTime = 600)で設定を見つけました。 つまり 禁止を回避するために、ネットワークは各IPから10分以内に4回試行しました。 ネットワーク上で1分間、約1万個の一意のIP = 1日あたり500万個以上のパスワード。

さらに、彼のメーラーは多くの愚かさをしました-すなわち、間違った名前でログインして、最大10秒の休止。 つまり adminを含むいくつかの名前が実際に存在することを確認するために、このグリッドは難しくありませんでした。 次は、既存の名前のパスワードのみの集中的な列挙でした。

「修理」について詳しくは述べません。これは長い話であり、一般的には別の記事のトピックです。 私は彼らがすべてをきれいにし、すべてが少しの血で解決されたとしか言えず、彼はほとんど「わずかな」恐怖で逃げました。



だから、記事を書くというアイデアは、私が(当然のことながら)当然のことと言われた後に生まれました。「あなたはこのことを知っていて、何も言わず、警告しませんでした。 はい、解決策があり、共有しませんでした。 まあ、あなたはろくでなし。」 要するに、ポストはそうであることになっています。



私のfail2ban



私は「私の」サーバーのセキュリティを非常に真剣に考えています。 さらに、fail2banは常に非常にカスタム化されており、そこに多くのことを監視しています。 ハードウェアをボットネットの制御下に置くことができる愚かな灰色の塊のため、保護のために多くの時間を費やさなければならないこと(そして、その継続的なメンテナンスと監視)は本当に私を怒らせます。 ところで、この制御を最小限に抑えるために、私はfail2banおよびその他のセキュリティプロジェクトの開発に積極的に関与しています。



したがって、私の最後の拡張バージョン[sebres:ban-time-incr]を使用すると、この厄介な動物園を一度(すべて、または順応するまで)引き出すことができます。 この機能はコミュニティ全体でよく議論されましたが、どういうわけか手が届きませんでした。 独立したスクリプトといくつかのカスタム変更の形で、既成の機能に形が変わるまで生き続けました。



要するに、システムは不正なIPアドレスを記憶しているため、毎回、以前の禁止の数(banCount)に応じて禁止時間(banTime)を動的に(指数関数的に)増やすことができます。 同時に、毎回、次の禁止への失敗する可能性のある試行(失敗)の数(maxRetry)も減らします。 これは、次の例で明らかにわかります。
[クリックしてログを表示]
2014-09-23 20:05:31,146 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (10 # 5 days, 8:04:55 -> 2014-09-29 04:10:24) 2014-09-23 20:05:31,120 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-23 20:20:29) 2014-09-23 15:30:32,625 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-20 23:24:14,620 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (9 # 2 days, 16:06:18 -> 2014-09-23 15:30:31) 2014-09-20 23:24:14,569 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-20 23:39:13) 2014-09-20 21:10:36,708 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-19 13:03:03,377 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (8 # 1 day, 8:07:34 -> 2014-09-20 21:10:36) 2014-09-19 13:03:03,361 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-19 13:18:02) 2014-09-19 12:38:17,743 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-18 20:13:23,647 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (7 # 16:24:55 -> 2014-09-19 12:38:17) 2014-09-18 20:13:23,620 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-18 20:28:22) 2014-09-18 20:07:06,053 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-18 12:03:53,282 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (6 # 8:03:14 -> 2014-09-18 20:07:05) 2014-09-18 12:03:53,266 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-18 12:18:51) 2014-09-18 11:22:40,704 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-18 07:11:12,200 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (5 # 4:09:43 -> 2014-09-18 11:20:54) 2014-09-18 07:11:12,160 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-18 07:26:11) 2014-09-18 06:47:46,618 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-18 04:37:29,972 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (4 # 2:02:16 -> 2014-09-18 06:39:44) 2014-09-18 04:37:29,967 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-18 04:52:28) 2014-09-18 04:32:49,491 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-18 02:55:05,706 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (3 # 1:23:31 -> 2014-09-18 04:18:35) 2014-09-18 02:55:05,698 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-18 03:10:04) 2014-09-18 01:18:37,976 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-18 00:40:09,592 fail2ban.observer [named-refused] Increase Ban XXX.XXX.XX.XXX (2 # 0:38:30 -> 2014-09-18 01:18:37) 2014-09-18 00:40:09,548 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-18 00:55:07) 2014-09-17 22:47:05,872 fail2ban.actions [named-refused] Unban XXX.XXX.XX.XXX 2014-09-17 22:32:05,804 fail2ban.actions [named-refused] Ban XXX.XXX.XX.XXX (_ # 0:15:00 -> 2014-09-17 22:47:05)
      
      





ここでは、次の各禁止がブロック時間を最初の15分(0:15:00)から10ブロック後の5プラス日(5日、8:04:55)まで延長する様子がはっきりと見えます。 私のデータベースには、すでに「期限」が設定されたIPがあります-数ヶ月から永久に禁止されています。



以下に、新しい機能がIP XXX.XXX.XX.XXXを禁止する決定にどのように影響したかを示します。 この例では、maxRetryパラメーターは5に設定されています。したがって、IPが不良として認識されるまで、5回の試行後初めて禁止され、2回目は既に不良として禁止されました。3回後(各試行は2回としてカウント)など -2回後(3回試行)、最初の試行の直後に4回禁止されます(5回すぐにカウントされます)。

[クリックしてログを表示]
 2014-09-18 04:37:29,155 fail2ban.observer [named-refused] Found XXX.XXX.XX.XXX, bad - 2014-09-18 04:37:28, 3 # -> 5, Ban 2014-09-18 04:37:29,148 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-18 04:37:28 ...... 2014-09-18 02:55:04,790 fail2ban.observer [named-refused] Found XXX.XXX.XX.XXX, bad - 2014-09-18 02:55:04, 2 # -> 3, Ban 2014-09-18 02:55:04,763 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-18 02:55:04 2014-09-18 02:22:37,683 fail2ban.observer [named-refused] Found XXX.XXX.XX.XXX, bad - 2014-09-18 02:22:37, 2 # -> 3 2014-09-18 02:22:37,648 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-18 02:22:37 ...... 2014-09-18 00:40:08,908 fail2ban.observer [named-refused] Found XXX.XXX.XX.XXX, bad - 2014-09-18 00:40:08, 1 # -> 2, Ban 2014-09-18 00:40:08,625 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-18 00:40:08 2014-09-17 23:48:54,404 fail2ban.observer [named-refused] Found XXX.XXX.XX.XXX, bad - 2014-09-17 23:48:53, 1 # -> 2 2014-09-17 23:48:54,397 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 23:48:53 2014-09-17 22:49:04,647 fail2ban.observer [named-refused] Found XXX.XXX.XX.XXX, bad - 2014-09-17 22:49:03, 1 # -> 2 2014-09-17 22:49:04,620 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 22:49:03 ...... 2014-09-17 22:32:05,593 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 22:32:05 2014-09-17 22:06:29,952 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 22:06:29 2014-09-17 21:47:43,439 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 21:47:42 2014-09-17 20:43:41,490 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 20:43:40 2014-09-17 16:44:35,130 fail2ban.filter [named-refused] Found XXX.XXX.XX.XXX - 2014-09-17 16:44:34
      
      





失敗を数えるこの論理がなければ、スマートボットネットは禁止に陥らないように作業を微調整することを学びました。 このロジックを完成させて本番環境に展開すると、数日のうちにログで何年も目にしていた実質的にすべての悪を取り除きました。 たとえば、現在のauth.logの通常の1日あたりの平均ゲインは20〜50行程度ですが、一部のサーバーでは数百および数千倍になりました。



これまでのところ、これは開発ブランチであり、プルリクエストがあり、リリースはこれまでのところバージョン0.9.2で計画されています。

興味がある場合は、ここでソリューションの実装と履歴について読んでください-sebresによる禁止時間の増加・プルリクエスト#716・fail2ban / fail2ban



ただし、このバージョンはサーバー上で更新されますが、リリースがメインラインでリリースされるまで、ディストリビューションに反映されるまでに多くの時間がかかります...たとえば、同じdebianはまだ0.8.xを使用しているため、この記事が理由です。 だから、手を振って、設定...利益。



このバージョンをfail2ban-ban-time-incr.zip (sebres masterブランチ)で入手してください。

debian-sのポート: ban-time-incr-debian.zip (マスターdebianブランチをマージしましたが、メインラインではありません-可能であればブランチを最新の状態に保つようにします)。



インストールは非常に簡単です。 既に配布キットからfail2banがインストールされている場合は、古い「fail2ban.local」と「jail.local」を「/ etc / fail2ban /」から保存します(まあ、古い「fail2ban.conf」と「jail.conf」の方が優れています) ) 念のため(フィルターとアクションの個人的な変更の可能性があるため)、ディレクトリ全体「/ etc / fail2ban /」をどこかに保存します。



次に、たとえば次のように、古いfail2banディストリビューションを破棄します。
 sudo service fail2ban stop sudo apt-get remove fail2ban
      
      





インストール自体:
 cd /tmp unzip ~/downloads/fail2ban-ban-time-incr.zip cd fail2ban-ban-time-incr/ sudo python setup.py install
      
      





[UPD]いくつかのディストリビューションでは、手動インストール中に何らかの理由でサービスがインストールされないことがあります(たとえば、 fail2ban-client start



ファイルがありません)。したがって、サービスを介してfail2ban-client start



のみを介して(自動)起動しません。
[何をすべきか...]
これは、たとえば、配布キットまたはアーカイブからコピーすることで修正できます(権限を修正することを忘れないでください)。
 cd /tmp/fail2ban-ban-time-incr-debian sudo cp /etc/init.d/fail2ban ~/init.fail2ban.org sudo cp ./files/debian-initd /etc/init.d/fail2ban chmod u+x,g+x,o+x /etc/init.d/fail2ban
      
      



また、fail2ban-client( which fail2ban-client



)へのパスの内部を確認しwhich fail2ban-client





- /usr/local/bin/fail2ban-client



DAEMON=/usr/local/bin/$NAME-client





- /usr/bin/fail2ban-client



DAEMON=/usr/bin/$NAME-client





サービスの起動を確認することを忘れないでください(update-rc.d、rcconf、file-rc ...お好みのものに置き換えてください)。

[/ UPD]



次に、新しい機能を動作させるために、オプションを追加する必要があります: bantime.increment = true



jail.local in [default](または特定のjailごと)。 例と説明は、まだ「 jail.conf 」にあります。

ここに簡単なものがあります:



サンプル中または本番中に(良い)IPが偶発的に禁止に飛び込んだ(そして、それに応じて不正になった)場合、最後の禁止とdbpurgeage(fail2ban.localにある)の3回後に忘れられます(再び「白」になります) 、または以下を使用して彼の手から禁止を解除する場合:
 fail2ban-client set $JAIL unbanip $IP
      
      





fail2ban-regexを使用してレギュラーをテストし、パフォーマンステストのために次のようなものを使用します。
 logger -t 'test:auth' -i -p auth.info "pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser=admin rhost=1.2.3.4"
      
      





開始を忘れないでください:

 sudo service fail2ban start
      
      





以上で、サーバーがもう少し安全になったことを願っています。 さて、怠けずにログを見てください(信頼してください、しかし確認してください)。



PS標準追記:Fail2Banは、有用であることを期待して配布されていますが、いかなる保証もありません。 要するに-あなたの健康を使用しますが、あなた自身の危険とリスクで...

そしてあなたのサーバーが安全であるかもしれません。



PPSはい、私はほとんど忘れていました。ここで何かを終える予定です。何かはすでに準備ができています。あなたは普通にそれを作成し、それを出す必要があります。



All Articles