概述

商业级的Web应用防火墙(WAF)通常是保护网站安全的首选工具,但它们可能会带来高昂的成本,对于预算有限的小型企业或初创公司来说,这并不是一个可行的解决方案。此外,即使是拥有充足资源的大型企业,也可能在寻找更灵活、更适应其特定需求的安全解决方案。

这就是为什么Nginx结合ModSecurity的方案成为了一个理想的选择。这个组合不仅成本效益高,而且提供了强大的安全性,可以与大多数商业WAF相媲美。它特别适用于以下场景:

  • 预算有限的业务:对于那些没有资源投入昂贵安全解决方案的小型企业或个人项目,Nginx加ModSecurity提供了一个成本低廉甚至免费的选择。
  • 定制化需求:有些企业需要根据特定的业务逻辑和流量模式定制规则集,ModSecurity的开源特性使得个性化配置成为可能。
  • 敏捷开发环境:在快速迭代的开发过程中,能够快速调整和应用安全规则是至关重要的,Nginx和ModSecurity的组合可以灵活适应这种需求。
  • 教育和研究机构:学习和研究网络安全时,能够接触和操作实际的安全工具是一个巨大的优势,ModSecurity作为一个开源工具,为教育和研究提供了实践的平台。

在本篇博客中,确保即使在没有商业WAF的情况下,您的网站也能安全无忧。

如何用Nginx和ModSecurity保护您的网站_waf

ModSecurity-官网: http://www.modsecurity.cn 

ModSecurity是一个开源、跨平台的Web应用防火墙(WAF),被称为WAF界的“瑞士军刀”。它是目前世界上使用最多的开源WAF产品,可谓是WAF界的鼻祖,用于对20万个网站进行基础的网站入侵防护。对于需要学习了解和部署使用waf的公司,不妨搭建一试。

一、服务器编译安装部署

a. 相关依赖安装

yum install -y wget epel-release
yum install -y gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen zlib-devel pcre-devel lmdb-devel libxml2-devel ssdeep-devel lua-devel libtool autoconf automake

b. Modsecurity 安装

cd /home/modsecurity
wget http://www.modsecurity.cn/download/modsecurity/modsecurity-v3.0.4.tar.gz
tar -zxvf modsecurity-v3.0.4.tar.gz
mv modsecurity-v3.0.4 /usr/local/modsecurity/modsecurity
sh build.sh
./configure
make
make install

请忽略 sh build.sh 中有关的git错误:

fatal: Not a git repository (or any of the parent directories): .git

ModSecurity-nginx 安装
ModSecurity-nginx 下载地址:

https://github.com/SpiderLabs/ModSecurity-nginx

mkdir modsecurity-nginx
unzip ModSecurity-nginx-master.zip
mv ModSecurity-nginx-master /usr/local/modsecurity-nginx

c. 安装geoip2模块

cd /usr/local
git clone https://github.com/leev/ngx_http_geoip2_module.git

d. nginx 安装

提示:这里面的编译路径,可自行根据具体情况进行修改

yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel automake autoconf libtool make GeoIP-devel.x86_64

mkdir /home/nginx
cd /home/nginx
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0/
./configure --prefix=/opt/nginx --add-module=/usr/local/modsecurity-nginx --add-module=/usr/local/ngx_http_geoip2_module --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_geoip_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl-opt='enable-weak-ssl-ciphers'
make
make install

e. nginx + ModSecurity-nginx 配置

在nginx的conf下创建文件夹modsecurity
并把 /usr/local/modsecurity/ 下的配置文件
modsecurity.conf-recommended > /opt/nginx/conf/modsecurity/modsecurity.conf 移动并重命名
unicode.mapping > /opt/nginx/conf/modsecurity

mkdir /opt/nginx/conf/modsecurity
cd /usr/local/modsecurity/
cp modsecurity.conf-recommended /opt/nginx/conf/modsecurity/modsecurity.conf
cp unicode.mapping /opt/nginx/conf/modsecurity

nginx.conf
在http或server节点中添加以下内容(在http节点添加表示全局配置,在server节点添加表示为指定网站配置)

modsecurity on;
modsecurity_rules_file /opt/nginx/conf/modsecurity/modsecurity.conf;

modsecurity.conf
SecRuleEngine DetectionOnly > SecRuleEngine On

#SecRuleEngine DetectionOnly
SecRuleEngine On

确保ModSecurity在记录审计日志时保存请求体IJ 改为 C

#SecAuditLogParts ABIJDEFHZ
SecAuditLogParts ABCDEFHZ


添加以下内容:


