WordPress 安全:警惕登录安全

最近因为 VPS 的资源使用统计图示中出现了很多空白时间段(via),一直在看日志寻找原因。无意中发现有不少人在攻击我的 WordPress 登录密码。于是采取了一些措施来保护我的 WordPress。

水景一页遇到的攻击情况

有人使用自动化的程序持续尝试登录我的 WordPress。在我搜查访问日志文件的时候,发现这类攻击的请求模式如下:

60.169.75.161 - - [03/Mar/2012:01:21:49 +0800] "GET / HTTP/1.1" 301 187 "-" "Mozilla/5.0 (Windows NT 6.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"
60.169.75.161 - - [03/Mar/2012:01:21:49 +0800] "GET / HTTP/1.1" 200 10760 "http://www.cnzhx.net" "Mozilla/5.0 (Windows NT 6.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"
60.169.75.161 - - [03/Mar/2012:01:21:50 +0800] "GET /wp-login.php HTTP/1.1" 200 1033 "http://cnzhx.net/" "Mozilla/5.0 (Windows NT 6.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"
60.169.75.161 - - [03/Mar/2012:01:21:50 +0800] "POST /wp-login.php HTTP/1.1" 200 1409 "http://cnzhx.net/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"

可以发现,前 2 行访问显示出,该自动程序使用 www.cnzhx.net 来访问我的网站。可是我一直都使用 cnzhx.net 做为网站首页地址的。这充分说明它的攻击不是单单针对水景一页的。

因为对密码的尝试使用了 POST 方法,使用下面的语法可以慢慢查看 access.log 网站访问日志文件:

grep "POST /wp-login.php" *access.log | less

因为我的日志使用了 rotatelog 进行分割了,上面使用通配符 * 来匹配目录中的所有 access 日志。

然后发现可以从策略上将其分为两类:

  • 一类是短期内快速发送多个登录请求。这一点也许可以通过在 iptables 中设置单 IP 建立的速率限制,起到一点点降低攻击速度的作用。
  • 另一类比较麻烦,模拟正常访问进行慢速攻击。典型的例子就是,一位来自安徽芜湖电信(上面例子中的 IP)的朋友,每隔 1~2 分钟发送一次登录请求。但是这伙计非常有耐心。从我保留的日志来看,暴力破解至少持续了一个月。每天都有几次,每次持续好几个小时。所以算起来已经尝试了很多很多次了。

 采取的防范措施

我觉得采取的措施可以有下面三级。

1、复杂的密码 – 推荐

对付针对登录密码的攻击,最有效的手段就是使用超级复杂的密码了。

非常幸运的是,我的 WordPress 登录密码又臭又长,我自己都懒得记,也懒得一个字符一个字符的输入。每次都是复制粘贴进去。我相信,这样的密码对暴力破解来说肯定是噩梦。

当然,也可以使用密码管理软件,或者直接用浏览器的记录密码功能。目前我还不打算使用专门的密码管理软件,没有那个必要。

这事儿也说明,所有的网络服务的登录密码都设置得复杂一些还是很有必要的。不怕记不住,可以复制粘贴嘛。

2、使用验证码 – 推荐

经常在登录各种系统的时候被要求输入验证码,烦透了。所以我尽量不在自己的网站上搞这样的玩意儿。到目前为止,除了垃圾留言比较多之外,也没发现别的问题。今天不同了,密码啊,当然不能给别人猜了出来。

密码够复杂的话实际上不需要验证码这玩意儿了,不过装一个更保险。也可以捎带保护注册用户,他们的密码就不一定复杂了。

WordPress 插件库里有很多提供验证码功能的插件,使用关键词 Captcha 一搜一大把。比较了半天,我最终选了这个 SI CAPTCHA Anti-Spam,安装之后,让它只在注册和登录页面起作用。

另外有个名字叫做 Captcha 的也很好,非常简洁明了,跟这个不相上下吧,不过我担心它很容易被智能程序搞定,所以没用。还有个 Really Simple CAPTCHA 也挺不错,一个日本人开发的,可是配置起来不够方便。

3、使用 WordPress 登录保护插件 – 推荐

