Nginx安装ModSecurity开源网站防火墙

1. ModSecurity 简介

官网:https://modsecurity.org/

GitHub 开源地址:https://github.com/owasp-modsecurity/ModSecurity

Nginx 版本:https://github.com/owasp-modsecurity/ModSecurity-nginx

规则:https://github.com/coreruleset/coreruleset

 

ModSecurity 是一个开源的、跨平台的 Web 应用程序防火墙(WAF)引擎。它最初是作为 Apache HTTP 服务器的一个模块开发的,现在已经可以作为独立程序运行,也可以集成到其他 Web 服务器中,如 Nginx 和 IIS 等。

ModSecurity 的主要目标是保护 Web 应用程序免受各种攻击,提高 Web 应用的安全性。它通过实时监控 HTTP 流量,对请求进行分析和过滤,来检测和阻止潜在的恶意活动。

作为一个功能强大且灵活的 WAF 引擎,ModSecurity 具有以下主要特点:

实时流量监控和访问控制
虚拟补丁功能,快速修复 Web 应用漏洞
完整的 HTTP 流量日志记录
持续的安全评估
与其他安全组件集成
ModSecurity 采用灵活的规则语言,管理员可以自定义规则来检测和阻止特定类型的攻击。同时它还提供了一套完整的默认规则集(OWASP ModSecurity 核心规则集),可以防御常见的 Web 攻击。

总的来说,ModSecurity 是一个功能全面、配置灵活的开源 WAF 解决方案,被广泛应用于保护各种规模的 Web 应用程序。

2. 安装环境准备

2.1,安装依赖库


# 更新包
sudo yum update
# 安装依赖
yum install -y gcc make pcre-devel libxml2 libxml2-devel curl-devel httpd-devel libtool 

2.2,安装依赖库


yum install dnf
dnf install -y unzip wget epel-release
yum install -y git

2.3,安装依赖库


dnf install -y gcc-c++ flex bison yajl lua curl-devel curl zlib-devel pcre-devel 
# 返回
pcre2-devel libxml2-devel ssdeep-devel libtool autoconf automake make libmaxminddb 

2.4,查看 g++的版本:版本需要大于等于 7.3,否则不支持 C++17 标准


g++ --version
# 返回
g++ (GCC) 11.4.1 20231218 (Red Hat 11.4.1-3)
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


# 将 gcc/g++ 升级为 12.2 版本
wget https://mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-12.2.0/gcc-12.2.0.tar.gz
# 解压
tar -zxvf gcc-12.2.0.tar.gz
rm -rf gcc-12.2.0.tar.gz
mv gcc-12.2.0 gcc
cd gcc

vim ./contrib/download_prerequisites
./contrib/download_prerequisites
ll

../configure --enable-checking=release --enable-languages=c,c++ -disable-multilib


make 
make install
gcc --version
g++ -v && gcc -v

 
#需要注意的是 scl 命令启用只是临时的,退出 shell 或重启就会恢复原系统 gcc 版本。
#如果要长期使用 gcc 8.3 的话:
 
#echo "source /opt/rh/devtoolset-8/enable" >>/etc/profile

2.5,创建安装文件夹即授权用户


#创建文件夹
mkdir -p /www/server
#创建用户组 www
groupadd www

#创建新用户 www,设置用户组为 www,密码 nginx_modsecurity
useradd www -g www -p nginx_modsecurity

#给文件夹授权
chown -R www /www

# 进去安装目录
cd /www/server

3. 下载和安装 ModSecurity



# 克隆项目代码
git clone --recursive https://github.com/owasp-modsecurity/ModSecurity ModSecurity
# 完成后进入源码目录
cd ModSecurity/
# 开始安装
git submodule init
git submodule update
./build.sh
# 开始编译
./configure
make
make install
# 安装完成,查看所安装的目录
ls /usr/local/modsecurity/
# 返回
bin  include  lib

ls /usr/local/modsecurity/bin/
# 返回
modsec-rules-check

