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”,并且始终在当前日期的文件上工作。我不知道日期戳后缀(假设它是日期戳)来自哪里。

这是 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.confwordpress-soft.confwordpress-extra.conf。它们旨在允许在立即禁止(硬)和传统更优雅的方法(软)之间进行区分,并为自定义配置提供额外的规则。

相关内容