Apache下ModSecurity的安装启用与配置
ModSecurity是一个强大的包过滤工具,将检查每一个进入web服务器的包。它将根据内部规则,比较每一个包,并且确定是否需要禁止这个包或继续发送给web服务器。
1、下载
modsecurity-apache:http://sourceforge.net/projects/mod-security/files/modsecurity-apache/
modsecurity-crs:http://sourceforge.net/projects/mod-security/files/modsecurity-crs/0-CURRENT/
2、安装
1)启用mod_unique_id模块
2)验证服务器安装了最新版本libxml2函数库
3)停止Apachehttpd
4)解压
gzip-dmodsecurity-apache_2.6.3.tag.gz
tarxvzfmodsecurity-apache_2.6.3.tar
gzip-dmodsecurity-core-rules_2.6.tar.gz
tarxvzfmodsecurity-core-rules_2.6.tar.gz
5)配置
./configure
6)编译并测试ModSecurity
make
maketest
7)安装
makeinstall
修改http.conf,启用ModSecurity,在httpd.conf文件添加:
LoadFile/usr/lib/libxml2.so
LoadModulesecurity2_modulemodules/mod_security2.so
8)重启apache
到这里已经安装了ModSecurity,你可以查看配置指令文档:http://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Reference_Manual
ubuntu上安装Apache2+ModSecurity及自定义WAF规则
虽然VPS使用了云WAF功能,但还是有点小担心,为了双重保险,决定使用modsecurity来定制规则,以下介绍如何为apache服务器配置ModSecurity防护罩(modsecurity目前也支持Nginx,IIS)。
本次选择使用包管理器来安装,因为每次使用源码包的安装方式,都会被诡异的库依赖错误弄得发型都抓乱。
安装环境:
OS:Ubuntu14.04.1LTS
Apache:Apache/2.4.7(Ubuntu)
第一步:安装apache
我建议安装Apache最好用apt-get安装,这样就可以少很多的库支持!!!!如果不嫌麻烦的话可以用源码安装
输入apt-getinstallapache2
如果提示没有这个软件包就更新一下软件包apt-getinstallupdate
这步安装好了以后apache就可以提供服务了,输入127.0.0.1就可以访问本地网站了
第二步:安装modsecurity
这个也和上边的一样,使用
apt-getinstalllibxml2libxml2-devlibxml2-utilslibaprutil1libaprutil1-devlibapache2-modsecurity
安装好了以后就可以查看你的modsecurity的版本号是多少,使用
dpkg-slibapache2-modsecurity|grepVersion
第三步配置modsecurity
serviceapache2reload
该命令生效后,会在/var/log/apache2/目录下生成modsecurity的日志文件modsec_audit.log
使用modsecurity核心规则集
将我们想起用的规则集放置在以下目录下
cd/usr/share/modsecurity-crs/activated_rules/
选择启用base规则集
forfin$(ls../base_rules/);doln-s../base_rules/$f;done
修改apache模块配置,启用规则集
注意:modsecurity2.7版本与2.6版本的配置文件有些区别
(1)2.7版本
vim/etc/apache2/mods-available/security2.conf
修改
#DefaultDebiandirformodsecurity'spersistentdata
SecDataDir/var/cache/modsecurity
#Includeallthe*.conffilesin/etc/modsecurity.
#Keepingyourlocalconfigurationinthatdirectory
#willallowforaneasyupgradeofTHISfileand
#makeyourlifeeasier
IncludeOptional/etc/modsecurity/*.conf
IncludeOptional/usr/share/modsecurity-crs/*.conf
IncludeOptional/usr/share/modsecurity-crs/activated_rules/*.conf
(2)2.6版本
vim/etc/apache2/mods-available/mod-security.conf
修改
Include/etc/modsecurity/*.conf
Include/usr/share/modsecurity-crs/*.conf
Include/usr/share/modsecurity-crs/activated_rules/*.conf
第四步:启用modsecurity模块
a2enmodheadersa2enmodsecurity2(版本2.6:a2enmodmod-security)serviceapache2restart
第五步:测试真实的攻击payload
看是否能拦截
http://www.tanjiti.com/?case=archive&act=orders&aid[typeid`%3D1%20and%20ord(mid((select/**/concat(username,0x3a,password)%20from%20cmseasy_user),1,1))%3C49%23]=1
我们发现请求包被403拦截了,
可以查看modsecurity日志文件看具体的拦截情况
tail/var/log/apache2/modsec_audit.log
message:Accessdeniedwithcode403(phase2).Patternmatch"(/\\*!?|\\*/|[';]--|--[\\s\\r\\n\\v\\f]|(?:--[^-]*?-)|([^\\-&])#.*?[\\s\\r\\n\\v\\f]|;?\\x00)"atARGS_NAMES:aid[typeid`=1andord(mid((select/**/concat(username,0x3a,password)fromcmseasy_user),1,1))
<49#].
[file"/usr/share/modsecurity-crs/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"][line"49"][id"981231"][rev"2"][msg"SQLCommentSequenceDetected."][data"MatchedData:/*foundwithinARGS_NAMES:aid[typeid`=1andord(mid((select/**/concat(username,0x3a,password)fromcmseasy_user),1,1))<49#]:aid[typeid`=1andord(mid((select/**/concat(username,0x3a,password)fromcmseasy_user),1,1))<49#]"][severity"CRITICAL"][ver"OWASP_CRS/2.2.8"][maturity"8"][accuracy"8"][tag"OWASP_CRS/WEB_ATTACK/SQL_INJECTION"][tag"WASCTC/WASC-19"][tag"OWASP_TOP_10/A1"][tag"OWASP_AppSensor/CIE1"][tag"PCI/6.5.2"]
可以看到是被base规则集的modsecurity_crs_41_sql_injection_attacks.conf文件的规则981231拦截,命中了SQL注释语句。
对于网站结构比较了解的站长们,完全可以自定义规则,特别是白名单规则来防护我们的网站。
第六步:自定义WAF规则
规则语法快速入门参考ModSecuritySecRulecheatsheets
WAF规则实例1:上传文件名白名单,只允许上传图片文件
vim/usr/share/modsecurity-crs/activated_rules/MY.conf
添加规则
SecRuleFILES"!\\.(?i:jpe?g|gif|png|bmp)$""deny,tag:'WEB_ATTACK/FILEUPLOAD',msg:'uploadno-picturefile',id:0000001,phase:2"
测试,上传php文件
(http的使用参照HTTP发包工具-HTTPie)
httpwww.tanjiti.comfilename@a.php
我们可以看到请求包被拦截,查看modsecurity日志
more/var/log/apache2/modsec_audit.log
可以看到命中了规则0000001
Message:Accessdeniedwithcode403(phase2).Matchof"rx\\.(?i:jpe?g|gif|png|bmp)$"against"FILES:filename"required.[file"/usr/share/modsecurity-crs/activated_rules/MY.conf"][line"1"][id"0000001"][msg"uploadno-picturefile"][tag"WEB_ATTACK/FILEUPLOAD"]
WAF规则实例2:上传文件名中包含%00进行阻断
vim/usr/share/modsecurity-crs/activated_rules/MY.conf
添加规则
SecRuleFILES"@contains%00""deny,tag:'WEB_ATTACK/FILEUPLOAD',msg:'filenamehasnullcharacter',id:0000002,phase:2"
测试,上传文件名包含%00的文件
httpwww.tanjiti.comfilename@a.php%00.jpeg
我们可以看到请求包被拦截,查看modsecurity日志
more/var/log/apache2/modsec_audit.log
可以看到命中了规则0000002
Message:Accessdeniedwithcode403(phase2).Stringmatch"%00"atFILES:filename.[file"/usr/share/modsecurity-crs/activated_rules/MY.conf"][line"2"][id"0000002"][msg"filenamehasnullcharacter"][tag"WEB_ATTACK/FILEUPLOAD"]
非常简单吧,下一步,计划介绍一下nginx服务器的防护。
注意!!!!!!!!!!!!!!
一旦这样修改了以后,使用IP地址就显示403错误!!!!!!为了这个错误,搞了一天,在网上搜各种403错误就是不行,为什么呢????
查看errol.log就可以发现,是modsecurity里面禁止了使用IP访问!!!!!!使用localhost就可以正常访问了。。。
所以,看日志是一个很重要的事儿