> 技术文档 > 开源WAF--ModSecurity编译安装教程(Ubuntu20.04,Nginx)_modsecurity安装

开源WAF--ModSecurity编译安装教程(Ubuntu20.04,Nginx)_modsecurity安装


前言

        官网介绍如下:        

        ModSecurity是目前世界上使用最多的开源WAF产品,可谓是WAF界的鼻祖,很多其他WAF产品都或多或少受其影响,如OpenWAF。
        ModSecurity目前被景安网络(www.zzidc.com)所使用,用于对20万个网站进行基础的网站漏洞入侵防护,本站中文手册由原景安网络产品经理-王子,通过对比原版英文帮助文档,以及加上个人使用ModSecurity的经验进行翻译,尽量让阅读者可以通顺的理解相关说明。中文手册将由其本人定期(每月一次)检查,确保与原版英文帮助文档保持一致。

ModSecurity功能介绍
  • SQL Injection (SQLi):阻止SQL注入
  • Cross Site Scripting (XSS):阻止跨站脚本攻击
  • Local File Inclusion (LFI):阻止利用本地文件包含漏洞进行攻击
  • Remote File Inclusione(RFI):阻止利用远程文件包含漏洞进行攻击
  • Remote Code Execution (RCE):阻止利用远程命令执行漏洞进行攻击
  • PHP Code Injectiod:阻止PHP代码注入
  • HTTP Protocol Violations:阻止违反HTTP协议的恶意访问
  • HTTPoxy:阻止利用远程代理感染漏洞进行攻击
  • Sshllshock:阻止利用Shellshock漏洞进行攻击
  • Session Fixation:阻止利用Session会话ID不变的漏洞进行攻击
  • Scanner Detection:阻止黑客扫描网站
  • Metadata/Error Leakages:阻止源代码/错误信息泄露
  • Project Honey Pot Blacklist:蜜罐项目黑名单
  • GeoIP Country Blocking:根据判断IP地址归属地来进行IP阻断

项目的 Github 地址:https://github.com/owasp-modsecurity/ModSecurity

编译安装教程

        本文的教程是在 Ubuntu 20.04 系统上,通过 nginx 来使用 ModSecurity。先是通过 ModSecurity 源码编译得到 ModSecurity 的库文件,然后通过 Nginx源码、ModSecurity-Nginx-master 连接器来编译安装集成了 ModSecurity 的 Nginx,接着配置使用 CoreRuleSet 规则集(一个开源的 Web 应用防火墙规则集),最后设置 Nginx 为系统服务。

一、更新软件包

sudo apt update -ysudo apt upgrade -y

二、安装相关依赖包

sudo 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 \\libpcre2-dev libmaxminddb-dev libfuzzy-dev -y

三、下载资源文件

# ①下载 coreruleset(我这里用的是 4.4.0 版本)# https://github.com/coreruleset/coreruleset/releases​# ②下载 ModSecurity-nginx-master(我这里用的是 1.0.3 版本)(最后一个版本)# https://objects.githubusercontent.com/github-production-release-asset-2e65be/37931803/bb867f56-6622-4715-aaea-9bfa8840fc83?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250425%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250425T072051Z&X-Amz-Expires=300&X-Amz-Signature=8e06a89a1eb060581afa41a8cb1f15a994beb6d7c9bf73ada72be2b58b30d30c&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dmodsecurity-nginx-v1.0.3.tar.gz&response-content-type=application%2Foctet-stream​# ③下载 nginx-1.20.1.tar.gz# http://nginx.org/download/nginx-1.20.1.tar.gz

四、编译 ModSecurity

Clone ModSecurity 的 Github 项目
# clone modsecurity 项目git clone https://github.com/owasp-modsecurity/ModSecurity.git modsecurity# 网络问题,可以通过设置临时代理来解决(本机需要挂节点,clash 系一般是 7897 端口)export http_proxy=http://127.0.0.1:7897export https_proxy=http://127.0.0.1:7897# 设置后验证一下curl -v https://www.google.com# 再次 git clone 项目git clone https://github.com/owasp-modsecurity/ModSecurity.git modsecurity
初始化并更新 git 子模块
git submodule initgit submodule update
进入到 modsecurity 子目录,然后运行 build.sh
./build.sh 