Include /opt/nginx/conf/modsecurity/crs-setup.conf
Include /opt/nginx/conf/modsecurity/rules/*.conf

f. 配置规则文件

下载规则文件压缩包

cd /home/modsecurity
wget http://www.modsecurity.cn/download/corerule/owasp-modsecurity-crs-3.3-dev.zip
unzip owasp-modsecurity-crs-3.3-dev.zip
cd owasp-modsecurity-crs-3.3-dev

复制crs-setup.conf.example到/opt/nginx/conf/modsecurity/下并重命名为crs-setup.conf

cp crs-setup.conf.example /opt/nginx/conf/modsecurity/crs-setup.conf

复制rules文件夹到==/opt/nginx/conf/modsecurity/==
修改文件名称,去掉 .example
REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example
RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example

cp -r rules /opt/nginx/conf/modsecurity/
cd /opt/nginx/conf/modsecurity/rules
mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
mv RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

出现提示不支持geoip啥的,把报错里面得rules对应配置规则给去掉即可

g. 重启nginx

/opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf

测试
可以清楚的看到后两条测试结果403,被拦截成功

[root@master conf.d]# curl http://localhost -I
HTTP/1.1 200 OK		
Server: nginx/1.16.1
Date: Tue, 18 Aug 2020 11:32:03 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 18 Aug 2020 11:17:22 GMT
Connection: keep-alive
ETag: "5f3bb8c2-264"
Accept-Ranges: bytes

[root@master conf.d]# curl 'http://localhost/?id=1 AND 1=1' -I
HTTP/1.1 403 Forbidden
Server: nginx/1.16.1
Date: Tue, 18 Aug 2020 11:32:35 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive

[root@master conf.d]# curl 'http://localhost/?search=<scritp>alert('xss');</script>' -I
HTTP/1.1 403 Forbidden
Server: nginx/1.16.1
Date: Tue, 18 Aug 2020 11:32:53 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive


二、打包Dockerfile,使用容器部署

温馨提示:

对于网络不好的兄弟,建议先下载所有所需文件,再修改下面,使用copy 参数 复制进去,最后进行打包

Dockerfile:

# 使用CentOS作为基础镜像
FROM centos:7

# 安装必要的依赖
RUN yum install -y wget epel-release \
    && yum install -y gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen zlib-devel pcre-devel lmdb-devel libxml2-devel ssdeep-devel lua-devel libtool autoconf automake

# 下载并安装Modsecurity
WORKDIR /home/modsecurity
RUN wget http://www.modsecurity.cn/download/modsecurity/modsecurity-v3.0.4.tar.gz \
    && tar -zxvf modsecurity-v3.0.4.tar.gz \
    && mv modsecurity-v3.0.4 /usr/local/modsecurity \
    && cd /usr/local/modsecurity \
    && sh build.sh \
    && ./configure \
    && make \
    && make install

# 忽略sh build.sh中的git错误

# 下载并安装ModSecurity-nginx
RUN wget https://github.com/SpiderLabs/ModSecurity-nginx/archive/master.zip \
    && unzip master.zip \
    && mv ModSecurity-nginx-master /usr/local/modsecurity-nginx

# 安装geoip2模块
WORKDIR /usr/local
RUN git clone https://github.com/leev/ngx_http_geoip2_module.git

# 安装nginx
RUN yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel automake autoconf libtool make GeoIP-devel.x86_64 \
    && mkdir /home/nginx \
    && cd /home/nginx \
    && wget http://nginx.org/download/nginx-1.24.0.tar.gz \
    && tar -zxvf nginx-1.24.0.tar.gz \
    && cd nginx-1.24.0/ \
    && ./configure --prefix=/opt/nginx --add-module=/usr/local/modsecurity-nginx --add-module=/usr/local/ngx_http_geoip2_module --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_geoip_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl-opt='enable-weak-ssl-ciphers' \
    && make \
    && make install

# 配置nginx和ModSecurity
RUN mkdir /opt/nginx/conf/modsecurity \
    && cp /usr/local/modsecurity/modsecurity.conf-recommended /opt/nginx/conf/modsecurity/modsecurity.conf \
    && cp /usr/local/modsecurity/unicode.mapping /opt/nginx/conf/modsecurity \
    && sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /opt/nginx/conf/modsecurity/modsecurity.conf \
    && sed -i 's/SecAuditLogParts ABIJDEFHZ/SecAuditLogParts ABCDEFHZ/' /opt/nginx/conf/modsecurity/modsecurity.conf

# 配置规则文件
WORKDIR /home/modsecurity
RUN wget http://www.modsecurity.cn/download/corerule/owasp-modsecurity-crs-3.3-dev.zip \
    && unzip owasp-modsecurity-crs-3.3-dev.zip \
    && mv owasp-modsecurity-crs-3.3-dev /opt/nginx/conf/modsecurity/crs \
    && cp /opt/nginx/conf/modsecurity/crs/crs-setup.conf.example /opt/nginx/conf/modsecurity/crs-setup.conf \
    && cp -r /opt/nginx/conf/modsecurity/crs/rules /opt/nginx/conf/modsecurity/ \
    && mv /opt/nginx/conf/modsecurity/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example /opt/nginx/conf/modsecurity/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf \
    && mv /opt/nginx/conf/modsecurity/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example /opt/nginx/conf/modsecurity/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

# 添加ModSecurity配置到nginx.conf
RUN echo 'modsecurity on;' >> /opt/nginx/conf/nginx.conf \
    && echo 'modsecurity_rules_file /opt/nginx/conf/modsecurity/modsecurity.conf;' >> /opt/nginx/conf/nginx.conf

# 暴露nginx运行的端口
EXPOSE 80 443

# 设置容器启动时运行的命令
CMD ["/opt/nginx/sbin/nginx", "-g", "daemon off;"]