4. 安装 Nginx 以及 Nginx 的插件


# 克隆项目代码
git clone https://github.com/owasp-modsecurity/ModSecurity-nginx.git
# 移动到目录
mv ModSecurity-nginx/ /www/server

cd /www/server
# 下载安装 Nginx
wget https://nginx.org/download/nginx-1.27.3.tar.gz
# 解压
tar -zxvf nginx-1.27.3.tar.gz
rm -rf nginx-1.27.3.tar.gz
mv nginx-1.27.3 nginx
cd nginx

#隐藏版本号与 WEB 服务器信息
#修改 49 行
vim /www/server/nginx/src/http/ngx_http_header_filter_module.c +49 
static u_char ngx_http_server_string[] = "Server: staros" CRLF;    #Server 后写上你自定义的服务器信息

#修改 36 行
vim /www/server/nginx/src/http/ngx_http_special_response.c +36
"<hr><center>staros</center>" CRLF    #再写一遍刚才的字符串

# 配置
./configure --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-http_auth_request_module --add-module=/www/server/nginx/src/ngx_http_substitutions_filter_module-master --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module --add-module=/www/server/ModSecurity-nginx 

#编译并安装
make && make install

# 配置 nginx
vi nginx.conf 
# 添加用户
user  www www;

#编辑 service 文件
vi /usr/lib/systemd/system/nginx.service 

# 输入内容
[root@localhost html]# more /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx-The High-performance HTTP Server
After=network.target


[Service]
Type=forking
PIDFile=/www/server/nginx/logs/nginx.pid
ExecStartPre=/www/server/nginx/sbin/nginx -t -c /www/server/nginx/conf/nginx.conf
ExecStart=/www/server/nginx/sbin/nginx -c /www/server/nginx/conf/nginx.conf
ExecReload=/www/server/nginx/sbin/nginx -s reload
ExecStop=/www/server/nginx/sbin/nginx -s stop
PrivateTmp=true


[Install]
WantedBy=multi-user.target


#重新加载 systemd 服务
systemctl daemon-reload 
#启动服务
systemctl start nginx 
#查看状态
systemctl status nginx 
#查看安装情况
nginx -V

 5. 安装 modsecurity 规则

准确来说 ModSecurity 并不是一款 “WAF”,而是一个 “WAF 规则集”,ModSecurity 是绝大部分 WAF 的底层基石,它并不包含其他 WAF 常见的网站管理、日志管理等功能,甚至完全没有界面,ModSecurity 有的只是防护规则。


#创建存放文件夹
mkdir /www/server/nginx/modsecurity
cd /www/server/nginx/modsecurity
#克隆规则
git clone https://github.com/coreruleset/coreruleset.git
#进入下载后的规则目录
cd coreruleset/
#拷贝规则
cp -r rules/ /www/server/nginx/modsecurity/
cp crs-setup.conf.example /www/server/nginx/modsecurity/crs-setup.conf
cp /opt/source/modsecurity/ModSecurity/modsecurity.conf-recommended  /www/server/nginx/modsecurity/modsecurity.conf
cp /opt/source/modsecurity/ModSecurity/unicode.mapping /www/server/nginx/modsecurity/  
 
 
#在 nginx 下的 server 文件中增加两行:
modsecurity on;
modsecurity_rules_file /www/server/nginx/modsecurity/modsecurity.conf; 

#配置 modsecurity
vi modsecurity.conf  
#打开引擎
SecRuleEngine On
#末尾处添加
include /www/server/nginx/modsecurity/crs-setup.conf
include /www/server/nginx/modsecurity/rules/*.conf

#重启服务
systemctl restart nginx

6. 测试

访问 url 加特殊字符串
输入

http://localhost/?s=<script>alert(1);</script>

 

7. 异常处理

7.1 安装 nginx 时报错



./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl= option.

原因:缺少 openssl 的开发库

处理方法:yum install openssl-devel


yum install openssl-devel
© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...