Nginx 和 ModSecurity 加强 Web 应用程序的安全性

在当今互联网时代,Web 应用程序的安全性变得尤为重要。为了保护应用程序和用户的数据免受恶意攻击和漏洞利用,使用合适的工具和技术是必不可少的。本文将探讨如何使用两个流行的工具——Nginx 和 ModSecurity,来加强 Web 应用程序的安全性。

Nginx:

Nginx 是一个高性能的开源 Web 服务器和反向代理服务器。 它以其高效的处理能力和低系统资源消耗而闻名。 Nginx 提供了丰富的功能和灵活的配置选项,使其成为构建安全的 Web 应用程序的理想选择。 本篇文章不过多介绍Nginx

ModSecurity:

ModSecurity 是一个开源的 Web 应用程序防火墙(WAF),可以在 Apache、Nginx、IIS 等 Web 服务器上运行。它可以保护 Web 应用程序免受各种攻击,如 SQL 注入、跨站脚本(XSS)、远程文件包含(RFI)、本地文件包含(LFI)、代码注入等。

ModSecurity 可以通过在 Web 服务器前安装并配置规则来检测和阻止恶意请求。这些规则可以定义模式匹配、黑名单、白名单、IP 地址过滤、HTTP 方法限制等,以便监视和阻止潜在的攻击。

ModSecurity 采用基于引擎的设计,可以通过自定义插件和脚本来增强其功能。它还提供了实时日志记录和通知机制,以便管理员及时了解 Web 应用程序的安全状态。

ModSecurity 是一种有效的 Web 应用程序安全解决方案,可以帮助保护 Web 应用程序免受各种攻击,并提高应用程序的安全性和可靠性。

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阻断

WAF插件防护原理

为什么要使用 Nginx 和 ModSecurity

强大的安全特性:

Nginx 提供了一系列的安全功能,如 SSL/TLS 支持、访问控制、缓存控制等。 ModSecurity 则通过实施规则集来检测和拦截常见的 Web 应用程序攻击,如 SQL 注入、跨站脚本(XSS)等。

高性能和可扩展性:

Nginx 的事件驱动架构使其能够处理大量并发请求,并具有出色的性能表现。 ModSecurity 的模块化设计允许根据需求定制规则,并且可以与其他安全工具和应用程序集成。

使用 Nginx 和 ModSecurity 的步骤

  1. 环境以centos为主
1
2
yum install -y epel-release
yum install -y readline-devel curl-devel gcc gcc-c++ python-devel lua-devel doxygen perl yajl-devel GeoIP-devel lmdb-devel ssdeep-devel flex bison autoconf automake 作者:行走的_ID https://www.bilibili.com/read/cv28310905/ 出处:bilibili
  1. 安装ModSecurity
1
2
3
4
5
6
7
8
cd /usr/local
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 modsecurity
cd modsecurity
sh build.sh
./configure
make && make install
  1. 安装ModSecurity-nginx

关于ModSecurity-nginx

ModSecurity-nginx 是将 ModSecurity WAF(Web 应用程序防火墙)与 Nginx Web 服务器结合使用的模块。它允许在 Nginx 上运行 ModSecurity 的规则集,以提供对 Web 应用程序的安全保护。

ModSecurity 是一个独立的开源项目,用于提供 Web 应用程序防火墙功能。它可以检测和阻止各种类型的攻击,如 SQL 注入、跨站脚本(XSS)、远程文件包含(RFI)等。ModSecurity 使用规则集来识别和阻止这些攻击,并提供配置灵活性以适应不同的应用程序需求。

而 ModSecurity-nginx 则是将 ModSecurity 引擎嵌入到 Nginx 中的模块,使得 Nginx 可以直接利用 ModSecurity 的功能。通过将 ModSecurity-nginx 模块添加到 Nginx 中,您可以在 Web 服务器级别上执行强大的 Web 应用程序防火墙功能,从而提高应用程序的安全性。

使用 ModSecurity-nginx,您可以轻松地将 ModSecurity 的规则集应用于 Nginx,以保护您的 Web 应用程序免受常见的网络攻击。它提供了一个集中的安全层,帮助您检测和阻止恶意请求,并提供实时日志记录和报警功能,以便及时响应潜在的安全问题。

