Apache ModSecurity OWASP规则配置
ModSecurity 作为始祖级WAF再加上OWASP 写的核心规则库确实是一款不错的WAF了,配置起来也不算太麻烦记录下。
环境:
System:CentOS release 6.5 (Final)
Apache: Apache/2.2.15 (Unix)
ModSecurity:mod_security-2.7.3
安装方式比较多,最简单的当然是用yum
安装EPEL源
1 2 3 4 5 6 7 8 9 |
32位系统选择: rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm rpm -ivh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm 64位系统选择: rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -ivh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm 导入key: rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-5 |
安装Apache等
1 2 3 |
yum install http php php-mysql mysql mysql-server mod_security service httpd restart #重启生效 tail -f /var/log/httpd/error_log #查看是否加载 |
配置OWASP规则
1 2 3 4 5 |
cd /etc/httpd/ git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git mv owasp-modsecurity-crs/ modsecurity-crs/ cd modsecurity-crs/ cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10.conf |
加载规则
1 2 3 4 5 6 |
vi /etc/httpd/conf/httpd.conf #尾部插入下面配置 <IfModule security2_module> Include modsecurity-crs/modsecurity_crs_10.conf Include modsecurity-crs/base_rules/*.conf </IfModule> |
创建顶级配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
vi /etc/httpd/modsecurity.d/modsecurity.conf #插入以下配置 <IfModule mod_security2.c> SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream SecDataDir /tmp </IfModule> 说明: <!-- SecRuleEngine 配置规则引擎 On - 处理规则 Off - 不处理规则 DetectionOnly - 处理规则但不中断事务,即使规则配置了也不做。 SecRequestBodyAccess 配置是否让ModSecurity默认处理或缓冲请求体 On - 访问请求体 Off - 不尝试访问请求体 SecResponseBodyAccess 配置响应体是否被缓存并被分析 On - 访问响应体 (仅支持使用MIME类型,具体见上述). Off - 不尝试访问响应体 SecResponseBodyMimeType 为响应数据缓存配置推荐的MIME类型 默认值是text/plain text/html SecDataDir 存储持久性数据(比如IP地址数据和会话数据等数据)的路径 --> |
配置完成 重启apache
其中规则960017不允许 host为IP的请求,如果想关闭该规则可以在顶级配置文件中加
1 2 3 4 5 6 7 8 9 10 |
<LocationMatch .*> SecRuleRemoveById 960017 </LocationMatch> <!-- SecRuleRemoveById 使用ID方式从上级环境中删除规则 语法:SecRuleUpdateActionById RULEID ACTIONLIST 备注:这个指令支持多个参数,每个参数可以是一个规则ID,也可以是范围。带有空格的参数必须使用双引号括起来。 --> |
或者
1 2 3 4 5 6 7 8 9 10 |
<LocationMatch .*> SecRuleRemoveByMsg "Host header is a numeric IP address" </LocationMatch> <!-- SecRuleRemoveByMsg 使用规则方式从上级环境中删除规则 语法:SecRuleRemoveByMsg REGEX 备注:这个指令支持多个参数,每个指令是一个应用于消息的正则表达式(指定使用的消息动作)。 --> |
日志文件为
1 2 |
/var/log/httpd/error_log #警告日志 /var/log/httpd/modsec_audit.log #详细日志 |
参考:
ModSecurity-2.5.7手册翻译
ModSecurity 手册
ModSecurity 白名单设置
How to harden Apache web server with mod_security and mod_evasive on CentOS
暂无评论