使用Fail2ban保护WordPress免受暴力攻击

在本教程中,您将学习如何使用Fail2ban保护WordPress免受暴力攻击。 Fail2ban 是基于python的入侵防御工具;

监视日志文件(例如,/ var / log / auth.log,/ var / log / apache / access.log),并通过更新现有的防火墙规则来临时或永久禁止容易出现故障的地址。 Fail2ban允许轻松指定要采取的不同操作,例如使用iptables或hostdenden规则禁止IP,或仅发送通知电子邮件。

默认情况下,它带有针对各种服务(sshd,apache,proftpd,sasl等)的过滤器表达式,但是可以轻松扩展配置以监视任何其他文本文件。所有过滤器和操作均在配置文件中给出,因此fail2ban可以用于各种文件和防火墙。列出了以下建议:

  • iptables / nftables-默认安装使用iptables进行禁止。还支持nftables。您最可能需要它
  • whois-由许多mail-hohois操作使用,以发送包含有关攻击者主机的whois信息的通知电子邮件。除非您将使用那些不需要的Whois
  • python3-pyinotify-除非您通过systemd监视服务日志,否则需要pyinotify来有效监视日志文件的更改。

使用Fail2ban保护WordPress免受暴力攻击

尽管有多种保护WordPress登录名免受暴力攻击的方法,例如使用libModSecurity限制对WordPress登录名页面的特定IP的访问,但本指南将重点关注Fail2ban的使用。

安装Fail2ban

首先,在主机系统上安装Fail2ban。从一个Linux发行版到另一个Linux发行版,Fail2ban的安装有所不同。

如果您使用的是Ubuntu / Debian系统,只需运行以下命令以安装Fail2ban;否则,请执行以下步骤。

apt update
apt install fail2ban

在CentOS和类似发行版上,运行以下命令以安装Fail2ban;

dnf install epel-release
dnf update
dnf install fail2ban

配置Fail2ban以保护WordPress身份验证免受暴力攻击

首先,您需要知道Fail2ban会监视日志文件(例如/var/log/auth.log、/var/log/apache/access.log),并通过更新现有的防火墙规则来暂时或永久禁止容易出现故障的地址。 Fail2ban允许轻松指定要采取的不同操作,例如使用iptables或hostsdeny规则禁止IP…

为了有效地禁止或阻止有问题的IP地址,Fail2ban使用 jails 这基本上是各种 filtersactionsFail2ban filters 与受监视的相应日志文件中的特定模式匹配的规则,只是常规而已。罐头模式可以对应于失败的登录尝试,请求状态代码,请求URI或任何其他可疑活动。 Fail2ban actions 另一方面,定义当过滤器与指定的模式(例如可疑IP地址)匹配时执行的命令。

创建Fail2ban WordPress监狱

