使用libModSecurity将对WordPress登录页面的访问限制为特定IP

在本教程中,我们将学习如何使用libModSecurity将对WordPress登录页面的访问限制为特定的IP。 libModSecurity也称为 ModSecurity 3.0版

ModSecurity是Trustwave的SpiderLabs开发的开源,跨平台Web应用程序防火墙(WAF)模块。它被称为WAF的“瑞士军刀”,它使Web应用程序防御者能够了解HTTP(S)流量,并提供电源规则语言和API来实施高级保护。

它具有强大的基于事件的编程语言,可提供针对Web应用程序的多种攻击保护,并允许HTTP流量监视,日志记录和实时分析。

ModSecurity可以做什么?

  • 实时应用程序安全监控和访问控制
  • 完整的HTTP流量记录
  • 持续的被动安全评估
  • Web应用强化
  • 由于它具有解析XML和应用XPath表达式的能力以及代理请求的能力,因此可以用作XML Web服务路由器。
  • HTTP协议保护
  • 实时黑名单查询
  • HTTP拒绝服务保护
  • 通用Web攻击防护
  • 错误检测与隐藏

使用libModSecurity将对WordPress登录页面的访问限制为特定IP

WordPress登录页面始终受到暴力攻击,恶意行为者始终会尝试对您的WordPress尝试使用多种身份验证凭据的任意组合,以获取对它的访问权限。

您可以使用多种方法来保护WordPress登录页面免受这些攻击,包括;

  • 启用基本的Web服务器HTTP身份验证。
  • 限制从Web服务器配置上的特定IP地址访问WordPress目录
  • 使用可屏蔽WordPress身份验证URL的插件
  • 对任何用户帐户使用非常见用户名(例如admin)
  • 等等

所有这些方法都很好。但是,您也可以使用ModSecurity保护WordPress登录页面免受这些攻击,而这正是本教程的全部内容。

安装和设置WordPress网站

好吧,您可以保护不存在的东西。因此,您需要启动并运行WordPress网站。您可以点击以下链接,了解如何在CentOS 8系统上使用Nginx和MySQL 8安装和设置WordPress网站。

在CentOS 8上使用Nginx和MySQL 8安装WordPress

在CentOS 8上安装和设置LibModSecurity

在我们的演示中,我们的WordPress在CentOS 8上运行。我们在先前的教程中还介绍了如何使用Apache或Nginx Web服务器安装和设置LibModSecurity。根据您网站托管的Web服务器的类型,请按照下面的任何链接安装WordPress。

在CentOS 8上使用Apache配置LibModsecurity

在CentOS 8上使用Nginx配置LibModsecurity

使用libModSecurity将对WordPress登录页面的访问限制为特定IP

现在您已经有了ModSecurity WAF,让我们继续进行配置,以限制从特定IP地址访问WordPress登录页面。

设置ModSecurity时,我们已经安装了OWASP ModSecurity核心规则集(CRS),它提供了一组通用的攻击检测规则。

我们在ModSecurity规则文件中指定了这些规则的位置, /etc/httpd/conf.d/modsecurity.d/rules.conf

less /etc/httpd/conf.d/modsecurity.d/rules.conf
Include "/etc/httpd/conf.d/modsecurity.d/modsecurity.conf"
Include "/etc/httpd/conf.d/modsecurity.d/owasp-crs/crs-setup.conf"
Include "/etc/httpd/conf.d/modsecurity.d/owasp-crs/rules/*.conf"

创建自定义规则以限制对WordPress登录页面的访问

创建一个自定义规则配置文件;

vim /etc/httpd/conf.d/modsecurity.d/custom.conf

创建一个规则,以允许从特定IP地址访问WordPress登录页面(URI,wp-login.php)。

见下文;

ModSecurity规则是使用 SecRule 指示。 SecRule由4部分组成:

  • 变数 –指示要查看的ModSecurity(有时称为目标)。
  • 经营者 –指示ModSecurity何时触发比赛。
  • 转变 –指示ModSecurity如何标准化变量数据。
  • 动作 –指示ModSecurity如果规则匹配该怎么办

该规则的语法为;

SecRule VARIABLES "OPERATOR" "TRANSFORMATIONS,ACTIONS"

进一步了解此内容 制定ModSecurity规则

有关配置指令,请检查 参考手册

因此,我们的规则看起来像;

SecRule REQUEST_URI "@eq /wp-login.php" 
  "chain, 
  id:'2000', 
  phase:1, 
  log, 
  pass"
  SecRule REMOTE_ADDR "@ipMatch 192.168.57.1,192.168.57.21" 
    ctl:ruleEngine=DetectionOnly

将规则分解为多个部分;

变数

  • REQUEST_URI:此变量保存完整的请求URL,包括不带域部分的查询字符串dataREQUEST_URI。例如, /wp-login.php
  • REMOTE_ADDR:此变量保存远程客户端的IP地址。如果Apache指令HostnameLookups设置为On,则可以使用 远程主机 包含通过DNS解析的远程主机名的变量。

操作员

  • @eq:执行数字比较,如果输入值等于提供的参数,则返回true
  • @ipMatch:执行REMOTE_ADDR变量数据的快速ipv4或ipv6匹配。多个地址可以用逗号分隔。

