Nginx 防火墙 ModSecurity 安装教程
安装依赖
$ yum install -y wget epel-release gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen zlib-devel pcre-devel lmdb-devel libxml2-devel ssdeep-devel lua-devel libtool autoconf automake
安装最新版 libmaxminddb
$ wget https://github.com/maxmind/libmaxminddb/releases/download/1.6.0/libmaxminddb-1.6.0.tar.gz
$ tar -zxvf libmaxminddb-1.6.0.tar.gz
$ cd libmaxminddb-1.6.0
$ ./configure
$ make
$ make check
$ make install
$ ldconfig
安装 ModSecurity
$ 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 --with-maxmind=/usr/local
$ make && make install
出现
fatal: No names found, cannot describe anything.
报错忽略即可
如果连接不上 git 可以使用 代理服务
下载用于 ModSecurity
的 nginx
连接器
$ git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
确定当前 nginx 版本
$ nginx -v
nginx version: nginx/1.20.1
下载与安装版本对应的源代码
$ wget http://nginx.org/download/nginx-1.20.1.tar.gz
$ tar -zxvf nginx-1.20.1.tar.gz
$ cd nginx-1.20.1
编译动态模块,复制到 nginx
模块标准目录
# 查看当前 nginx 编译参数
$ nginx -V
# 复制 nginx 所有参数,删除所有 --add-module 选项
$ ./configure --add-dynamic-module=../ModSecurity-nginx ...
$ make modules
$ cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/
如果需要 openssl,下载 www.openssl.org/source/openssl-1.1... 解压之后再修改
--with-openssl
参数路径
修改 nginx
配置文件,在主配置文件 events
上加入一行,具体路径根据自己 nginx
模块路径来定
load_module modules/ngx_http_modsecurity_module.so;
ModSecurity 配置
建立 ModSecurity 配置文件夹
$ cd /etc/nginx
$ mkdir modesc
# 将默认配置拷贝进去,从 ModSecurity 安装目录
$ cp /root/ModSecurity/modsecurity.conf-recommended /etc/nginx/modesc/modsecurity.conf
$ cp /root/ModSecurity/unicode.mapping /etc/nginx/modesc/
$ vim modsecurity.conf
# 将 SecRuleEngine 修改为 On
SecRuleEngine On
# 在之后添加一行,日志改为 json 格式
SecAuditLogFormat JSON
创建 ModSecurity
主配置文件
$ vim /etc/nginx/modsec/main.conf
# 写入如下内容
include modsecurity.conf
# 测试内容,测试完毕删除
SecRule ARGS:testparam "@contains test" "id:1234,deny,log,status:403"
修改 nginx vhost
配置测试一下
server {
...
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
...
}
$ nginx -s reload
# 返回 403 Forbidden 说明配置成功
$ curl -D http://localhost/foo?testparam=test
启用 OWASP CRS 规则
$ cd /etc/nginx/modsec
$ wget -O coreruleset-3.3.2.tar.gz https://codeload.github.com/coreruleset/coreruleset/tar.gz/refs/tags/v3.3.2
$ tar -zxvf coreruleset-3.3.2.tar.gz
$ cd coreruleset-3.3.2
$ cp crs-setup.conf.example crs-setup.conf
在 modsec/main.conf
配置文件里引入 CRS
配置和规则
$ vim /etc/nginx/modsec/main.conf
include coreruleset-3.3.2/crs-setup.conf
include coreruleset-3.3.2/rules/*.conf
测试 CRS, 返回 403 Forbidden,说明WAF防护已经生效,此处匹配的规则是user-agent中不能包含漏洞扫描器名字
$ curl -H "User-Agent: Nikto" http://localhost
误报处理
查看文档 搜索 Step 7: First Encounter with False Alerts
本作品采用《CC 协议》,转载必须注明作者和本文链接