![Apache 日志文件 Fail2ban 和 WordPress](https://linux22.com/image/788778/Apache%20%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%20Fail2ban%20%E5%92%8C%20WordPress.png)
我正在尝试让 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”,并且始终在当前日期的文件上工作。我不知道日期戳后缀(假设它是日期戳)来自哪里。
这是 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 已经很好地介绍了日志文件部分,但我将回到您的目标:
我正在尝试让 Fail2ban 阻止对 WordPress 网站的暴力攻击和持续性 xmlrpc 和 wp-login 攻击。
对于此目的而言,Apache 的访问日志可能非常冗长,并且您可能会遇到配置性能问题,因为 Fail2ban 会尝试消化和分析所有日志。
有以下 WordPress 插件WP fail2ban通过创建仅记录登录失败的审计事件可以帮助解决这个问题/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
WPf2b 带有三个 fail2ban 过滤器:
wordpress-hard.conf
、wordpress-soft.conf
和wordpress-extra.conf
。它们旨在允许在立即禁止(硬)和传统更优雅的方法(软)之间进行区分,并为自定义配置提供额外的规则。