编译安装nginx+Modsecurity
字数 1375 2025-08-12 11:33:54
Nginx + ModSecurity 编译安装与配置指南
0x01 前言
本指南详细介绍了如何从源码编译安装Nginx并集成ModSecurity Web应用防火墙(WAF)。通过此配置,可以为网站提供强大的安全防护,有效抵御各类Web攻击。
0x02 准备工作
2.1 系统要求
- Linux操作系统(本指南以CentOS为例)
- root权限
- 稳定的网络连接
2.2 所需软件包
需要下载以下源码包:
-
核心组件:
nginx-1.18.0.tar.gz- Nginx主程序OpenSSL_1_1_1c.tar.gz- 加密库
-
安全模块:
ModSecurity- Web应用防火墙核心ModSecurity-nginx- Nginx连接器owasp-modsecurity-crs- OWASP核心规则集
-
功能模块:
lua-nginx-module- Lua脚本支持headers-more-nginx-module- HTTP头控制nginx-ct- 证书透明度支持
2.3 依赖安装
执行以下命令安装所有必要的依赖:
yum install -y libxml2 libxslt-devel gperftools pcre-devel libuuid-devel \
libxslt* libblkid-devel libudev-devel fuse-devel libedit-devel perl-ExtUtils-Embed \
at gcc-c++ python subversion gperf make rpm-build git curl bzip2-devel \
libcurl-devel gd gd-devel t1lib t1lib-devel libmcrypt libmcrypt-devel \
libtidy libtidy-devel GeoIP-devel libatomic_ops-devel zlib-devel unzip \
libstdc++* net-snmp net-snmp* gmp gmp-devel openldap openldap-devel \
libpcap-devel glib2-devel GeoIP-devel libxml2-devel redis vim wget git \
htop iftop libtool make automake mlocate pam-devel unzip gcc screen \
iptables-services bash-completion* pcre-devel libxslt* perl-ExtUtils-Embed \
at python subversion gperf make rpm-build git curl bzip2-devel libcurl-devel \
gd t1lib t1lib-devel libmcrypt libmcrypt-devel libtidy libtidy-devel \
GeoIP-devel zlib-devel unzip libstdc++* net-snmp net-snmp* gmp gmp-devel \
openldap openldap-devel net-tools luajit
2.4 源码下载
创建工作目录并下载所有必要的源码:
mkdir /opt/nginx
cd /opt/nginx/
# 下载各模块
git clone https://github.com/openresty/headers-more-nginx-module.git
git clone https://github.com/openresty/lua-nginx-module.git
git clone https://github.com/grahamedgecombe/nginx-ct.git
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1c.tar.gz
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
wget https://nginx.org/download/nginx-1.18.0.tar.gz
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
# 解压压缩包
tar -zxvf nginx-1.18.0.tar.gz && rm -f nginx-1.18.0.tar.gz
tar -zxvf OpenSSL_1_1_1c.tar.gz && rm -f OpenSSL_1_1_1c.tar.gz
0x03 编译安装
3.1 OpenSSL安装
cd openssl-OpenSSL_1_1_1c
./config --prefix=/usr
make && make install
ldconfig
# 验证安装
openssl version
3.2 ModSecurity编译安装
cd /opt/nginx/ModSecurity
# 初始化子模块
git submodule init
git submodule update
# 构建
./build.sh
# 配置、编译和安装
./configure && make && make install
3.3 Nginx编译安装
cd /opt/nginx/nginx-1.18.0/
# 配置编译参数
./configure \
--prefix=/usr/local/nginx/nginx \
--with-cc-opt=-O2 \
--with-ld-opt='-Wl,-rpath,/usr/local/nginx/luajit/lib -Wl,-E' \
--sbin-path=/usr/sbin/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/var/run/nginx.pid \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--lock-path=/var/lock/nginx.lock \
--with-http_gunzip_module \
--with-pcre --with-pcre-jit \
--with-http_perl_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-http_addition_module \
--with-http_xslt_module \
--with-http_image_filter_module \
--with-http_geoip_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-select_module \
--with-poll_module \
--with-file-aio \
--with-http_degradation_module \
--with-libatomic \
--http-client-body-temp-path=/var/tmp/nginx/client_body \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--add-dynamic-module=/opt/nginx/ModSecurity-nginx \
--with-stream \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--add-module=/opt/nginx/headers-more-nginx-module
# 编译和安装
make && make install
# 创建临时目录
mkdir -p /var/tmp/nginx/client_body
# 验证安装
nginx -V
0x04 ModSecurity配置
4.1 配置文件准备
mkdir /usr/local/nginx/modsecurity
cp /opt/nginx/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/modsecurity/modsecurity.conf
cp /opt/nginx/owasp-modsecurity-crs/crs-setup.conf.example /usr/local/nginx/modsecurity/crs-setup.conf
cp -r /opt/nginx/owasp-modsecurity-crs/rules/ /usr/local/nginx/modsecurity/
cp /opt/nginx/ModSecurity/unicode.mapping /usr/local/nginx/modsecurity/unicode.mapping
# 创建包含文件
vim /usr/local/nginx/modsecurity/modsec_includes.conf
在modsec_includes.conf中添加以下内容:
include /usr/local/nginx/modsecurity/modsecurity.conf
include /usr/local/nginx/modsecurity/crs-setup.conf
include /usr/local/nginx/modsecurity/rules/*.conf
4.2 启用拦截功能
编辑modsecurity.conf:
vim /usr/local/nginx/modsecurity/modsecurity.conf
修改以下参数:
SecRuleEngine On
编辑CRS配置文件:
vim /usr/local/nginx/modsecurity/crs-setup.conf
注释掉默认的放行规则:
# SecDefaultAction "phase:1,log,auditlog,pass"
# SecDefaultAction "phase:2,log,auditlog,pass"
取消注释拦截规则:
SecDefaultAction "phase:1,log,auditlog,deny,status:403"
SecDefaultAction "phase:2,log,auditlog,deny,status:403"
4.3 审计日志配置
ModSecurity会记录详细的审计日志:
vim /var/log/modsec_audit.log
0x05 Nginx配置集成
5.1 加载ModSecurity模块
在nginx.conf顶部添加:
load_module /usr/local/nginx/nginx/modules/ngx_http_modsecurity_module.so;
5.2 启用ModSecurity
在需要保护的server或location块中添加:
modsecurity on;
modsecurity_rules_file /usr/local/nginx/modsecurity/modsec_includes.conf;
5.3 完整配置示例
load_module /usr/local/nginx/nginx/modules/ngx_http_modsecurity_module.so;
http {
server {
listen 80;
server_name localhost;
rewrite ^(.*)$ https://$host$1 permanent;
location / {
# 启用modsecurity
modsecurity on;
modsecurity_rules_file /usr/local/nginx/modsecurity/modsec_includes.conf;
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 443 ssl;
server_name localhost;
location / {
modsecurity on;
modsecurity_rules_file /usr/local/nginx/modsecurity/modsec_includes.conf;
root /home/wwwroot/www.example.com;
index index.html index.htm index.php;
}
}
}
0x06 验证与测试
- 重启Nginx服务:
nginx -t # 测试配置
nginx -s reload # 重新加载配置
- 测试ModSecurity是否正常工作:
- 尝试发送包含SQL注入或XSS攻击的请求
- 检查
/var/log/modsec_audit.log是否有相关拦截记录 - 正常请求应不受影响,恶意请求应返回403状态码
0x07 维护与优化
-
规则更新:
- 定期更新OWASP CRS规则集
- 根据业务需求调整规则敏感度
-
性能监控:
- 监控Nginx和ModSecurity的资源使用情况
- 根据性能指标调整规则或配置
-
日志管理:
- 设置日志轮转,防止日志文件过大
- 定期分析日志,发现潜在威胁
0x08 故障排除
-
编译问题:
- 确保所有依赖已安装
- 检查错误日志中的具体信息
-
运行问题:
- 检查Nginx错误日志
/var/log/nginx/error.log - 验证ModSecurity日志
/var/log/modsec_audit.log - 确保所有路径和权限设置正确
- 检查Nginx错误日志
-
性能问题:
- 调整
SecRuleEngine为DetectionOnly模式进行测试 - 优化规则,减少不必要的检查
- 调整
通过以上步骤,您已成功构建了一个集成了ModSecurity WAF的安全Nginx服务器,能够有效防护各类Web应用攻击。