Apache ログファイル Fail2ban と WordPress

Apache ログファイル Fail2ban と WordPress

WordPress サイトに対するブルート フォース攻撃と持続的な xmlrpc 攻撃およ​​び wp-login 攻撃を Fail2ban でブロックしようとしています。

Apache のログ ファイル名に問題があります。selinux の問題を克服するのはかなり面倒でしたが、動作にかなり近づいています。

まず、ここに私のFail2Ban wordpress.confファイルがあります(jail.d内)

[wordpress]
enabled = true
usedns = no
port = http,https
filter = wordpress
banaction = firewallcmd-rich-rules
banaction_allports = firewallcmd-rich-rules

logpath = /var/www/html/site1/logs/*-access.log.*
          /var/www/html/site2/logs/*-access.log.*
          ... etc ...
maxretry = 1
findtime = 1200
bantime = 1440

これは機能していますが、「fail2ban-client status wordpress」の出力を見ると、10 個のログ ファイルがリストされており、これは無意味かつ非効率的です。サービスを再起動せずに、現在の (今日の) ログ ファイルを取得することはできません。

ちなみに、現在 43 個の IP アドレスが「現在禁止」として表示されています。

./logsフォルダ内

2023-08-23-access.log
access.log.1692835200

問題は、Apache ログ ファイルを常に「access.log」という名前にして、日付の形式にローテーションしたいということです。すると、fail2ban は「access.log」だけを見て、常に現在の日付のファイルで作業することになります。日付スタンプ サフィックス (日付スタンプであると仮定) がどこから来るのかはわかりません。

問題の原因となっている apache sites.conf ファイルのエントリは次のとおりです。

ErrorLog "|/usr/sbin/rotatelogs /var/www/html/site1/logs/error.log"
CustomLog "|/usr/sbin/rotatelogs /var/www/html/site1/logs/access.log 86400" combined

ファイルにスタンプを押すように指示しているわけではないのに、なぜそうするのでしょうか?

ログのローテーションについては、ここで説明します。 https://httpd.apache.org/docs/2.4/programs/rotatelogs.html

答え1

現在アクティブなファイル名を常に同じままにしておくことを避けるように設計されています。定義済みの間隔/条件で、一意だが予測可能なサフィックス (デフォルト) または名前パターン (文字を使用する場合) をrotatelogs使用して新しいファイルを開きます。%

訪問者数が少ないサイトでは、次の設定をお勧めします:

CustomLog "|/usr/sbin/rotatelogs -c /var/www/html/site1/logs/access.log.%Y.%m" combined 

2023 年 8 月の名前パターンを使用して、毎月新しいログ ファイルを生成します (例: access.log.2023.08.

より多くのトラフィックを生成するサイトの場合:毎日新しいログファイルを生成し(これは86400オプションで行ったことです)、

CustomLog "|/usr/sbin/rotatelogs -c /var/www/html/site1/logs/access.log.%Y.%m.%d " combined 

これにより、2023 年 8 月 24 日のような名前パターンを持つ新しいログ ファイルが毎日生成されますaccess.log.2023.08.24。(このようなパターンにより、ls -lファイルが時系列順に並べ替えられるようになり、たとえば よりもはるかに使いやすいと思います。 access.log.24082023これは個人的な好みです。)

予測可能なファイル名パターンができたので、真夜中過ぎに実行される cron ジョブを設定できます。

#!/bin/bash

basefile="/var/www/html/site1/logs/access.log"
currentlog=$(date +$basefile.%Y.%m.%d) 
rm $basefile 
ln -s $currentlog $basefile

# and you can do some maintenance here as well, like for example 
# compress the log file from a week ago
oldlog=$(date --date="1 week ago" +$basefile.%Y.%m.%d)
gzip $oldlog 

これにより、accesss_log からその日の現在のログ ファイルへのシンボリック リンクが作成されます。

fail2ban を、期待される静的ファイル名で構成すれば/var/www/html/site1/logs/access.log、すべて問題ありません。


これを望まない場合は、通常、Apache httpd を次のように構成します。

CustomLog  /var/www/html/site1/logs/access.log combined

するとApache hhtpdは常にログイベントを/var/www/html/site1/logs/access.log

しかし、ログファイルをローテーションするための外部関数を設定する必要があり、Apache httpdはファイルハンドルを開いて名前を変更してもそのファイルハンドルが閉じられない/var/www/html/site1/logs/access.logため/var/www/html/site1/logs/access.log.old-label、Apache httpdを再起動する必要があります。Apache httpdを
再起動しないと、すべてのログイベントが引き続き書き込まれ/var/www/html/site1/logs/access.log.old-label、新しいログファイルに書き込まれません。/var/www/html/site1/logs/access.log

もちろん自分でスクリプトを作成することもできますが、ほとんどの人はlogrotate車輪の再発明をするのではなく、そのために。

答え2

HBruijn はすでにログ ファイルの部分について詳しく説明していますが、私はあなたの目標に戻りたいと思います。

WordPress サイトに対するブルート フォース攻撃と持続的な xmlrpc 攻撃およ​​び wp-login 攻撃を Fail2ban でブロックしようとしています。

Apache のアクセス ログは、この目的には非常に詳細になる可能性があり、Fail2ban がそれらをすべて消化して分析しようとするため、構成によってパフォーマンスの問題が発生する可能性があります。

WordPressプラグインには次のようなものがありますWP フェイル2バンログイン失敗のみを記録する監査イベントを作成することで、この問題を解決できます/var/log/auth.log

WP fail2ban は、WordPress と fail2ban 間のリンクを提供します。

Oct 17 20:59:54 foobar wordpress(www.example.com)[1234]: Authentication failure for admin from 192.168.0.1 Oct 17 21:00:00 foobar wordpress(www.example.com)[2345]: Accepted password for admin from 192.168.0.1

wordpress-hard.confWPf2b には、、、の3 つの fail2ban フィルターが付属しています。これらは、カスタム構成用の追加ルールを使用してwordpress-soft.confwordpress-extra.conf即時禁止 (ハード) と従来のより緩やかなアプローチ (ソフト) を分割できるように設計されています。

関連情報