ngx_waf编译安装踩坑记录

QQ截图20230826144706.png

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 安装避坑详解

# ngx_waf  nginx 

本文由:星际难民
实践,测试,整理发布.如需转载请注明地址 本文标题:ngx_waf编译安装踩坑记录
地址:https://530503.xyz/articles/2023/08/23/1693037697309.html

评论

取消