最近看Cloudflare的流量分析,再对比一下Jetpack给的访客数据,总觉得Cloudflare的统计数据太过夸张:我这个破站应该没什么人看,而请求数量和独立访客数量却一直居高不下。再结合一下Jetpack那过万的爆破攻击拦截次数,用脚想都知道有攻击脚本在一直发垃圾请求。为此,我启用了Cloudflare Firewall,在首个24小时内就处理了200多次垃圾请求。

绝大多数的WordPress站点都是VPS部署,源服务器性能有限,一旦面对大量垃圾请求,轻则拖慢服务器速度,重则导致站点宕机。

了解 Cloudflare Firewall

Cloudflare Firewall(防火墙),挡在最终用户和站点源服务器之间,在接入边缘就可以过滤掉大部分垃圾请求,让正常请求通过防火墙,到达源服务器。

免费的Cloudflare套餐,可以设置5条防火墙规则。虽然只有5条,但是Cloudflare防火墙规则支持IP地址、地区、运营商、URL地址、请求方式、UA字符串、Cookie等等过滤标准,同时可以使用AND、OR逻辑关系对过滤标准进行连接,所以一条规则就可以拼接出非常复杂的过滤表达式。

一起来看看怎样创建规则来保护自己的WordPress站点吧。

首先进入Cloudflare后台,选择Firewall选项卡(中文界面选择防火墙选项卡)进入。在二级选项卡里有:

  • Overview:防火墙事件总览,这里显示最近触发防火墙拦截机制的请求。
  • Managed Rules:托管规则,免费用户可以使用由Cloudflare托管的DDoS防护规则,无需手动设置。
  • Firewall Rules:手动设置防火墙规则,免费用户最多5条。
  • Tools:更多工具,包括IP限制、请求速率限制(需付费)、UA字符串限制、指定站点URL封锁(用于保护站点的一个URL范围,仅限高级用户)。

点击Firewall Rules选项卡进入防火墙规则设置页面:

Cloudflare Firewall Rules
Cloudflare Firewall Rules 选项卡

点击蓝色按钮Create a Firewall rule进入规则创建页面:

创建Firewall Rule界面
创建规则界面

在这里,Cloudflare提供了两种方式用来创建规则:一种是表达式构造器,也就是那排下拉框;还一种是直接手动编写规则表达式,当然,这第二种方式适合专业用户的。

在表达式构造器里,构造规则的过程是:选择过滤标准、选择判断标准、输入指定值。分别对应第一个下拉框、第二个下拉框,以及紧挨着的文本框。

