基于ModSecurity-nginx的WAF安装配置
基本概念
WAF
WAF即Web应用防火墙(Web Application Firewall),顾名思义,这是一个应用层的防火层,基于Web这个应用层。不同于通常的网络层防火墙——如iptables,防护逻辑是基于TCP/IP层面的IP地址和端口等——应用层防火层的防护逻辑是基于具体应用的,如Web应用的防护是通过分析HTTP数据流实现的。
ModSecurity
ModSecurity早年是一个Apache模块,用于给Apache提供WAF功能,后来也发展了其它Web Server支持。从3.0版开始以新架构重写,可以更好地支持各种不同的Web Server。
ModSecurity-nginx
这是一个ModSecurity的Nginx connector。它是一个nginx的模块,用于连接nginx和ModSecurity。
OWASP CRS(Core Rule Set)
这是一个ModSecurity的核心规则集,由安全社区OWASP维护,在ModSecurity里使用这个规则集,可以提供以下防护:
- SQL Injection (SQLi)
- Cross Site Scripting (XSS)
- Local File Inclusion (LFI)
- Remote File Inclusion (RFI)
- PHP Code Injection
- Java Code Injection
- HTTPoxy
- Shellshock
- Unix/Windows Shell Injection
- Session Fixation
- Scripting/Scanner/Bot Detection
- Metadata/Error Leakages
安装
ModSecurity
首先编译安装ModSecurity:
git clone https://github.com/SpiderLabs/ModSecurity
cd ModSecurity/
git checkout v3/master
./build.sh
git submodule init
git submodule update
./configure
make
sudo make install
cd ..
ModSecurity-nginx和nginx
再编译安装ModSecurity-nginx,因为这是一个nginx模块,需要重新编译nginx。
先查看当前nginx版本和编译参数:
> nginx -V
nginx version: nginx/1.14.0 (Ubuntu)
built with OpenSSL 1.1.1 11 Sep 2018
TLS SNI support enabled
configure arguments: [一大堆编译选项]
开始编译并安装:
git clone https://github.com/SpiderLabs/ModSecurity-nginx
wget http://nginx.org/download/nginx-1.14.2.tar.gz # 1.14的最新版本源码为1.14.2
tar -xvf nginx-1.14.2.tar.gz
cd nginx-1.14.2
# 静态编译
./configure [一大堆编译选项] --add-module=/path_to/ModSecurity-nginx # 前面的参数都保持和-V一致,最后加上这个模块
# 动态编译
./configure [一大堆编译选项] --add-dynamic-module=/path_to/ModSecurity-nginx # 前面的参数都保持和-V一致,最后加上这个模块
make modules # 仅编译模块——如果原来nginx版本一致的话
# 继续编译
make
sudo make install # 把编译过的模块都安装到/usr/lib/nginx/modules
sudo mv /usr/sbin/nginx /usr/sbin/nginx.bak # 手工替换nginx文件(不知道为什么make install没有换,新安装试了也不行)
sudo cp objs/nginx /usr/sbin/
sudo systemctl restart nginx
# 配置启用模块(动态)
cd /etc/nginx/modules-enable
echo -n "load_module modules/ngx_http_modsecurity_module.so;" > 50-mod-http-modsecurity.conf
sudo nginx -s reload
OWASP CRS
下载规则并解压:
wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz
tar -xvf v3.3.0.tar.gz
配置及测试
配置ModSecurity和CRS
# 复制ModSecurity配置
sudo cp ModSecurity/modsecurity.conf-recommened /usr/local/nginx/conf/modsecurity.conf
sudo cp ModSecurity/unicode.mapping /usr/local/nginx/conf/
# 复制OWASP-ModSecurity-CRS配置
sudo cp coreruleset-3.3.0/crs-sertup.conf.example /usr/local/nginx/conf/crs-setup.conf
sudo cp -R coreruleset-3.3.0/rules /usr/local/nginx/conf/
cd /usr/local/nginx/conf
sudo mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
sudo mv RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
# 编辑 /usr/local/nginx/conf/modsecurity.conf
# 修改 SecRuleEngine DetectionOnly 为 On
# 最后增加:
Include crs-setup.conf
Include rules/*.conf
配置Nginx启用ModSecurity和CRS
# 在server段里的server_name下面增加:
modsecurity on;
modsecurity_rules_file /usr/local/nginx/conf/modsecurity.conf;
# 重启nginx
service nginx restart
测试
curl -H "User-Agent: masscan" http://localhost/
如果报403错误,并且在/var/log/modsec_audit.log里可以看到封禁日志,说明配置生效了。
至此,安装配置完成。
最后友情提醒一下,WAF可能导致一些副作用,比如我就发现它会导致kibana不能正常使用。
推送到[go4pro.org]