Nginx防hashdos模块释出

nginx hashdos 2012.1.7 更新
编译的时候推荐使用nginx-1.0以上版本,不要加--with-debug参数编译,(感谢agentzh指出)。

hashdos这个事,严格意义上不是各种语言的错了(不过perl的确处理得很好),但是用nginx来擦屁股要干净些。
借鉴tomcat的作法,实现了下面这个nginx-http-hashdos-module,通过设置hashdos(默认on)的开关和body_max_count(默认值1000),对nginx后面的服务进行安全防护,相比对php或者java进行patch,这或许是最好的办法了。

nginx-http-hashdos-module项目地址 https://github.com/54chen/nginx-http-hashdos-module

如何使用 1.下载zip后保存到一个目录,如~/nginx-http-hashdos-module。
2.cd nginx-1.0.9/
3.重新编译和安装nginx
./configure --prefix=/opt/soft/nginx --with-pcre --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --add-module=/path_to/nginx-http-hashdos-module/ && make && make install
4.配置打开:
hashdos on;
body_max_count 1000;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /opt/soft/nginx/conf/fastcgi_params;
client_body_buffer_size 2m;
client_max_body_size 2m;
}

注意事项 因为计算参数都在内存中进行,所以client_body_buffer_size 与 client_max_body_size 的值一定要相等。推荐2m。

TODO 改进in-file时的post分析。

原理 介于微博上有网友对此文扫一眼之后以为是简单通过client_body_buffer_size和client_max_body_size来做的判断,特加此节。
nginx-reqeust-body在接到请求时,根据header中的声明,判断是保存在内存还是在硬盘中,当大小超过两个buf和client_body_buffer_size大小时,会写入临时文件。
防止hashdos的终极目标是filter用户的输入,所以对用户的输入参数数量进行计数。超过1000(body_max_count的默认数量)时,返回一个413给攻击者。希望不要再渔到各种高级工程师。

https://github.com/54chen/nginx-http-hashdos-module

54chen Twitter Memo 2012-01-01

    水煮鱼杯2011年度不得不总结的十件事
http://t.co/J1l7Vusw # 人肉构造打到php,php立马100%,转到java(resin+spring+rose),轻松化解,没有反应。(java数据本地亲测hash put长时间没出来的。) # 年终攻击hashDos-哈希表多碰撞实现拒绝服务-破解办法 http://t.co/bFrcQCv0 # 这一轮hashtable的问题,可以和去年php fixpath 有一拼了。 # @Fenng redmine要求第一次订过程必须精细考虑,有什么办法用redmine做到类似xplanner的过程细化子过程? # 【54chenRank】2011 年度项目:1)团购 2)类kik。本来是2010最火的,之所以提团购,是因为电子商务寒风吹过,四处报团购商家卷被子跑路。类kik的项目,炒起来了移动互联网整个行业的火热,X聊、X信,数不胜数。 # 【54chenRank】2011 年度技术关键词:devops。随着创业公司的增多,dev和ops的角色越来越融合,老死不相往来的可能性已经越来越不靠谱。预计明年:无数的小公司dev就是ops,ops就是dev。 # #哥学社#群里的山鸡说,成功的标志就是不在群里说话了。。。 # http://t.co/46uGJE6k 新概念作文一等奖,神作 # http://t.co/35XJ9gyQ 使用了无效的安全证书。该证书因为其发行者证书未知而不被信任。(错误码: sec_error_unknown_issuer)//笑而不语 # 这次爆密码是不是想让大家记住一个教训,不是大公司的专业的没有安全团队的网站,不要注册。 # 54chen Twitter memo 2011-12-25 http://t.co/p53ts3pf #

水煮鱼杯2011年度不得不总结的十件事

第一件:拖裤带爆,横尸遍野 辛卯年年间,宦官弄权,规食名以制。侠客XXX出国前夕,顺手翻出多年前收藏。
CSDN、天涯、京东 三家官方确定被拖,其他家默。
出来混,手里没几个库,已经没办法交流了。
多年前天涯一帖子,疑是五毛所作所顶,憾无证据。今有密码反查,一网打尽。
此次事件,中招数量以千万计。
在遥远的西邦,早些时候也有中招,http://svn.php.net/viewvc/php/php-src/trunk/ext/standard/credits.c?r1=305420&r2=306409&pathrev=306409,见其中Wolegequ Gelivable。

第二件:亚马逊宕机,云计算阴影 4月份,亚马逊ec2服务宕机,连续40小时,号称永不宕机的云,宕机了。
威胁在于,世界第一大的云都挂了,别的还用说吗。
纽约时报:亚马逊事件或致云计算产业蒙上阴影。
官方回应:事故原因是大量的硬盘坏了。

第三件:小米手机,一枝独秀 首批纯会员预订,两天30万台。开放购买1小时10万台。
红海里开辟的蓝海,自然有各种势力出来攻击。大漠风烟间,一场天地变色的正邪之战,正在展开。
说多了就像广告了,明年总结的时候再来看这条。

