Apache 日誌檔 Fail2ban 和 WordPress

Apache 日誌檔 Fail2ban 和 WordPress

我正在嘗試使用 Fail2ban 來阻止 WordPress 網站上的暴力破解和持久 xmlrpc 和 wp-login 攻擊。

我對 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”,並且將始終在當前文件上工作。我不知道日期戳字後綴(假設它是日期戳記)來自哪裡。

這是 apachesites.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 已經很好地涵蓋了日誌檔案部分,但我會回到你的目標:

我正在嘗試使用 Fail2ban 來阻止 WordPress 網站上的暴力破解和持久 xmlrpc 和 wp-login 攻擊。

為此,Apache 的存取日誌可能非常詳細,並且您可能會面臨設定的效能問題,因為 Fail2ban 會嘗試消化和分析所有這些日誌。

有 WordPress 插件,例如WP 故障2禁止這可以透過建立僅記錄登入失敗的審核事件來幫助解決此問題/var/log/auth.log

WPfail2ban提供了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

WPf2b 隨附三個fail2ban 過濾器:wordpress-hard.confwordpress-soft.confwordpress-extra.conf。這些旨在允許立即禁止(硬)和傳統的更優雅的方法(軟)之間的區別,並為自訂配置提供額外的規則。

相關內容