Image placeholder

nginx下安装配置modsecurity waf防火墙(附完整编译、配置、排错、详细规则)

Image placeholder
F2EX 2016-11-07

前言:此次编译配置modsecurity基于一键安装包环境(centos、nginx等)适用于阿里云,整个过程遇到不少坑,网上关于modsecurity的信息还是太少,有的教程不全,有的教程不适用一键安装包,还有很多坑。为了避免更多人少走弯路,因此打算写这篇文章帮助更多的人用上modsecurity waf。

还有另一款 Nginx 下的免费防火墙 naxsi ,可根据实际需求选择安装 nginx下安装配置naxsi waf防火墙

此次编译安装modsecurity,基于原nginx增加功能,安装完之后保证之前的编译还是原样。。

第一步:备份原环境模块

使用 /../nginx -V 先查看原来都有哪些模块。
w1
然后把上面这些先复制下来以作备用。

第二步:安装依赖,阿里云的服务器可以直接使用yum安装或者升级

yum install -y gcc make automake autoconf libtool
yum install -y pcre pcre-devel libxml2 libxml2-devel curl curl-devel httpd-devel
第三步:下载编译安装modsecurity
git clone https://github.com/SpiderLabs/ModSecurity.git mod_security
cd mod_security
./autogen.sh  
./configure --enable-standalone-module
make

*(为了避免出错,可先将autogen.sh的权限改成777)

第四步:下载nginx
wget http://www.nginx.org/download/nginx-1.10.2.tar.gz

找到nginx-1.10.1/auto/lib/openssl/conf文件,将第31-35行编辑为 (注:此修改不是必须,如果下面的编译出错可尝试修改此项再编译)
w2
*(为下面编译openssl做准备)

第五步:重新编译pcre
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
tar -xvpzf pcre-8.38.tar.gz
cd pcre-8.38
sudo autoreconf -ivf 

*(configure要改为777权限)

第六步:重新编译openssl
wget https://www.openssl.org/source/openssl-1.0.2j.tar.gz
tar -xvpzf openssl-1.0.2j.tar.gz
cd openssl-1.0.2j
./config 
make

*(config要改为777权限)

第七步:编译nginx,增加modsecurity模块以及原有模块。
cd nginx-1.10.2
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-ipv6 --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-openssl=../openssl-1.0.2j --with-pcre=../pcre-8.38 --with-pcre-jit --with-ld-opt=-ljemalloc \
--add-module=../mod_security/nginx/modsecurity
make

*(configure要改为777权限,不要make install)

第八步:拷贝编译后的nginx文件覆盖现有的nginx文件
service nginx stop
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp objs/nginx /usr/local/nginx/sbin/nginx
service nginx start
第九步:查看现有编译模块
/../nginx -V

w3
如图,原有模块不变,增加modsecurity成功!

第十步:下载OWASP规则

下载地址:https://github.com/SpiderLabs/owasp-modsecurity-crs
将规则目录 owasp-modsecurity-crs-master 放置 /usr/local/nginx/conf/ 下,
然后将 owasp-modsecurity-crs-master 目录下的 modsecurity_crs_10_setup.conf.example 改名为 modsecurity_crs_10_setup.conf 。

第十一步:启用OWASP规则

复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf
编辑modsecurity.conf 文件,将SecRuleEngine设置为 on ,并将你需要的规则导入进来:

Include modsecurity-crs/modsecurity_crs_10_setup.conf
Include modsecurity-crs/base_rules/modsecurity_crs_35_bad_robots.conf
Include modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf
Include modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf
Include modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf
Include modsecurity-crs/base_rules/modsecurity_crs_42_tight_security.conf
Include modsecurity-crs/base_rules/modsecurity_crs_45_trojans.conf

*(如果你的网站使用了CDN服务,并且间歇性打不开,可能需要删除 modsecurity_crs_11_proxy_abuse.conf 这条恶意代理IP、IP黑名单规则)

第十二步:配置nginx
location \ {
    ModSecurityEnabled on;
    ModSecurityConfig modsecurity.conf; 
    
    ....其他配置
    }  
service nginx reload
第十三步:测试

……

