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©

本文发表于水景一页。永久链接:<http://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. 我的后台弄得比较奇葩,加了参数验证,每天还是有50个扫描的,ip无规律且不固定,全是国外的,估计都是扫过一次换代理,关键是都是扫默认的admin账户,没办法在apache下对wp-login文件启用了.htpasswd口令认证

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

雁过留声,人过留名

您的邮箱地址不会被公开。 必填项已用 * 标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南
您可以在评论中使用如下的 HTML 标记来辅助表达: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>