动作

  • :将当前规则与紧随其后的规则链接在一起,从而创建规则链。规则链可以模拟 逻辑与。仅当所有变量检查均返回肯定命中时,才会触发链式规则第一部分中指定的破坏性操作。
  • ID:为出现的规则或链分配唯一的ID。该值必须是数字。 1–99,999:保留供本地(内部)使用。
  • :将规则或链条放入五个可用处理阶段之一。
    • 请求标头(阶段1):首先分析请求标头。
    • 请求主体(阶段2):请求主体阶段是主要的请求分析阶段,在收到并处理了完整的请求主体之后立即进行。
    • 响应头(阶段3):响应头阶段发生在响应头可用之后,但在读取响应主体之前。
    • 响应主体(阶段4):主要的响应分析阶段。
    • 记录(阶段5):您无法阻止的唯一阶段。
  • 日志:表示需要记录规则的成功匹配。
  • 通过:尽管匹配成功,仍继续使用下一条规则进行处理。
  • ctl:在每次交易的临时基础上更改ModSecurity配置。使用此操作进行的任何更改将仅影响执行该操作的事务。 ruleEngine = DetectionOnly,为此特定规则更改ModSecurity的操作模式。

因此,基本上,该规则接受每个HTTP请求并提取等于的URI部分 wp-login.php,它会为规则分配一个唯一的ID 2001,将该规则放置在请求标头阶段,在成功匹配的情况下记录该规则,将该规则与下一个规则进行链接,继续处理下一个检查请求IP的规则地址与指定的地址匹配,如果为true,则将ModSecurity设置为仅检测(允许)模式。

创建规则以拒绝对WordPress登录页面的任何访问

接下来,您需要阻止对WordPress登录页面的所有其他访问。因此,创建一个拒绝访问的规则。将规则放在上面规则之后的同一文件中;

SecRule REQUEST_URI "@contains wp-login" "id:2001,phase:1,t:lowercase,log,deny,msg:'Warning, Access to WordPress Login page is Restricted'"

现在,我们的一般规则是:

SecRule REQUEST_URI "@eq /wp-login.php" 
  "chain, 
  id:'2000', 
  phase:1, 
  log, 
  pass"
  SecRule REMOTE_ADDR "@ipMatch 192.168.57.1,192.168.57.21" 
    ctl:ruleEngine=DetectionOnly
SecRule REQUEST_URI "@contains wp-login" "id:2001,phase:1,t:lowercase,log,deny,msg:'Warning, Access to WordPress Login page is Restricted'"

配置ModSecurity以处理自定义规则

现在我们已经准备好规则,配置ModSecurity来处理该规则。

在我们的设置中 /etc/httpd/conf.d/modsecurity.d/rules.conf 是我们的主要ModSecurity规则配置文件。

因此,我们需要在主规则文件中包含我们的自定义规则配置文件。

echo 'Include "/etc/httpd/conf.d/modsecurity.d/custom.conf"' >> /etc/httpd/conf.d/modsecurity.d/rules.conf

我们的主要规则配置文件如下所示;

less /etc/httpd/conf.d/modsecurity.d/rules.conf
Include "/etc/httpd/conf.d/modsecurity.d/modsecurity.conf"
Include "/etc/httpd/conf.d/modsecurity.d/owasp-crs/crs-setup.conf"
Include "/etc/httpd/conf.d/modsecurity.d/owasp-crs/rules/*.conf"
Include "/etc/httpd/conf.d/modsecurity.d/custom.conf"

重新启动Apache

要进行更改,请重新启动Apache;

systemctl restart httpd

测试对WordPress登录的访问权限

要验证我们的规则是否有效,只需尝试从IP地址不属于上述白名单地址的来源访问WordPress。

在我们的例子中,我们正在从IP地址为 192.168.57.22

如果一切正常,在浏览器上,您将收到此错误;

在日志上,您应该看到这样的日志条目。

tail -f /var/log/httpd/modsec_audit.log
...
---pnERTMML---A--
[11/Jul/2020:15:33:58 +0300] 159447083849.637890 192.168.57.22 48084 wp.kifarunix-demo.com 0
---pnERTMML---B--
GET /wp-login.php?redirect_to=http%3A%2F%2Fwp.kifarunix-demo.com%2Fwp-admin%2F&reauth=1 HTTP/1.1
Host: wp.kifarunix-demo.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Cookie: wordpress_test_cookie=WP+Cookie+check
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1

---pnERTMML---D--

---pnERTMML---F--
HTTP/1.1 403

---pnERTMML---H--
ModSecurity: Access denied with code 403 (phase 1). Matched "Operator `Contains' with parameter `wp-login' against variable `REQUEST_URI' (Value: `/wp-login.php?redirect_to=http://wp.kifarunix-demo.com/wp-admin/&reauth=1' ) [file "/etc/httpd/conf.d/modsecurity.d/custom.conf"] [line "8"] [id "2001"] [rev ""] [msg "Warning, Access to WordPress Login page is Restricted"] [data ""] [severity "0"] [ver ""] [maturity "0"] [accuracy "0"] [hostname "wp.kifarunix-demo.com"] [uri "/wp-login.php"] [unique_id "159447083849.637890"] [ref "o1,8v4,83t:lowercase"]
...

还有其他许多方法可以保护WordPress免受攻击。因此,阻止对wp-login.php页面的访问有助于遏制蛮力攻击。

这标志着我们指南的结尾,该指南介绍了如何使用libModSecurity将对WordPress登录页面的访问限制为特定IP。我们希望这是有益的。请享用。

Sidebar