Fail2ban具有四种配置文件类型:

  • fail2ban.conf:Fail2Ban全局配置(例如日志记录)
  • filter.d/*.conf:过滤器,指定如何检测认证失败
  • action.d/*.conf:定义用于禁止和禁止IP地址的命令的操作
  • jail.conf:Jails定义了带操作的过滤器组合。

笔记: 建议* .conf文件保持不变,以方便升级。如果需要,应在* .local文件中提供自定义项。

复制 jail.conf 归档到 jail.local 文件;

cp /etc/fail2ban/jail.{conf,local}

接下来,编辑 jail.local 文件并在 [DEFAULT] 部分。

vim /etc/fail2ban/jail.local

我们将调整的一些参数包括:

  • ignoreip: 指定要忽略的IP地址或主机名。
  • 闲暇时间: 定义禁止主机多长时间的持续时间(以秒为单位)。默认值为600秒(10分钟)。
  • maxretry: 定义禁止a之前的失败次数。
  • 查找时间: 定义一个时间段,如果主机超过该时间段 最大尝试 值,它是被禁止的。
...
ignoreip = 127.0.0.1/8 192.168.57.33
...
bantime  = 3600
...
findtime  = 60
...
maxretry = 3

这基本上意味着,如果在一分钟内发生任何可疑活动,例如超过3次失败的登录,则除了localhost和192.168.57.33外的可疑主机将被禁止一小时。

一旦定义了上面的默认选项,就为wordpress创建一个监狱。例如,将下面的内容粘贴到上面的jail.local文件的底部;

...
# WordPress Jail
[wordpress-auths]
enabled = true
port = http,https
filter = wordpress-auth
logpath = /var/log/apache2/wp.access.log

您可以调整所有这些设置以满足您的需求!

上面的大多数选项都是不言自明的。过滤器指定了要创建的过滤器的名称 filter 在WordPress文件定义的日志文件中,用于标识WordPress登录名的日志 logpath

保存并退出文件。

创建Fail2ban WordPress登录过滤器

接下来,您需要创建一个过滤器来定义一个正则表达式,该正则表达式从指定的日志文件中过滤掉WordPress身份验证日志。

请注意,在本例中,我们使用日志文件, /var/log/apache2/wp.access.log

对于每次WordPress登录尝试, POST 请求发送到 /wp-login.php 状态码为200的文件,并将其写入Web服务器访问日志。以下是我们的登录示例日志;

tail -f /var/log/apache2/wp.access.log | grep "POST /wp-login.php"
192.168.57.33 - - [11/Mar/2021:20:18:15 +0000] "POST /wp-login.php HTTP/1.1" 200 2825 "http://kifarunix-demo.com/wp-login.php" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"
192.168.57.1 - - [11/Mar/2021:20:19:14 +0000] "POST /wp-login.php HTTP/1.1" 200 2815 "http://kifarunix-demo.com/wp-login.php" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36"

因此,在创建过滤器时,我们将使用正则表达式从日志文件中过滤掉此类日志行。

在下面的多个Fail2ban过滤器中, /etc/fail2ban/filter.d/。您可以检查其中任何一个,以了解如何创建过滤器。

创建一个WordPress身份验证过滤器。注意过滤器配置文件的名称

vim /etc/fail2ban/filter.d/wordpress-auth.conf
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php HTTP.* 200

这是我们的WordPress登录的示例failregex。

保存并退出。您可以添加更多适合您需要的过滤器。

测试Fail2ban WordPress过滤器

要验证您的过滤器是否可以匹配日志文件中的模式,请使用 fail2ban-regex 工具如下。

命令简介。

fail2ban-regex [OPTIONS] <LOG> <REGEX> [IGNOREREGEX]

因此,要测试我们的WordPress过滤器;

fail2ban-regex /var/log/apache2/wp.access.log /etc/fail2ban/filter.d/wordpress-auth.conf

样本输出显示匹配的行;

Running tests
=============

Use   failregex filter file : wordpress-auth, basedir: /etc/fail2ban
Use         log file : /var/log/apache2/wp.access.log
Use         encoding : UTF-8


Results
=======

Failregex: 10 total
|-  #) [# of hits] regular expression
|   1) [10] ^<HOST> .* "POST /wp-login.php HTTP.* 200
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [577] Day(?P<_sep>[-/])MON(?P=_sep)ExYear[ :]?24hour:Minute:Second(?:.Microseconds)?(?: Zone offset)?
`-

Lines: 577 lines, 0 ignored, 10 matched, 567 missed
[processed in 0.25 sec]

Missed line(s): too many to print.  Use --print-all-missed to print all 567 lines

这证实了过滤器工作正常。

运行Fail2ban

重新启动Fail2ban服务。请注意,它已启动并已启用,可以在安装时在系统引导上运行。

systemctl restart fail2ban

检查状态;

systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2021-03-11 20:43:32 UTC; 44s ago
       Docs: man:fail2ban(1)
    Process: 5484 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
   Main PID: 5486 (f2b/server)
      Tasks: 7 (limit: 2282)
     Memory: 11.8M
     CGroup: /system.slice/fail2ban.service
             └─5486 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Mar 11 20:43:32 ubuntu20 systemd[1]: Starting Fail2Ban Service...
Mar 11 20:43:32 ubuntu20 systemd[1]: Started Fail2Ban Service.
Mar 11 20:43:33 ubuntu20 fail2ban-server[5486]: Server ready

检查启用的Fail2ban监狱

使用以下命令检查启用的监狱 fail2ban-client status 命令。

fail2ban-client status
Status
|- Number of jail:	2
`- Jail list:	sshd, wordpress-auths

验证WordPress身份验证保护

您可以模拟对WordPress的多次身份验证失败的事件,以检查是否可能发生任何禁止行为。

拖尾日志并运行失败的登录测试时;

tail -f /var/log/apache2/wp.access.log | grep "POST /wp-login.php"
192.168.57.1 - - [11/Mar/2021:20:47:59 +0000] "POST /wp-login.php HTTP/1.1" 200 2825 "http://kifarunix-demo.com/wp-login.php" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36"
192.168.57.1 - - [11/Mar/2021:20:48:02 +0000] "POST /wp-login.php HTTP/1.1" 200 2814 "http://kifarunix-demo.com/wp-login.php" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36"
192.168.57.1 - - [11/Mar/2021:20:48:04 +0000] "POST /wp-login.php HTTP/1.1" 200 2825 "http://kifarunix-demo.com/wp-login.php" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36"

第三次失败登录后,我的IP被阻止,并在浏览器中收到此错误;

使用Fail2ban保护WordPress免受暴力攻击
检查Fail2ban禁止IP的状态

要检查被禁止的IP的状态,请使用 fail2ban-client 命令;

fail2ban-client status wordpress-auths
Status for the jail: wordpress-auths
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	3
|  `- File list:	/var/log/apache2/wp.access.log
`- Actions
   |- Currently banned:	1
   |- Total banned:	1
   `- Banned IP list:	192.168.57.10

您可以使用获取监狱列表 fail2ban-client status 命令。

检查Iptables;

iptables -L -nv
...
Chain f2b-wordpress-auths (1 references)
 pkts bytes target     prot opt in     out     source               destination         
   21  9078 REJECT     all  --  *      *       192.168.57.1         0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0

Unbanning Fail2ban禁止的IP

如果要取消IP限制,请运行以下命令;

fail2ban-client set <jail> unbanip <IP>
fail2ban-client set wordpress-auths unbanip 192.168.57.1

关于Fail2ban的更多信息。但这标志着本教程有关如何使用Fail2ban保护WordPress免受暴力攻击的指南的结尾。

进一步阅读

Fail2ban手册

其他教程

可视化ELK堆栈上的WordPress用户活动日志

在WordPress报纸主题上创建滚动文本框

如何修复WordPress无法建立与WordPress.org的安全连接

如何安装和使用WPScan WordPress漏洞扫描程序Ubuntu 18.04

Sidebar