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 "(/\\*!?|\\*/|[&#039;;]--|--[\\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:&#039;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]

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2014-09-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

Centos6.X 下安装并使用VNC的操作记录

VNC是一个的"远程桌面"工具。,通常用于“图形界面”的方式登录服务器,可视化操作。废话不多说了,操作记录如下: 1)安装桌面环境 [root@vm01 ~]#...

3707
来自专栏deepcc

phpStudy for Linux (lnmp+lamp一键安装包)

7249
来自专栏程序员同行者

14-使用glusterfs做持久化存储

1652
来自专栏mathor

如何让局域网内的其他人访问到自己在Tomcat上部署的项目

 学JSP第三节课,今天老师上课讲了开启Tomcat之后,将自己电脑的文件放到指定的目录下,可以让同宿舍的人访问并且下载,老师只是提了一下,没有具体讲,后来我看...

3K3
来自专栏JAVA高级架构

详解 Tomcat 的连接数与线程池

前言 在使用tomcat时,经常会遇到连接数、线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector)。 在前面的文章 详...

1.1K9
来自专栏小狼的世界

Kubernetes基础:编排调度的那些Controllers

Kubernetes提供了很多Controller资源来管理、调度Pod,包括Replication Controller、ReplicaSet、Deploym...

1722
来自专栏源码之家

一键安装桌面及VNC

5686
来自专栏Felix的技术分享

Stetho的通信原理

3223
来自专栏惨绿少年

FTP&samba 服务简单部署

第1章 FTP服务部署 在Linux下,我们应用最广泛的FTP服务程序是 vsftpd (Very Secure FTP Daemon),从名字我们也可以看出,...

5270
来自专栏魏艾斯博客www.vpsss.net

如何创建.htaccess 文件

4265

扫码关注云+社区

领取腾讯云代金券