第四件:乔爷辞世,全网默哀 牛B的演讲技能,商业奇才,还能用什么来形容?
奥巴马:乔布斯改变了我们看世界的方式。
他在车库里建立了这个星球上最成功的公司之一,充分体现了美国人的创造力。通过使电脑个人化,将互联网装进我们的口袋里,他不但让人们可以享受到信息革命的成果,而且使这种革命变得直观和有趣。
他的天赋和才华成为家喻户晓的故事,他为数以百万计的儿童和成年人都带来了快乐。史蒂夫很喜欢说,他过的每一天都像是最后一天。正如他所做到的,他改变了我们的生活,重新定义了所有行业,并实现了人类历史上最罕见的壮举之一:即他改变了我们每个人看这个世界的方式。

第五件:哥学社鸟哥,大战开发组 标题仅为凑字数。
你还不知道哥学社不要紧,不知道鸟哥不行,http://www.laruence.com,这一年他加入了php开发组,是成员中唯一的中国人,现在在百度。因为网名带鸟,又是哥,所以叫鸟哥。(与台湾那个《鸟哥的私房菜》那个鸟哥不是一个哥。不过哥学社正在尝试联系台湾鸟哥也加入。)

第六件:中概上市狂,员工直骂娘 这一年上市的有:人人网、360、网秦、世纪互联、凤凰新媒体、世纪佳缘。什么样公司都能上市。
再来看ADS与普通股兑换比例:
人人:1:3
凤凰:1:8
360:2:3
网秦:1:5
世纪互联:1:6
世纪佳缘:2:3
还有号称鲁花压榨专家的Ku6: 1:100
1:3以下算厚道的,1:20以上的该推出去把创始人撸死,1:100的...

第七件:昔日团购风光,今日员工发慌 创始Groupon上市首日市值165.2亿美元。
团购高管360天:从“烧钱”到被“追债”。
后者为中国团购模仿者。
X网现在遇到了“资金问题”,“不光是X网,全行业都在面临同样的问题”,急速发展的团购行业正在“踩刹车”。
全国团购网站总数首次出现负增长,10月份仅新增16家团购网站,因页面无法访问、停止更新产品、业务转型等原因被视为停运的团购网站共计1017家,总数跌至4057家。
关键词:追债、裁员、输血。
这TMD哪是高科技企业?

第八件:乌坎坷,胜利吗 乌坎本是一小村,民风以彪悍形容不为过。
鸟坑>鸟抗>wukan>and so on。真的胜利了吗,以大连福佳为例。

第九件:开发安全,唐吉柯德 越来越多看到搞安全的人在嘲笑开发人员:水平低啊,不是一点两点。。。
@搞开发的:多看看各种php、java、erlang、GO、mochiweb、spring、resin、tomcat、dynamo、gfs、object c。
@搞安全的:多看看各种php、java、erlang、GO、mochiweb、spring、resin、tomcat、dynamo、gfs、object c。
看看国内顶尖高人,微博都不愿意开。费口水。

第十件:哈希来潮,一个别跑 年底倒数第三天,关于hashtable攻击的消息不胫而走。tomcat/php/ms纷纷出来patch。无赖在国内很少有人关注。好吧,都留着吧,以后看哪个网站老板拖欠IT民工工资了啥的,帮他打不开网站。

年底娱乐,你若当真,你就输了。

年终攻击hashDos-哈希表多碰撞实现拒绝服务-破解办法

起因: Wed, 28 Dec 2011 22:28:16 GMT apache tomcat公布了一个安全漏洞。
http://mail-archives.apache.org/mod_mbox/www-announce/201112.mbox/%3C4EFB9800.5010106@apache.org%3E

漏洞原理: 依靠相应语言的hashtable/hashmap实现过程(request多为此结构),当不同的key存入时如果hash值相等则以链表方式连接在前面。此漏洞利用碰撞相同的hash值得到一个长链表,重新get时,map的计算过程会将时间复杂度巨增,原来一个简单的过程将变成一个很费cpu的过程。

影响到的: 最快时间tomcat公布了解决办法。
php进行了升级。
ms也发了公告http://technet.microsoft.com/en-us/security/bulletin/ms11-100。

解决办法: tomcat 临时办法: 默认大小2097152,当maxPostSize=0时,不限制;maxPostSize=20971520时,为20M,改为一个小于10k的值,所有版本可用,会影响用户。 持久办法: 用新的版本,maxParameterCount默认值1000。 nginx 临时办法: 默认的最大请求body大小为8m,修改设置client_max_body_size=10k;此招为各种情况下万金油,会影响用户。 持久办法: 暂无,应该很快会有max_request_count的参数。 php 持久办法: php升级到5.3.9,5.2需要打patch。详细见:http://www.laruence.com/2011/12/30/2440.html

后记 54chen人肉构造打到php,php立马100%,转到java(resin+spring+rose),轻松化解,没有反应。

hashDos,important