如果攻击被阻止,恭喜你,成功启用modsecurity!

其他、排错:

· 如果 wordpress 登录 500 错误或者后台操作长时间无响应,但是内存不断增加,可关闭 modsecurity.conf 中检查开关 SecRequestBodyAccess OffSecResponseBodyAccess Off。wordpress 登录 500 错误这是个 bug ,不过官方在最新的 2.9.2 版本由于技术原因并没有修复,同时官方建议 nginx 用户使用 ModSecurity-nginx 版本,不过问题也不少。

· modsecurity 默认的阻止日志在 /var/log/modsec_audit.log 下,可查看详细被阻止的原因和规则,可禁用规则来放行(禁用方法见下文)。

· 如果提示 Audit log: Failed to lock global mutex: Permission denied
你可能需要将modsecurity.conf中的 SecAuditLogType Serial 注释掉,然后修改/添加以下内容:

  SecAuditLog /var/log/modsec_audit.log  #(该设置默认是有的,这里不需要注释)
  SecAuditLogType Concurrent 
  SecAuditLogStorageDir /opt/modsecurity/var/audit/  #(该文件夹需要新建,并且必须指定用户组,例如属于wwwdata,和nginx中设置的相同)

· 如果正常的 post 使用 302 跳转方法无响应,可屏蔽 950922 960034 960032 这几个规则再试,另外这个现象有时候会伴随多个问题,例如 nginx 中也会产生错误日志等,在 github issue 中也有很多关于类似的问题,并且官方推荐使用 ModSecurity-nginx 版本,将会对nginx支持更好。

增加白名单方法:

修改 modsecurity.conf ,加入 SecRuleRemoveById 960024 这样的格式禁用该规则 id,也可以使用 SecRuleRemoveByMsSecRuleRemoveByTag

下面是国外论坛上给出的几个 wordpress 常用的白名单规则:

## WordPress

SecRuleRemoveById 300015 300016 300017

SecRule REQUEST_URI "/wp-comments-post.php" phase:1,nolog,allow,ctl:ruleEngine=Off
modsecurity owasp详细规则解释:

第一部分:基础规则集

modsecurity_crs_20_protocol_violations.conf HTTP协议规范相关规则
modsecurity_crs_21_protocol_anomalies.conf HTTP协议规范相关规则
modsecurity_crs_23_request_limits.conf HTTP协议大小长度限制相关规则
modsecurity_crs_30_http_policy.conf HTTP协议白名单相关规则
modsecurity_crs_35_bad_robots.conf 恶意扫描器与爬虫规则
modsecurity_crs_40_generic_attacks.conf 常见的攻击例如命令执行,代码执行,注入,文件包含、敏感信息泄露、会话固定、HTTP响应拆分等相关规则
modsecurity_crs_41_sql_injection_attacks.conf SQL注入相关规则(竟然有一条MongoDB注入的规则,很全)
modsecurity_crs_41_xss_attacks.conf XSS相关规则
modsecurity_crs_42_tight_security.conf 目录遍历相关规则
modsecurity_crs_45_trojans.conf webshell相关规则
modsecurity_crs_47_common_exceptions.conf Apache异常相关规则
modsecurity_crs_49_inbound_blocking.conf 协同防御相关规则
modsecurity_crs_50_outbound.conf 检测response_body中的错误信息,警告信息,列目录信息
modsecurity_crs_59_outbound_blocking.conf 协同防御相关规则
modsecurity_crs_60_correlation.conf 协同防御相关规则

第二部分:SLR规则集

来自确定APP的PoC,不会误报,检测方法是先检查当前请求的文件路径是否出现在data文件中,若出现再进行下一步测试,否则跳过该规则集的检测
modsecurity_crs_46_slr_et_joomla_attacks.conf JOOMLA应用的各种漏洞规则
modsecurity_crs_46_slr_et_lfi_attacks.conf 各种APP的本地文件包含相关规则
modsecurity_crs_46_slr_et_phpbb_attacks.conf PHPBB应用的各种漏洞规则
modsecurity_crs_46_slr_et_rfi_attacks.conf 各种APP的远程文件包含相关规则
modsecurity_crs_46_slr_et_sqli_attacks.conf 各种APP的SQL注入相关规则
modsecurity_crs_46_slr_et_wordpress_attacks.conf WORDPRESS应用的各种漏洞规则
modsecurity_crs_46_slr_et_xss_attacks.conf 各种APP的XSS相关规则

