404Hack

今天遭遇来自自己的404攻击,网站从早上开始流量巨大,响应迟缓。我们上午到达工作岗位的时候,首页已经难以打开。于是立即远程登录服务器,检查Web服务器工作状态——CPU占用正常,内存占用低;又检查数据库服务器和图片服务器,发现工作状态良好。于是重启Web服务器,首页响应速度马上提高,于是很满意,以为问题解决。

中午吃完饭,突然接到来自数据中心机房的电话,说我们的服务器占用带宽超出流量限制,叫我们考虑是否购买额外的带宽。我们大吃一惊,因为几天以前我们检查还发现平均带宽使用率仅30%左右,峰值使用也没有超出限额。另一方面,服务器又慢如蜗牛。看来问题并没有解决,立即开始重新排查。

从数据中心发来的最近一天的带宽使用统计图上,我们的带宽曲线就像被生硬地抬高了一大截,超出了限制。第一反应就是,遭到攻击了。登录服务器查看Web访问日志文件,居然高达二点几GB,错误日志更是达到4GB而自动分割。难道真是遭到攻击了?决定马上分析日志文件,找出攻击的源头,并封禁攻击者的IP。

巨大的日志文件被压缩打包并准备下载——因为服务器端没有分析工具——但这个下载的过程是很缓慢的。另一方面,我们开始分析可能的攻击类型。第一个被排除的是ping攻击,因为那是一种很原始的攻击方法,并且攻击者自己也不好受(有多少数据发来,就有多少数据返回)。我们用tcpdump监测服务器的数据包,发现绝大多数数据包都是走tcp80端口的,只有极少数数据包走了22端口(ssh,我们远程登录用的端口)。

为了查出谁是罪魁祸首,我们决定监测30秒80端口的数据包,看看他们都来自哪里,流向何方。30秒我们抓到了70000+数据包——那几乎是我们服务器带宽的极限。抓到数据之后的分析让我们无所适从,因为似乎所有用户均匀递减地分享了这数万个数据包。而且收发的数据包数量也相当地平衡。但从另一个方面来看,有谁会在短短30秒内发起超过1500次HTTP请求呢?

问题的原因随着Apache访问日志的下载完毕浮出水面,分析一开始就发现一个怪异的现象,高达2GB的访问日志居然都只是同一种记录,请求服务器的404.php页面发生了404错误。404.php是一个自定义错误处理页面,几个星期前我们曾在Apache上增加一个重定向错误页面的选项,将404错误重定向到这个页面,但是这个页面里放什么东西,当时没有讨论清楚,所以这个页面也一直没有做。虽然这个选项在几个星期以前打开了,但是一直都没有发挥作用,因为Apache没有重新启动。直到昨天,为了新绑定一个网站域名重启了服务器,就造成了今天的灾难。

事情就是这样的:今天404重定向功能生效了,访问的页面找不到时就会打开404.php这个页面。用户打开网站访问,遇到一些死链接,会触发404错误,于是Apache告诉用户的浏览器,重定向到404.php。用户的浏览器会自动请求404.php这个页面,结果404.php不存在,又会触发一次404错误,Apache会再次告诉用户的浏览器,重定向到404.php这个页面。用户的浏览器会傻不拉唧地再次请求404.php,于是陷入一个反复循环——如果你调用的页面不存在,不论它是什么页面,那么去调用另一个不存在的页面。

从问题再次发现到问题解决,花了3个多小时,如果从问题发生算起,那就已经是快20小时了,其间我们差点报了警。大家都说,是我们自己把自己玩死了。反思一下,我们花了如此之多的时间才解决这个问题,解决问题的过程也的确可圈可点。比如那个2G的访问日志,哪怕只是打开看一下,翻个三五页,也能马上揪出问题的根源,但我们却花了快两个小时去下载它。我们太相信自己的那个假设:我们遭到攻击了,我们又太不相信自己能人工地简单分析一下2GB的日志文件。

再深层次地想一想,这应该是一个配置管理的问题:错误处理页面没有配合服务器设置的修改,而且我们以前遇到过同类问题,比如我们常常会面对代码修改了数据库却 没有改引发的SQL查询错误;或者还有数据库已经为新功能要求修改了数据表,但是处理新功能的代码没有跟随数据库变更一起发布而引发的的错误。只不过以前 的这些错误比较容易找出原因,今天的这个问题我们花了更多的心思罢了。

从风险防范的角度来说,虽然这一次不是来自别人的攻击。但是我们确实没有一个有效的手段去防御、发现和应对网络层攻击。我一直都只是一个做程序的,从来只从应用层安全的角度出发分析和考虑网络安全的问题。但随着公司越来越大,恐怕总会有包括但不限于竞争对手的小人使用黑客技术来关怀我们的网站。

Continue Reading

    Warning: Illegal string offset 'file' in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 229

    Warning: Illegal string offset 'sizes' in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 230

    Warning: Invalid argument supplied for foreach() in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 230

校医院开的药我都敢吃,还怕什么三鹿?

昨天去了趟校医院,医生随便问了几句,然后就下笔开药。拿到药打开一看,说明书上功能主治、用法用量生产日期等写在第一页,后面洋洋洒洒5页纸写着禁忌、不良反应、与其他药物混用时可能导致的问题。大致浏览一遍,发现此药心肝脾肺肾无所不伤。古人云是药三分毒,可校医院开的药何其毒也,早已毒不下七分。

无奈,闭上眼睛,一口吞下这些毒药。心中默念,校医院开的药我都敢吃,还怕什么三鹿?

Continue Reading

    Warning: Illegal string offset 'file' in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 229

    Warning: Illegal string offset 'sizes' in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 230

    Warning: Invalid argument supplied for foreach() in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 230

推荐《反模式》

想让项目成功有两种方法,其一是执行正确的过程,其二是不犯错误。一本著名的书,《Design Patterns》告诉我们什么是正确的模式,如何使用。但是没有经验的我们常常学的不像,于是出了这样那样的问题。另一本书,《AntiPatterns》就是告诉我们什么是错误,而且这些错误已经被前人犯了无数次,以至于都形成模式了。把错误总结出来,整理成模式,称作“反模式”,手上有一本讲述反模式的书,可以时刻告诫自己不要犯这种被无数人犯过的错误。

提供一下书的信息:全名是《反模式-危机中软件、构架和项目的重构》,人民邮电出版社出版。

Continue Reading

    Warning: Illegal string offset 'file' in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 229

    Warning: Illegal string offset 'sizes' in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 230

    Warning: Invalid argument supplied for foreach() in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 230

在武汉的图片

受兆本影响,我也来发图

Slideshow:

Continue Reading

    Warning: Illegal string offset 'file' in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 229

    Warning: Illegal string offset 'sizes' in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 230

    Warning: Invalid argument supplied for foreach() in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 230

超度九月,开始更新

九月突然就过了,除了中秋回了一趟家,返回北京后改了几个Bug以外,似乎没有什么说得出来的事情,全然浑浑噩噩地过了。

今天超度一下九月吧,然后开始更新。Blog的标题改了,觉得原来那个太玄了,结果选来选去,改了一个更玄的。

Continue Reading

    Warning: Illegal string offset 'file' in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 229

    Warning: Illegal string offset 'sizes' in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 230

    Warning: Invalid argument supplied for foreach() in /web/rek.me/rek/webroot/wp-content/plugins/oss-support/oss-support.php on line 230