我正在嘗試使用 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.conf
、wordpress-soft.conf
和wordpress-extra.conf
。這些旨在允許立即禁止(硬)和傳統的更優雅的方法(軟)之間的區別,並為自訂配置提供額外的規則。