# 使用 ModSecurity 保护 Nginx 站点

ModSecurity 是一个开源的跨平台 WAF (WEB 应用程序防火墙)
本次给 Nginx 安装 ModSecurity WAF 并使用 OWASP ModSecurity 规则集,基于 Ubuntu 22 (jammy) 和宝塔面板
命令的默认执行位置都为 ~(root目录) ,且均使用 root 用户执行
在执行下列步骤前,请编译安装 nginx 1.23 或更高版本

# 准备工作

执行下列指令安装前置包:

apt install g++ flex bison curl apache2-dev doxygen libyajl-dev ssdeep liblua5.2-dev libgeoip-dev libtool dh-autoreconf libcurl4-gnutls-dev libxml2 libpcre++-dev libxml2-dev git liblmdb-dev libpkgconf3 lmdb-doc pkgconf zlib1g-dev libssl-dev libfuzzy-dev -y

# 编译 ssdeep

此步是因为博主在编译 ModSecurity 时无法识别 apt 安装的 ssdeep,可以先跳过此步,后续配置时出现问题再执行

执行下列指令即可:

wget https://github.com/ssdeep-project/ssdeep/releases/download/release-2.14.1/ssdeep-2.14.1.tar.gz
tar zxf ssdeep-2.14.1.tar.gz
cd ssdeep-2.14.1
./configure
make
make install

# 编译 ModSecurity

wget https://github.com/SpiderLabs/ModSecurity/releases/download/v3.0.8/modsecurity-v3.0.8.tar.gz
tar xzf modsecurity-v3.0.8.tar.gz
cd modsecurity-v3.0.8
./build.sh

出现 fatal: not a git repository (or any of the parent directories): .git 这条信息是可以忽略的

随后:

./configure

等到命令执行完成后,请确保 --- 后面的内容冒号后均为 enabledisablefound
如果出现 ssdeep: not found 请参考前面的步骤执行编译安装 ssdeep
其他 not found 请使用 apt 安装对应包 (一般不会出现)

然后:

make
make install

即可

# 安装 Nginx ModSecurity 支持模块

cd /www/server
git clone https://github.com/SpiderLabs/ModSecurity-nginx.git

编辑 /www/server/panel/install/nginx.sh 文件,在 ./configure 这一行的末端添加:

--add-module=/www/server/ModSecurity-nginx

随后:

sh /www/server/panel/install/nginx.sh install 1.23

# 使用 OWASP 规则集

# 下载并配置规则集

mkdir /www/server/nginx/conf/modsecurity
cd ModSecurity
cp modsecurity.conf-recommended /www/server/nginx/conf/modsecurity/modsecurity.conf
cp unicode.mapping /www/server/nginx/conf/modsecurity

下载规则:

wget http://www.modsecurity.cn/download/corerule/owasp-modsecurity-crs-3.3-dev.zip
unzip owasp-modsecurity-crs-3.3-dev.zip
cd owasp-modsecurity-crs-3.3-dev
cp crs-setup.conf.example /www/server/nginx/conf/modsecurity/crs-setup.conf
cp -r rules/ /www/server/nginx/conf/modsecurity
cd /www/server/nginx/conf/modsecurity/rules/
cp REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example.back
cp RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example.back
cp RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example.back RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
cp REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example.back REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf

# 修改配置

修改 nginx 配置,在 http 层添加如下配置:

modsecurity on;
modsecurity_rules_file /www/server/nginx/conf/modsecurity/modsecurity.conf;

编辑 modsecurity.conf , 将 SecRuleEngine DetectionOnly 修改为 SecRuleEngine On ,并在后面添加如下内容:

Include /www/server/nginx/conf/modsecurity/crs-setup.conf
Include /www/server/nginx/conf/modsecurity/rules/*.conf

# 验证安装

打开如下地址:

<url>/?param=*><script>alert(1)</script>

请将 <url> 替换为你的测试地址 (不需要带括号)
如果出现 403 则安装成功

# 参考文章