基于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。

项目Gayhub

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]