怎样安装 ngx_http_modsecurity_module

2019年10月11日 | 分类: 【技术】

【介绍】

ModSecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。

参考:https://www.hugeserver.com/kb/how-install-nginx-libmodsecurity-owasp-centos7/
参考:https://www.cnblogs.com/sanduzxcvbnm/p/6128269.html
参考:https://www.jianshu.com/p/ba7df723cb06
参考:https://www.freebuf.com/sectool/211354.html

【安装】

下载:https://github.com/SpiderLabs/ModSecurity
下载:https://github.com/SpiderLabs/ModSecurity-nginx

1. 编译 libmodsecurity :

安装依赖包(CentOS):

yum install libxml2 libxml2-devel curl curl-devel pcre pcre-devel lua -y

安装依赖包(Ubuntu):

libcurl:

sudo apt-get install libcurl4-openssl-dev -y

SSDEEP:

sudo apt install python3-ssdeep -y

或者:

sudo apt-get install libfuzzy-dev
sudo apt-get install python3-pip
sudo pip3 install ssdeep 

会报错:

error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.

参考:https://blog.csdn.net/sa726663676/article/details/121636541

lmdb

sudo apt install python3-lmdb -y

或者:

sudo pip3 install lmdb

参考:https://blog.csdn.net/yhl_leo/article/details/51305403

查验:

sudo pip3 show lmdb

liblua:

sudo apt install libreadline-dev -y
sudo apt install lua5.3 -y

参考:https://koenwoortman.com/lua-install-on-ubuntu/

libxml2:

sudo apt-get install libxml2-dev -y

参考:https://www.cnblogs.com/lynch_world/archive/2012/06/28/2568395.html

libpcre:

sudo apt-get install libpcre3 libpcre3-dev -y

编译安装 libmodsecurity:

cd /root && git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity && cd ModSecurity && git submodule init && git submodule update && ./build.sh && ./configure
nohup make && make install &

build.sh时报错:fatal:No names found,cannot describe anything.
提示这个错误可以不用管(官方说明)

2. 编译 modsecurity nginx dynamicmodule :

下载源码到 nginx 源代码目录中。

cd /root/nginx-1.25.3 && git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git

nginx编译时可以通过 –add-module 添加 modsecurity 模块:

cd /root/nginx-1.25.3 && ./configure --add-dynamic-module=./ModSecurity-nginx && make modules && cp objs/ngx_http_modsecurity_module.so /usr/local/nginx/modules/

【配置】

编辑 /usr/local/nginx/conf/nginx.conf ,在 main 标签中添加:

load_module modules/ngx_http_modsecurity_module.so;

复制 modsecurity 源码目录下的 modsecurity.conf-recommended 和 unicode.mapping 到 nginx 的 conf 目录下,并将 modsecurity.conf-recommended 重新命名为 modsecurity.conf 。

mv /root/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf && mv /root/ModSecurity/unicode.mapping /usr/local/nginx/conf

编辑 modsecurity.conf ,将 SecRuleEngine 设置为 on :

# SecRuleEngine DetectionOnly
SecRuleEngine On

modsecurity.conf 详解:

参考:https://amon.org/modsecurity-conf
参考:https://blog.csdn.net/Zhao_S/article/details/51745050

【规则】

ModSecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。

1.下载 OWASP 规则:

cd /root/nginx-1.25.3 && git clone https://github.com/SpiderLabs/owasp-modsecurity-crs && mv owasp-modsecurity-crs /usr/local/nginx/conf && cd /usr/local/nginx/conf/owasp-modsecurity-crs && mv crs-setup.conf.example crs-setup.conf

2.启用OWASP规则:

参考:https://github.com/SpiderLabs/owasp-modsecurity-crs/blob/v3.3/dev/INSTALL

目录 /usr/local/nginx/conf/owasp-modsecurity-crs/rules 下有很多规则,按需启用,需要启用的规则使用Include进来即可:

重命名 2 个文件,使得当程序升级时这些文件不被覆盖:

cd /usr/local/nginx/conf/owasp-modsecurity-crs && mv rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf && mv rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

列出 rules 目录下所有文件,

cd /usr/local/nginx/conf/owasp-modsecurity-crs && ls -R

写入 /usr/local/nginx/conf/modsec_includes.conf :