54chen Twitter Memo 2011-12-25

    最近最经常的回答是:没有内部价,没有机器。经常遇到的问题的是:有内部价吗,来XX台。
# 不管啥事,做到极致就算假的也可以成真的。#雨林木风# # 十几年前用access当数据库的时候,有个字段类型叫password,打开看是**,mysql应该做这功能的,谁有空做个plugin? # riak 1.0.2安装手记 http://t.co/NicpziqY # 百度和新浪微博一起,搜“乌坎”不屏蔽。 # @yegle /usr/sbin/tmpwatch -m 24*n dir # http://t.co/hmuYg1Qi 朝鲜民众哀悼金正日昏厥接受救治 【该评论已关闭】 # 54chen Twitter memo 2011-12-18 http://t.co/MXEOS4pN #

Riak 1.0.2安装手记

riak 准备三台机器: r1
r2
r3

准备erlang环境: Erlang >= R14B03
yum install gcc glibc-devel make ncurses-devel openssl-devel
$ wget http://erlang.org/download/otp_src_R14B03.tar.gz
$ tar zxvf otp_src_R14B03.tar.gz
$ cd otp_src_R14B03
$ ./configure && make && sudo make install

git环境(看上去是非必须的): yum -y install git

下载地址: http://downloads.basho.com.s3-website-us-east-1.amazonaws.com/riak/CURRENT/riak-1.0.2.tar.gz

cd riak-1.0.2
make rel

修改配置文件后启动 riak start
riak-admin join
过程完全同0.142 http://www.54chen.com/_linux_/riak-source-install-run.html 与0.1.42相比: erlang环境要求R14B03及以上。低版本会出现this emulator supports only up to 149的make错误。

使用leveldb为存储引擎: 默认引擎还是bitcask,需要修改配置文件app.config
{storage_backend, riak_kv_bitcask_backend}
改为:
{storage_backend, riak_kv_eleveldb_backend}

官方说明: bitcask适用于key有限,而需要最大量的吞吐量和数据持久化情况。
leveldb适用于大量的key。 官方java client压力测试结果: 1cpu 8G的机器3个 笔记本运行压力程序 读写比3:1 6并发 1k大小的value
PB:2500ops 99.9%的操作在22ms内。
HTTP: 1000ops 99.9%的操作在30ms内。

Maven插件编写实例

apache maven

概况 实现一个自定义的类,必须要继承自 org.apache.maven.plugin.AbstractMojo,同时实现execute方法。
maven使用了在注释中写代码,BT的写法,所以注释里的@goal @parameter都是有含义的。

实例

  1. mvn hello:gogo  
这样的一个命令,到代码里,应该是如下过程

进入 hello被叫做plugin的prefix,maven会去寻找以hello开头的插件。
在插件的pom里必须定义其名字为hello开头的,例如:

  1. <artifactId>hello-maven-plugin</artifactId>  

goal目标 hello后面的gogo叫做goal,目标,则以注释中写代码的方式来完成:

  1. /** 
  2. *@goal gogo 
  3. **/  
  4. HelloMojo extends AbstractMojo  

需要的依赖

  1. <dependency>  
  2.  <groupId>org.apache.maven</groupId>  
  3.  <artifactId>maven-plugin-api</artifactId>  
  4.  <version>3.0.3</version>  
  5. </dependency>  

必需的选项

  1. <packaging>maven-plugin</packaging>  
必需要是maven-plugin才能成功。

参数 如果要传什么参数给插件,应该是

  1. /** 
  2. * if false all compression is off (default is true) 
  3. * 
  4. * @parameter expression="${hello.enabled}" default-value="true" 
  5. */  
  6. private Boolean enabled=true;  

使用时项目定义 然后在使用的项目里,需要定义的有

  1. <plugin>  
  2.     <groupId>com.chen</groupId>  
  3.     <artifactId>demo-maven-plugin</artifactId>  
  4.     <version>1.0</version>  
  5.     <configuration>  
  6.         <goalPrefix>hello</goalPrefix>  
  7.         <enabled>false</enabled>  
  8.     </configuration>  
  9. </plugin>  

然后执行上述命令时自然可以执行HelloMojo的execute方法。

54chen Twitter Memo 2011-12-11

    velocity2011讲师经验总结及velocity2011的ppt下载
http://t.co/92LBh44l # 移动互联网api设计实践 http://t.co/D7ARuqWo # 明天参加velocity的朋友,欢迎加我米聊号110005,附言velocity,明天会分享米聊创业过程中半dev半ops的过程,如果公司没有急事,会呆在现场听一听别的几场感兴趣的议题。 #

Velocity2011讲师经验总结及velocity2011的ppt下载

velocity

总结:
1)会场有点小,比较热
2)讲的东西为了照顾更多人,比较片面,如果有想听深入的同学,可以参加我们哥学社的吃喝会。
3)会上遇到了douban强宁大侠、安全宝的冯大侠、还有一位来自清华的主任、以及各位一线的朋友恕不能一一列出,深感荣幸。