第三部分:可选规则集

modsecurity_crs_10_ignore_static.conf 静态文件不过WAF检测的相关规则
modsecurity_crs_11_avs_traffic.conf AVS(授权的漏洞扫描器)的IP白名单规则
modsecurity_crs_13_xml_enabler.conf 请求体启用XML解析处理
modsecurity_crs_16_authentication_tracking.conf 记录登陆成功与失败的请求
modsecurity_crs_16_session_hijacking.conf 会话劫持检测
modsecurity_crs_16_username_tracking.conf 密码复杂度检测
modsecurity_crs_25_cc_known.conf CreditCard验证
modsecurity_crs_42_comment_spam.conf 垃圾评论检测
modsecurity_crs_43_csrf_protection.conf 与modsecurity_crs_16_session_hijacking.conf联合检测,使用内容注入动作append注入CSRF Token
modsecurity_crs_46_av_scanning.conf 使用外部脚本扫描病毒
modsecurity_crs_47_skip_outbound_checks.conf modsecurity_crs_10_ignore_static.conf的补充
modsecurity_crs_49_header_tagging.conf 将WAF规则命中情况配合Apache RequestHeader指令注入到请求头中,以供后续应用进一步处理
modsecurity_crs_55_application_defects.conf 安全头(X-XSS-Protection,X-FRAME-OPTIONS,X-Content-Type-Options)设置,安全Cookie设置(Domain,httponly,secure),字符集设置等规则
modsecurity_crs_55_marketing.conf记录MSN/Google/Yahoo robot情况

第四部分:实验性规则集

modsecurity_crs_11_brute_force.conf 防御暴力破解相关规则
modsecurity_crs_11_dos_protection.conf 防DoS攻击相关规则
modsecurity_crs_11_proxy_abuse.conf 检测X-Forwarded-For是否是恶意代理IP,IP黑名单
modsecurity_crs_11_slow_dos_protection.conf Slow HTTP DoS攻击规则
modsecurity_crs_25_cc_track_pan.conf 检测响应体credit card信息
modsecurity_crs_40_http_parameter_pollution.conf 检测参数污染
modsecurity_crs_42_csp_enforcement.conf CSP安全策略设置
modsecurity_crs_48_bayes_analysis.conf 使用外部脚本采取贝叶斯分析方法分析HTTP请求,区分正常与恶意请求
modsecurity_crs_55_response_profiling.conf 使用外部脚本将响应体中的恶意内容替换为空
modsecurity_crs_56_pvi_checks.conf使用外部脚本检测 REQUEST_FILENAME是否在osvdb漏洞库中
modsecurity_crs_61_ip_forensics.conf 使用外部脚本收集IP的域名、GEO等信息
modsecurity_crs_40_appsensor_detection_point_2.0_setup.conf APPSENSOR检测设置文件
modsecurity_crs_40_appsensor_detection_point_3.0_end.conf APPSENSOR检测设置文件
modsecurity_crs_16_scanner_integration.conf 对扫描器设置IP白名单,并调用扫描器API来进行检测
modsecurity_crs_46_scanner_integration.conf
使用modsecurity_crs_40_appsensor_detection_point_2.0_setup.conf,modsecurity_crs_40_appsensor_detection_point_3.0_end.conf 来跟踪XSS漏洞参数与SQLI漏洞参数
modsecurity_crs_40_appsensor_detection_point_2.1_request_exception.conf 使用外部脚本检测请求方法,参数个数,参数名字,参数长度,参数字符等限制
modsecurity_crs_40_appsensor_detection_point_2.9_honeytrap.conf 使用隐藏参数设置蜜罐

参考链接:
·ModSecurity CRS单条规则的内容,请参看ModSecurity CRS详解
·https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual
·https://www.howtoforge.com/tutorial/install-nginx-with-mod_security-on-ubuntu-15-04/


2017-09-01