在 WordPress 的插件中心提供了 2 个保护 WordPress 登录的插件,可以自动对登录的错误次数进行记录并采取保护措施。这个插件可以更方便的阻止暴力破解密码的攻击。

  • Login Lock(该插件已废弃) – 这一款似乎更受大家欢迎。功能包括:增强的密码策略;紧急锁定登录功能;监控登录尝试;封锁攻击者 IP 地址;登录用户空闲一段时间之后自动注销登录等。
  • Simple Login Lockdown – 更简单,正如其名。提供的保护就是自动封禁错误登录的 IP 一段时间:有人尝试登录并失败 ——> 该插件记录登录失败的次数 ——> 超过设定的次数(默认 5 次)后,在一段时间内(默认 1 小时)禁止该 IP 地址打开登录页面 wp-login.php

下面的方法仅适用于 VPS 或独立服务器用户:

4、使用 fail2ban 自动分析访问日志

荣斌提供了另一个方案,就是配合 VPS 上的日志记录,使用 fail2ban 来分析日志并完成自动封锁该 IP 的访问。

具体思路见文后的评论

5、iptables 设置

可以有 2 个思路:一是限制发起连接的速度,针对前面提到的第一类暴力破解攻击;二是,如果攻击者是固定 IP 的,并且持续攻击(比如上面例子里的那个),我选择的做法是直接 BAN 掉该 IP,永远不让它访问我的网站了。

在 ACCEPT HTTP 访问之前插入一条:

iptables -I INPUT 1 -s 123.123.123.123 -j DROP

暂时我能想到的就这么多了,朋友们有什么好的建议,不妨多扔一些过来。嗯,如果你还没有留心这类攻击,不妨回去查查日志 :D©

本文发表于水景一页。永久链接:<https://cnzhx.net/blog/prevent-brute-force-wordpress-login-pw/>。转载请保留此信息及相应链接。

20 条关于 “WordPress 安全:警惕登录安全” 的评论

  1. 看了你的这篇,又让我找到了点思路,刚刚又实践了一把。我发现fail2ban这东西用起来太舒服了。

    我的做法是,在nginx中,对wp-login.php单独处理,将这个文件产生的日志文件,都存储到access-wp.log中(每天也有日志切割,这样这个文件中的条数肯定不会过多,分析起来速度快),然后通过写一个正则让fail2ban来监控这个文件(用原始日志文件也是可以,只是效率上不高,还是直接独立出来分析好),设定一个阀值,例如,10分钟内,同个IP,发现三次,或三次以上(即密码错误两回,即便第三次提交的密码是正确的也没用),就当即封掉该IP1个小时的时间,让其不准再访问80网页。

  2. 我现在用fail2ban这家伙,监控了SSH服务,FTP服务,WEB的401认证错误,404错误(暂时没有启用),以及刚刚添加的这个等等等。

      • 话说现在扫目录,扫文件的人还是不少的。当时也是为了折腾,就给弄起来了,现在想想理由不充分,就又关闭掉这个404监控。

          • 只要你已经做的比较到位,东西没乱放,就随便它咯。当做增加点人气算了,这个限制还是不做为好。

            都是一些静态文件,处理起来,效率应该也高的。

  3. 唉——看不懂了。
    我家里的 nas,可以很方便的设置针对ip的策略,我现在设为用户多次登录不上,永久屏蔽。
    cP面板上有类似的设置吗?

  4. 还没有机会用VPS 也不知道是不是有人爆破我的小博客 呵呵

    • 呵呵,估计有,看看主机的访问统计(一般都提供的,我以前没注意这个)。似乎这种爆破也是大面积扫描的。

  5. 我的后台弄得比较奇葩,加了参数验证,每天还是有50个扫描的,ip无规律且不固定,全是国外的,估计都是扫过一次换代理,关键是都是扫默认的admin账户,没办法在apache下对wp-login文件启用了.htpasswd口令认证

    • 我感觉有些扫描其实过一遍就算了,没什么大的危害,扫就扫吧。那些针对性的扫描很危险。

  6. 引用通告: Wordpress VPS 安全防护笔记 - Tony's blog

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)