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

github 地址

$ 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 可以使用 代理服务

下载用于 ModSecuritynginx 连接器

$ 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 规则

github 地址

$ 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

官方文档

ModSecurity 中文手册

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!