ubuntu上安装Apache2+ModSecurity及自定义WAF规则
小编注:本文作者系FreeBuf专栏作者 @碳机体 美眉,目前她的研究方向主攻云防火墙。对文章内容有不清楚的可以直接评论区中留言,注意秩序和素质。
虽然VPS使用了云WAF功能,但还是有点小担心,为了双重保险,决定使用modsecurity来定制规则,以下介绍如何为apache服务器配置ModSecurity防护罩(modsecurity目前也支持Nginx,IIS) 。
本次选择使用包管理器来安装,因为每次使用源码包的安装方式,都会被诡异的库依赖错误弄得发型都抓乱。
安装环境:
OS:Ubuntu 14.04.1 LTS
Apache: Apache/2.4.7 (Ubuntu)
第一步:安装libapache2-modsecurity模块及其依赖包
apt-get install libxml2 libxml2-dev libxml2-utils libaprutil1 libaprutil1-dev libapache2-modsecurity
我们可以使用以下命令查看一下modsecurity的当前版本
dpkg -s libapache2-modsecurity | grep Version
我的vps上安装的是Version: 2.7.7-2
第二步:配置modsecurity,启用拦截模式
service apache2 reload
该命令生效后,会在/var/log/apache2/目录下生成modsecurity的日志文件modsec_audit.log
cd /etc/modsecurity/mv modsecurity.conf-recommended modsecurity.confvim /etc/modsecurity/modsecurity.conf修改SecRuleEngine On
第三步:使用modsecurity核心规则集
核心规则集的详细介绍参见:
ModSecurity CRS 笔记、WAF防御checklist,及WAF架构的一些想法
http://danqingdani.blog.163.com/blog/static/186094195201472304841643/
将我们想起用的规则集放置在以下目录下
cd /usr/share/modsecurity-crs/activated_rules/
选择启用base规则集
for f in $(ls ../base_rules/); do ln -s ../base_rules/$f; done
你可以采用同样的办法启用其他规则集,注意不同的规则集可能需要启用特定的模块
修改apache模块配置,启用规则集
注意:modsecurity 2.7版本与2.6版本的配置文件有些区别
(1)2.7版本
vim /etc/apache2/mods-available/security2.conf
修改
<IfModule security2_module>
# Default Debian dir for modsecurity's persistent data
SecDataDir /var/cache/modsecurity
# Include all the *.conf files in /etc/modsecurity.
# Keeping your local configuration in that directory
# will allow for an easy upgrade of THIS file and
# make your life easier
IncludeOptional /etc/modsecurity/*.conf
IncludeOptional /usr/share/modsecurity-crs/*.conf
IncludeOptional /usr/share/modsecurity-crs/activated_rules/*.conf
</IfModule>
(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模块
a2enmod headersa2enmod security2 (版本2.6: a2enmod mod-security)service apache2 restart
第五步:测试真实的攻击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: Access denied with code 403 (phase 2). Pattern match "(/\*!?|\*/|[';]--|--[\s\r\n\v\f]|(?:--[^-]*?-)|([^\-&])#.*?[\s\r\n\v\f]|;?\x00)" at ARGS_NAMES:aid[typeid`=1 and ord(mid((select/**/concat(username,0x3a,password) from cmseasy_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 "SQL Comment Sequence Detected."] [data "Matched Data: /* found within ARGS_NAMES:aid[typeid`=1 and ord(mid((select/**/concat(username,0x3a,password) from cmseasy_user),1,1))<49#]: aid[typeid`=1 and ord(mid((select/**/concat(username,0x3a,password) from cmseasy_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规则
规则语法快速入门参考 ModSecurity SecRule cheatsheets
http://danqingdani.blog.163.com/blog/static/18609419520146296181531/
WAF规则实例1:上传文件名白名单,只允许上传图片文件
vim /usr/share/modsecurity-crs/activated_rules/MY.conf
添加规则
SecRule FILES "!\.(?i:jpe?g|gif|png|bmp)$" "deny,tag:'WEB_ATTACK/FILEUPLOAD',msg:'upload no-picture file',id:0000001,phase:2"
测试,上传php文件
(http的使用参照HTTP发包工具 -HTTPie)
http www.tanjiti.com filename@a.php
我们可以看到请求包被拦截,查看modsecurity日志
more /var/log/apache2/modsec_audit.log
可以看到命中了规则0000001
Message: Access denied with code 403 (phase 2). Match of "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 "upload no-picture file"] [tag "WEB_ATTACK/FILEUPLOAD"]
WAF规则实例2: 上传文件名中包含%00进行阻断
vim /usr/share/modsecurity-crs/activated_rules/MY.conf
添加规则
SecRule FILES "@contains %00" "deny,tag:'WEB_ATTACK/FILEUPLOAD',msg:'filename has null character',id:0000002,phase:2"
测试,上传文件名包含%00的文件
http www.tanjiti.com filename@a.php%00.jpeg
我们可以看到请求包被拦截,查看modsecurity日志
more /var/log/apache2/modsec_audit.log
可以看到命中了规则0000002
Message: Access denied with code 403 (phase 2). String match "%00" at FILES:filename. [file "/usr/share/modsecurity-crs/activated_rules/MY.conf"] [line "2"] [id "0000002"] [msg "filename has null character"] [tag "WEB_ATTACK/FILEUPLOAD"]
非常简单吧,下一步,计划介绍一下nginx服务器的防护。
[参考信息来源 http://ubuntuforums.org/showthread.php?t=2219109]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php模式设计之观察者模式应用实例分析
- python进程与线程小结实例分析
- php引用和拷贝的区别知识点总结
- PHP 观察者模式深入理解与应用分析
- php依赖注入知识点详解
- php策略模式简单示例分析【区别于工厂模式】
- php连接sftp的作用以及实例代码
- redis+php实现微博(一)注册与登录功能详解
- PHP序列化的四种实现办法与横向对比
- php设计模式之观察者模式定义与用法经典示例
- Laravel获取所有的数据库表及结构的方法
- redis+php实现微博(二)发布与关注功能详解
- PHP实现小程序批量通知推送
- Thinkphp5.0 框架Model模型简单用法分析
- php设计模式之单例模式用法经典示例分析