include modsecurity.conf
include owasp-modsecurity-crs/crs-setup.conf
include owasp-modsecurity-crs/rules/*.conf

编辑 /usr/local/nginx/conf/nginx.conf ,在需要启用 modsecurity 的主机的 location 下面加入下面两行即可:

load_module modules/ngx_http_modsecurity_module.so;
http {
	server	{
		modsecurity on;
		location ~ \.php(.*)$ {
			modsecurity_rules_file /usr/local/nginx/conf/modsec_includes.conf;
			}
		}
	}

【测试】

启用了 xss 和 sql 注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:

<?php
    phpinfo();    
?>

在浏览器中访问:

http://www.amon.org/phpinfo.php?id=1 正常显示。
http://www.amon.org/phpinfo.php?id=1 and 1=1 返回403。
http://www.amon.org/phpinfo.php?search=<scritp>alert('xss');</script> 返回403。

证明 sql 注入和 xss 已经被过滤了。

【排错】

报错:not found -llzma

当在 Ubuntu 18.04 环境下编译,在 make 时,提示找不到 lzma 。

参考:http://cncc.bingj.com/cache.aspx?q=lzma+ubuntu&d=4717532089226526&mkt=en-US&setlang=en-US&w=zXMTaw_EDBdhSWe610z560HW3JOydwMN

sudo apt-get update
sudo apt-get install lzma

然而无效。

参考:https://linux.die.net/man/1/lzma

lzma(1): Compress/decompress .xz/.lzma files – Linux man page

可能是因为没有安装 xz 软件。

参考:https://amon.org/xz

安装 xz 后,问题消失。

报错:[emerg] unknown directive “ModSecurityEnabled” in /usr/local/nginx/conf/nginx.conf:72
报错:[emerg] unknown directive “ModSecurityConfig” in /usr/local/nginx/conf/nginx.conf:76

新版配置方法有变化,参考以下文档。

参考:https://github.com/SpiderLabs/ModSecurity/issues/1039
参考:https://github.com/SpiderLabs/ModSecurity-nginx#usage-example-injecting-rules-within-nginx-configuration

报错:[emerg] “modsecurity_rules_file” directive Failed to open the file: modsecurity.conf in /usr/local/nginx/conf/nginx.conf:74

modsecurity_rules_file 的配置文件路径必须是绝对路径。

参考:https://github.com/SpiderLabs/ModSecurity-nginx/issues/70

报错:[emerg] “modsecurity_rules_file” directive Rules error. File: /usr/local/nginx/conf/owasp-modsecurity-crs/rules/REQUEST-910-IP-REPUTATION.conf. Line: 71. Column: 22. This version of ModSecurity was not compiled with GeoIP or MaxMind support. in /usr/local/nginx/conf/nginx.conf:75

因为没有编译 GeoIP 。如果暂时不需要此功能,删除这条规则。

【其他】

修改 nginx 响应头信息:

参考:https://stackoverflow.com/questions/24594971/how-to-changehide-the-nginx-server-signature

If using ModSecurity v2.0 – v2.9, then in the .conf file you can use

SecServerSignature SomeName

ModSecurity v3 SecServerSignature has been deprecated, but I don’t know if they replaced it with something else.

WordPress ModSecurity Rules:

参考:https://www.liquidweb.com/kb/wordpress-modsecurity-rules/

防御实战:

参考:https://www.cnblogs.com/xll970105/p/10250697.html
参考:https://www.freebuf.com/articles/web/8749.html
参考:https://wenku.baidu.com/view/f6a2050a2379168884868762caaedd3383c4b5de.html
参考:https://www.cnblogs.com/wuweidong/p/8535048.html

【日志】:

参考:https://premium.wpmudev.org/forums/topic/modsecurity-modsec2-rule-959004-customers-just-gets-block-strange/
参考:https://www.diskusiwebhosting.com/threads/rule-mod_sec-untuk-memblokir-pengguna-wpmu.33740/
参考:https://stackoverflow.com/questions/25238696/modsecurity-ratelimiting-login-failures

日志路径:

专用日志:/var/log/modsec_audit.log //占用空间甚至达到10G,所以务必每季度清理一次

网站日志:/usr/local/nginx/logs/error.log

日志:403 错误: `TX:ANOMALY_SCORE’ (Value: `5′ )

因为 ModSecurity 而发生当发布文章时报错 403 。

2019/10/16 23:30:38 [error] 2613#0: *3942 [client 66.66.66.66] ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:ANOMALY_SCORE' (Value: `5' ) [file "/usr/local/nginx/conf/owasp-modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "79"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [data ""] [severity "2"] [ver ""] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "66.66.66.66"] [uri "/xmlrpc.php"] [unique_id "157123983828.001602"] [ref ""], client: 104.196.173.14, server: blog.org, request: "POST /xmlrpc.php HTTP/1.1", host: "blog.org"

因为此项阻断影响到文章的发布,

#
# -=[ Anomaly Mode: Overall Transaction Anomaly Score ]=-
#
SecRule TX:ANOMALY_SCORE "@ge %{tx.inbound_anomaly_score_threshold}" \
    "id:949110,\
    phase:2,\
    deny,\
    t:none,\
    log,\
    msg:'Inbound Anomaly Score Exceeded (Total Score: %{TX.ANOMALY_SCORE})',\
    tag:'application-multi',\
    tag:'language-multi',\
    tag:'platform-multi',\
    tag:'attack-generic',\
    severity:'CRITICAL',\
    setvar:'tx.inbound_anomaly_score=%{tx.anomaly_score}'"

参考:https://www.cnblogs.com/wuweidong/p/8876266.html

REQUEST-949-BLOCKING-EVALUATION.conf 中的规则,用于评估请求阶段结束时的异常分数并阻止请求:

异常评分检测模式的优缺点

优点:
对阻止的信心增加 – 由于更多检测规则导致异常评分,评分越高,您越有信心阻止恶意事务。
允许用户设置适合他们的阈值 – 不同的网站可能有不同的阻止阈值。
允许多个低严重性事件触发警报,同时抑制单个警报。
一个相关事件有助于警报管理。
可以通过增加整体异常评分阈值或通过向本地自定义例外文件添加规则来处理例外情况,其中可以检查之前规则匹配的TX数据并基于错误的标准重新调整异常分数。

缺点:
对于普通用户来说更为复杂。
日志监控脚本可能需要更新才能正确分析

方法:可以选择移除删除79行附近的规则

参考:https://github.com/SpiderLabs/owasp-modsecurity-crs/issues/156
参考:https://www.bbsmax.com/A/A7zgYGQV54/
参考:https://sourceforge.net/p/mod-security/mailman/message/32138956/
参考:https://www.jianshu.com/p/b923300f514e
参考:https://blog.csdn.net/weixin_33725515/article/details/93786584
参考:https://www.cnblogs.com/Primzahl/p/6025853.html
参考:https://blog.csdn.net/qq_22075041/article/details/80873758

编辑文件:/usr/local/nginx/conf/modsecurity.conf 添加:

SecRuleRemoveById 949110

实证未遂。那么暂时删除这个规则吧。