最近因为 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/>。转载请保留此信息及相应链接。
看了你的这篇,又让我找到了点思路,刚刚又实践了一把。我发现fail2ban这东西用起来太舒服了。
我的做法是,在nginx中,对wp-login.php单独处理,将这个文件产生的日志文件,都存储到access-wp.log中(每天也有日志切割,这样这个文件中的条数肯定不会过多,分析起来速度快),然后通过写一个正则让fail2ban来监控这个文件(用原始日志文件也是可以,只是效率上不高,还是直接独立出来分析好),设定一个阀值,例如,10分钟内,同个IP,发现三次,或三次以上(即密码错误两回,即便第三次提交的密码是正确的也没用),就当即封掉该IP1个小时的时间,让其不准再访问80网页。
你这个思路不错。等我手头上的事情忙完了,也来试试这个 fail2ban。
那必须的,智能嘛,哈哈。
我现在用fail2ban这家伙,监控了SSH服务,FTP服务,WEB的401认证错误,404错误(暂时没有启用),以及刚刚添加的这个等等等。
弱弱的问一句,你监控 404 错误干嘛?
话说现在扫目录,扫文件的人还是不少的。当时也是为了折腾,就给弄起来了,现在想想理由不充分,就又关闭掉这个404监控。
唉,这个我也发现,扫目录或扫文件的人好多好多啊,精神崩溃中……
只要你已经做的比较到位,东西没乱放,就随便它咯。当做增加点人气算了,这个限制还是不做为好。
都是一些静态文件,处理起来,效率应该也高的。
唉——看不懂了。
我家里的 nas,可以很方便的设置针对ip的策略,我现在设为用户多次登录不上,永久屏蔽。
cP面板上有类似的设置吗?
我没有用面板,所以这些都得自己动手弄 —— 挺麻烦的。
好好学习,天天向上!
还没有机会用VPS 也不知道是不是有人爆破我的小博客 呵呵
呵呵,估计有,看看主机的访问统计(一般都提供的,我以前没注意这个)。似乎这种爆破也是大面积扫描的。
得赶紧看看访问日志了
嗯,我已经养成了看日志的习惯了,就是太累了。
我的后台弄得比较奇葩,加了参数验证,每天还是有50个扫描的,ip无规律且不固定,全是国外的,估计都是扫过一次换代理,关键是都是扫默认的admin账户,没办法在apache下对wp-login文件启用了.htpasswd口令认证
我感觉有些扫描其实过一遍就算了,没什么大的危害,扫就扫吧。那些针对性的扫描很危险。
这几天都有人对我的网站感兴趣~
那你可要多多留心了
引用通告: Wordpress VPS 安全防护笔记 - Tony's blog