源码地址:https://github.com/SpiderLabs/ModSecurity-nginx

1
2
unzip ModSecurity-nginx-master.zip
mv ModSecurity-nginx-master /usr/local/modsecurity-nginx
  1. 安装nginx

#卸载你之前的nginx, 备份你的nginx配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
systemctl stop nginx
find / -name nginx
rm -rf nginx 相关的文件
yum remove nginx # 先备份配置文件
wget -P /usr/local http://nginx.org/download/nginx-1.22.1.tar.gz
tar -zxvf nginx-1.22.1.tar.gz
cd /usr/local/nginx-1.22.1/

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --build=CentOS --http-log-path=/var/log/nginx/access.log --with-http_stub_status_module --add-module=/usr/local/modsecurity-nginx --with-http_ssl_module

make && make install
  1. 安装 systemd unit

1 打开一个文本编辑器,创建一个名为 nginx.service 的文件:

1
sudo vim /etc/systemd/system/nginx.service

2 将下面的文件复制进去

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[Unit]
Description=Nginx
After=network.target

[Service]
Type=forking
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

3 保存并关闭文件。

4 重新加载 systemd 配置:

1
sudo systemctl daemon-reload

5 启用 Nginx 服务:

1
sudo systemctl enable nginx

6 尝试启动 Nginx 服务:

1
sudo systemctl start nginx

6 启动nginx

1
2
3
4
5
6
1 创建nginx 用户
sudo useradd -r -s /sbin/nologin nginx
2 启动nginx
systemctl start nginx
3 查看 Nginx 状态
systemctl status nginx 

7 配置 ModSecurity 安全规则

1
2
3
1 mkdir -p /etc/nginx/modsecurity/
2 cp /usr/local/modsecurity/modsecurity.conf-recommended /etc/nginx/modsecurity/modsecurity.conf
3 cp /usr/local/modsecurity/unicode.mapping /etc/nginx/modsecurity/

4 下载规则文件

1
2
wget -P /usr/local/ http://www.modsecurity.cn/download/corerule/owasp-modsecurity-crs-3.3-dev.zip
unzip owasp-modsecurity-crs-3.3-dev.zip

5 复制 crs-setup.conf.example 到 /etc/nginx/modsecurity/ 目录下,并重命名为 crs-setup.conf

1
cp /usr/local/owasp-modsecurity-crs-3.3-dev/crs-setup.conf.example /etc/nginx/modsecurity/crs-setup.conf

6将下载的策略规则包解压后的rules文件夹里面的所有规则,复制到/etc/nginx/modsecurity/rules/ 目录下

1
cp -r rules/ /etc/nginx/modsecurity/

7 修改REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example与RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example两个文件的文件名,将”.example"删除,可将自己写的规则放置于此两个文件中;

1
2
3
cd /etc/nginx/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

8 配置nginx 在http或server节点中添加以下内容(具体根据你的业务配置):

1
2
3
4
5
#在配项目引入
#load_module modules/ngx_http_modsecurity_module.so;
在http 或者sever 配置
modsecurity on;
modsecurity_rules_file /usr/local/nginx/conf/modsecurity/modsecurity.conf;

9 编辑modsecurity.conf

1
2
3
4
5
6
7
8
9
cd /etc/nginx/modsecurity/
vim modsecurity.conf

SecRuleEngine DetectionOnly改为SecRuleEngine On

同时在文件末尾添加以下内容:

Include /path/crs-setup.conf
Include /path/rules/*.conf

10 记录审计日志

注释SecAuditLogParts ABIJDEFHZ 更改SecAuditLogParts ABCDEFHZ

11 检查nginx

1
nginx -t

12 重启nginx

1
systemctl restart nginx

13 测试

1
2
3
4
# 正常的访问
curl 'http://localhost/' -I
# 非正常访问,tail /var/log/nginx/access.log查看拦截信息
curl 'http://localhost/?id=1 AND 1=1' -I 

参考