概述
商业级的Web应用防火墙(WAF)通常是保护网站安全的首选工具,但它们可能会带来高昂的成本,对于预算有限的小型企业或初创公司来说,这并不是一个可行的解决方案。此外,即使是拥有充足资源的大型企业,也可能在寻找更灵活、更适应其特定需求的安全解决方案。
这就是为什么Nginx结合ModSecurity的方案成为了一个理想的选择。这个组合不仅成本效益高,而且提供了强大的安全性,可以与大多数商业WAF相媲美。它特别适用于以下场景:
- 预算有限的业务:对于那些没有资源投入昂贵安全解决方案的小型企业或个人项目,Nginx加ModSecurity提供了一个成本低廉甚至免费的选择。
- 定制化需求:有些企业需要根据特定的业务逻辑和流量模式定制规则集,ModSecurity的开源特性使得个性化配置成为可能。
- 敏捷开发环境:在快速迭代的开发过程中,能够快速调整和应用安全规则是至关重要的,Nginx和ModSecurity的组合可以灵活适应这种需求。
- 教育和研究机构:学习和研究网络安全时,能够接触和操作实际的安全工具是一个巨大的优势,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;"]