过滤标准非常多,包括ASN编号、Cookie、国家/地区、主机名、IP地址、Referer链接、请求方式、是否使用HTTPS、请求URL、使用的HTTP协议版本、用户代理字符串、是否是已知爬虫蜘蛛以及威胁风险评级。具体如下:

  • AS Number:互联网自治系统编号,可以简单理解为运营商或其它拥有大型网络的机构(例如云服务商)编号,公开的ASN编号在1至64511之间。
  • Cookie:请求中携带的Cookie。
  • Country/Region:请求来自的地区,用两位编码表示,如中国大陆地区是CN,香港地区是HK。
  • Hostname:请求的主机名。
  • IP Address:请求来自的IP地址。
  • Referer:Referer地址,指连接到当前地址的上一个地址。
  • Request Method:请求方式,例如GET、POST等。
  • SSL/HTTPS:是否使用HTTPS连接。
  • URI Full:完整请求地址,包含协议名、主机名、路径、查询参数(?之后部分)。
  • URI:请求地址,仅包含路径和查询参数。
  • URI Path:请求路径。
  • URI Query String:请求地址中的查询参数。
  • HTTP Version:请求使用的HTTP版本,通常为1.1或2.0。
  • User Agent:客户端的用户代理字符串,如果未经恶意修改,可用来判断客户端种类和名称。
  • X-Forwarded-For:在客户端访问服务器的过程中如果需要经过HTTP代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的IP地址,这个消息首部成为事实上的标准。(来自Mozilla开发者文档
  • Known Bots:已知的爬虫蜘蛛程序。
  • Threat Score:威胁风险等级。

判断标准包括:相等、不相等、包含、不包含、大于、小于、在某一区间内、不在某一区间内。

最终操作包括:阻止、验证码检测、自动客户端检测、允许、绕过(其它一些Cloudflare的检测机制)。

通过这些过滤标准,配合判断操作,可以生成海量的规则。

创建 Cloudflare Firewall 规则

先来看看一个简单的规则表达式:

编写Cloudflare防火墙规则
编写 Cloudflare 防火墙规则

上面这个规则里,我选择过滤标准为URI Path,判断操作为contains(包含),指定值为wp-login.php,最终执行操作为Block(阻止)。意思是当请求的地址中包含wp-login.php字样时,就拦截该请求。

注:下面的规则表达式意思是http.request.uri.path(请求路径)contains(包含)wp-login.php

这是一条简单的阻止访问WordPress登录页面的规则,所有访问该页面的请求都会被拦截,自己也没法访问,所以这条规则是行不通的。

由于国内网络用户没有独立的IP地址,所以不能像国外用户那样指定一个IP访问,其它IP全部拦截。那么可以换种方法:只允许在中国大陆境内访问登录页,其它地区的请求全部拦截。这样的话规则就要写成这样:

编写Cloudflare防火墙规则
编写 Cloudflare 防火墙规则

在上面的规则基础上,加一个AND关系,要求对wp-login.php页面的请求必须来自中国大陆地区,非中国大陆地区的请求全部阻止(“非”就是不相等的意思,也就是does not equal)。

注:下面的规则表达式意思是http.request.uri.path(请求路径)contains(包含)wp-login.php并且ip.geoip.country(IP所在地区)ne(不等于)CN(中国大陆)。

如果需要更多的阻止规则,可以接着添加OR关系:

比如说需要阻止非中国大陆地区的IP访问登录页和WordPress后台管理页,就可以这样写:

(http.request.uri.path contains "wp-login.php" and ip.geoip.country ne "CN") or (http.request.uri.path contains "/wp-admin/" and ip.geoip.country ne "CN")

由于一条规则只能执行一种最终操作,所以想要执行不同的操作就需要创建不同的规则。

接着上面,阻止规则已经拦截了非中国大陆地区IP对WordPress登录页面的请求,接下来如何处理来自大陆内部IP的攻击?

这时候可以创建一条验证码检测规则,对所有来自大陆地区的请求进行人机检测,就能拦截由自动脚本发起的攻击。规则表达式如下:

(http.request.uri.path contains "wp-login.php" and ip.geoip.country eq "CN")

验证码检测的操作选项是Challenge(Captcha),不再是Block了。这个验证码在大陆地区是由百度云加速提供的,内容是让访客识别一张图片中的字符并输入看到的字符。在海外地区是由hCaptcha提供,是类似于Google图片验证码一样的东西。

部署测试 Cloudflare Firewall 规则

编写好了的规则就可以部署了,在输入规则名称后,点击右下角蓝色按钮Deploy进行部署。这个规则是即刻就能生效的,如果需要修改规则表达式,则需要最多60秒才能生效,修改执行操作是立刻生效。

在Firewall选项卡的Overview界面上可以看到最近所有触发防火墙事件的请求,随便点击一项会展开一页详细的请求报告,是这个样子:

触发Firewall事件的请求详情
触发 Firewall 事件的请求详情

在Firewall Rules界面(本篇内容第一张插图)上会看到所有已经部署的规则以及最近24小时这些规则被触发的次数。使用Challenge(Captcha)操作的规则会有一个CSR值,这个值表示通过验证码检测的请求占所有触发该规则请求的比重。

被阻止的请求Cloudflare会返回这样一个页面给访问者:

被Cloudflare Firewall阻止的请求
被 Cloudflare Firewall 阻止的请求

好啦,一个简单的使用Cloudflare Firewall保护自己站点的教程到这里就结束了。WordPress是一个已经存在了十多年的开源系统,它的脆弱点极易成为攻击者的目标。登录页是WordPress最脆弱的部分之一,每秒钟都有无数的针对WP站点的暴力破解攻击在发生。定期修改用户名密码,使用复杂的不规则字符去组成它们;以及使用WordPress安全防护插件;还有使用类似于Cloudflare这样的Web安全防护服务,都能大大增强WP站点的安全性。

相关内容链接:

玩转 Cloudflare 网站服务🚀

发表评论

电子邮件地址不会被公开。 必填项已用*标注