ngx_waf 是方便且高性能的 Nginx 防火墙模块
项目地址:https://github.com/ADD-SP/ngx_waf
https://docs.addesp.com/ngx_waf/zh-cn/
安装系统环境:Debian 10
1. 系统更新和准备环境
安装 nginx 编译依赖项
apt install build-essential libtool automake autoconf zlib1g-dev libpcre3-dev libssl-dev libxml2-dev libxslt1-dev libgd-dev libgeoip-dev libgoogle-perftools-dev libperl-dev libpam0g-dev libpcre++-dev libcurl4-openssl-dev libyajl-dev libmaxminddb-dev liblmdb-dev git
安装 ngx_waf 编译依赖项
apt install flex bison libsodium23 libsodium-dev libmodsecurity3 libmodsecurity-dev
2.下载源码
下载 Nginx
wget http://nginx.org/download/nginx-1.22.0.tar.gz
tar -xvf nginx-1.22.0.tar.gz
下载 ngx_waf
lts 版
git clone -b lts https://github.com/ADD-SP/ngx_waf.git
current版
git clone -b current https://github.com/ADD-SP/ngx_waf.git
3.配置依赖环境
uthash
配置
cd ../ngx_waf \
git clone -b v2.3.0 https://github.com/troydhanson/uthash.git lib/uthash
cjson
配置
cd ../ngx_waf \
git clone https://github.com/DaveGamble/cJSON.git lib/cjson
libsodium
配置
踩坑1
编译时遇到下面错误/root/nginx-1.22.0/
是我放 nginx 源码目录编译时在该目录没有找到libsodium
目录
objs/ngx_http_waf_module_modules.o \
-L /root/nginx-1.22.0/libsodium/lib -Wl,-Bstatic -l sodium -Wl,-Bdynamic \
...
解决方法编译libsodium
时--prefix
直接定义到 nginx 源码所在目录
如果--prefix
是定义在/usr/local/src
下编译好下可以移动到nginx 源码所在目录cp -r /usr/local/src/libsodium /root/nginx-1.22.0
cd /usr/local/src
git clone https://github.com/jedisct1/libsodium.git --branch stable libsodium-src
cd libsodium-src
./configure --prefix=/root/nginx-1.22.0/libsodium --with-pic
make && make install
4.libinjection配置
首先进入目录 ngx_waf
, make
一下
cd ../ngx_waf
make
踩坑2
编译时遇到下面错误,似乎是这个最新版的问题
../ngx_waf/inc/libinjection/src/libinjection_sqli.c
../ngx_waf/inc/libinjection/src/libinjection_sqli.c: In function ‘libinjection_version’:
../ngx_waf/inc/libinjection/src/libinjection_sqli.c:1213:12: error: ‘LIBINJECTION_VERSION’ undeclared (first use in this function); did you mean ‘LIBINJECTION_SQLI_H’?
return LIBINJECTION_VERSION;
^~~~~~~~~~~~~~~~~~~~
LIBINJECTION_SQLI_H
../ngx_waf/inc/libinjection/src/libinjection_sqli.c:1213:12: note: each undeclared identifier is reported only once for each function it appears in
../ngx_waf/inc/libinjection/src/libinjection_sqli.c:1214:1: error: control reaches end of non-void function [-Werror=return-type]
}
解决方法,那我们就不git clone
他最新版本了,下载上一个版本,解压后改下文件夹名称
cd ../ngx_waf/inc
wget https://github.com/libinjection/libinjection/archive/refs/tags/v3.9.2.zip
unzip v3.9.2.zip
mv libinjection-3.9.2/ libinjection
5.编译安装
这边只需要ngx_waf
的模块,需要完全静态编译nginx + ngx_waf 可以参考Debian编译安装 编译时加上 --add-module=../ngx_waf
cd /root/nginx-1.22.0
./configure --with-compat --add-dynamic-module=../ngx_waf
sed -i 's/^\(CFLAGS.*\)/\1 -fstack-protector-strong -Wno-sign-compare/' objs/Makefile
make modules
编译完成后我们进入objs
目录就能看到 编译完成的 ngx_http_waf_module.so
模块文件了,然后将它复制到 nginx
模块目录
cd /root/nginx-1.22.0/objs
cp ngx_http_waf_module.so /usr/lib/nginx/modules
编辑 /etc/nginx/nginx.conf 配置文件启用该模块
load_module modules/ngx_http_waf_module.so;
复制规则目录到/etc/nginx/
cp -r /root/ngx_waf/assets/rules /etc/nginx/
LTS 版本如果加载模块 nginx -t
出现报错
nginx: [emerg] dlopen() "/usr/lib/nginx/modules/ngx_http_waf_module.so" failed (libsodium.so.23...
可以安装 libsodium23
apt install libsodium23
current 版本如果加载模块 nginx -t
出现报错
nginx: [emerg] dlopen() "/usr/lib/nginx/modules/ngx_http_waf_module.so" failed (libmodsecurity.so...
可以安装 libmodsecurity-dev
apt install libmodsecurity-dev
配置语法可以查看官方指南
因为模块的配置比较复杂,为了降低使用难度,官方在这里列出了一些常见用法
官方进阶指南配置语法
6.下载官方构建好的模块
docker 镜像地址 https://hub.docker.com/r/addsp/ngx_waf-prebuild/tags
使用这个方法安装需要 机器上有安装 docker
进入ngx_waf源码assets
目录
cd /root/ngx_waf/assets
通过执行脚本 download.sh 来下载动态模块
# 用于nginx-1.22.0的LTS版的模块
sh download.sh 1.22.0 lts
# 用于nginx-1.22.0的最新版的模块
sh download.sh 1.22.0 current
# 执行成功后会有如下输出
checking for command ... yes
checking for libc implementation ... yes
+ GNU C libary
Pulling remote image addsp/ngx_waf-prebuild:ngx-1.22.0-module-lts-glibc
ngx-1.22.0-module-lts-glibc: Pulling from addsp/ngx_waf-prebuild
下载成功,模块 ngx_http_waf_module.so 会被保存在当前目录下直接拿去用就好了,免去前面编译的一大堆步骤!!!
参考:
官方进阶指南配置语法
ngx_waf:一款高大全的 Nginx 网站防火墙模块
ngx_waf:方便且高性能的 Nginx 防火墙模块
ngx_waf 安装避坑详解