运行 configure
./configure 
  
执行 make 命令
make

make 执行完后( make 需要一些时间),执行 make install 进行安装
sudo make install

编译得到的相关库应该是在 /usr/local/modsecurity/lib/ 目录里

添加 modsecurity 相关库文件的路径到环境变量中
sudo sh -c \'echo \"/usr/local/modsecurity/lib\" > /etc/ld.so.conf.d/modsecurity.conf\'sudo ldconfig

五. 编译安装支持 ModSecurity 的 Nginx

解压缩 Modsecurity-nginx-master.zipnginx-1.20.1.tar.gz
unzip resources/ModSecurity-nginx-master.zip -d .# 解压 ModSecurity-nginx-master.zip(连接器)tar -zxvf resources/nginx-1.20.1.tar.gz -C .# 解压 nginx-1.20.1.tar.gz
现在的目录结构图

创建 Nginx 用户和组
# 创建nginx组(如果还没有)sudo groupadd -r nginx​# 创建nginx用户sudo useradd -r -g nginx -s /sbin/nologin -d /usr/local/nginx nginx
配置 Nginx
# 进入到 nginx 目录cd nginx-1.20.1# 配置 Nginxsudo ./configure \\   --user=nginx \\   --group=nginx \\   --with-pcre-jit \\   --with-debug \\   --with-compat \\   --with-http_ssl_module \\   --with-http_realip_module \\   --add-module=../ModSecurity-nginx-master \\   --http-log-path=/var/log/nginx/access.log \\   --error-log-path=/var/log/nginx/error.log \\   --with-cc-opt=\"-Wno-deprecated-declarations\"

编译 nginx
sudo make

安装 nginx
sudo make install

确保日志目录具有正确的权限
sudo mkdir -p /var/log/nginxsudo chown -R nginx:nginx /var/log/nginx
创建 Nginx 二进制文件的符号链接
sudo ln -sf /usr/local/nginx/sbin/nginx /usr/sbin/nginx
验证 Nginx 是否安装成功
nginx -V

六、使用 ModSecurity 配置 Nginx

复制 modsecurity.conf-recommendedunicode.mapping 文件到 /usr/local/nginx/conf 文件夹下

(modsecurity.conf-recommended 和 unicode.mapping 都位于 modsecurity 文件夹下)

执行以下两条命令
sudo cp modsecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.confsudo cp modsecurity/unicode.mapping /usr/local/nginx/conf/
修改 Nginx 配置文件
# 备份sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak# 编辑 /usr/local/nginx/conf/nginx.conf 文件,添加两行内容(如下图)

解压缩 coreruleset.zip/usr/local/nginx/conf 文件夹下
sudo unzip resources/coreruleset.zip -d /usr/local/nginx/conf/
重命名 coreruleset/crs-setup.conf.examplecoreruleset/crs-setup.conf
sudo mv /usr/local/nginx/conf/coreruleset/crs-setup.conf.example /usr/local/nginx/conf/coreruleset/crs-setup.conf
修改 modsecurity.conf 文件
# SecRuleEngine为on,并在末尾增加如下配置(注意修改路径):Include /usr/local/nginx/conf/coreruleset/crs-setup.confInclude /usr/local/nginx/conf/coreruleset/rules/*.conf

验证 nginx 配置有没有问题
sudo nginx -t

启动 nginx
sudo nginx
验证是否成功配置并启动
curl localhost?doc=/bin/ls

七、设置 Nginx 为系统服务

编辑文件 /etc/systemd/system/nginx.service
# sudo nano /etc/systemd/system/nginx.service# 添加以下内容[Unit]Description=The NGINX HTTP and reverse proxy server with ModSecurityAfter=network.target​[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStartPre=/usr/local/nginx/sbin/nginx -tExecStart=/usr/local/nginx/sbin/nginxExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true​[Install]WantedBy=multi-user.target
然后启用并启动服务
sudo systemctl daemon-reloadsudo systemctl enable nginxsudo systemctl start nginx
你可以使用以下命令管理 Nginx
sudo systemctl start nginx    # 启动sudo systemctl stop nginx     # 停止sudo systemctl restart nginx  # 重启sudo systemctl reload nginx   # 重新加载配置sudo systemctl status nginx   # 查看状态