ModSecurity 是一个开放源代码的 Web 应用防火墙 (WAF),可以帮助保护 Web 服务器免受各种攻击。以下是如何在 Nginx 上安装和配置 ModSecurity 的详细步骤。
一. 安装 ModSecurity
(1). 安装依赖
在安装 ModSecurity 之前,需要先安装一些必要的依赖库。以下是在基于 CentOS 的系统上的命令:
sudo yum update
sudo yum install -y gcc make pcre-devel libxml2 libxml2-devel curl-devel httpd-devel libtool
(2). 查看系统 g++ 版本,是否支持版本 C++17
g++ –version
如果看到版本号大于等于7.3,可以跳过下面 第3步,否则执行第3步: 升级 g++ 到一个支持 C++17 标准的版本。
(3).升级 g++
在CentOS系统中使用 yum 来安装开发工具集:
sudo yum install centos-release-scl
sudo yum install devtoolset-9
启用开发工具集来使用更新版本的 g++:
scl enable devtoolset-9 bash
上面命令会打开一个新的 shell,会将 g++ 的版本设置为 9。如果你想每次启动 shell 都启用开发工具集,可以将上述命令添加到你的 shell 配置文件中,例如 ~/.bashrc。
(4). 下载和编译 ModSecurity
从 GitHub 仓库下载 ModSecurity 源码并编译:
cd /usr/local/src
sudo git clone –depth 1 -b v3/master https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
sudo git submodule init
sudo git submodule update
sudo ./build.sh
sudo ./configure
sudo make
sudo make install
(5). 下载和编译 Nginx 连接器
ModSecurity 需要 Nginx 的连接器来工作。以下是下载和编译连接器的步骤:
cd /usr/local/src
sudo git clone –depth 1 http://github.com/SpiderLabs/ModSecurity-nginx.git
(6). 安装 Nginx 和编译模块
cd /usr/local/src
sudo wget https://nginx.org/download/nginx-1.xx.tar.gz #下载具体版本
sudo tar -zxvf nginx-1.xx.tar.gz
cd nginx-1.xx
sudo ./configure –with-compat –add-dynamic-module=/usr/local/src/ModSecurity-nginx
二. 配置 Nginx 使用 ModSecurity
配置 ModSecurity
创建并配置 ModSecurity 主配置文件:
sudo mkdir /etc/nginx/modsec
sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/unicode.mapping
编辑 /etc/nginx/modsec/modsecurity.conf,将 SecRuleEngine 设置为 On:
sudo nano /etc/nginx/modsec/modsecurity.conf
将 SecRuleEngine 设置为 On
SecRuleEngine On
- 配置 Nginx 虚拟主机使用 ModSecurity
在你的 Nginx 虚拟主机配置文件中启用 ModSecurity,例如 /etc/nginx/conf.d/default.conf:
server {
listen 80;
server_name test.com;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;
location / {
proxy_pass http://localhost:8080;
}
}
- 测试和重启 Nginx
检查 Nginx 配置是否正确,并重启 Nginx:
sudo nginx -t
sudo systemctl restart nginx
三. 配置 ModSecurity 规则
ModSecurity 的强大功能来自于其规则集。OWASP 提供了一组常用的 ModSecurity 核心规则 (CRS),可以有效地防御许多常见的 Web 攻击。
下载和配置 OWASP CRS
cd /etc/nginx/modsec
sudo git clone https://github.com/coreruleset/coreruleset.git
cd coreruleset
sudo cp crs-setup.conf.example crs-setup.conf
在 Nginx 配置文件中包含 CRS 规则:
server {
...
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;
# 加载 OWASP CRS 规则
include /etc/nginx/modsec/coreruleset/crs-setup.conf;
include /etc/nginx/modsec/coreruleset/rules/*.conf;
location / {
proxy_pass http://localhost:8080;
}
}
四. 创建自定义规则
比如我添加了自定义规则文件custom_rules.conf:
sudo nano /www/server/nginx/modsec/custom_rules.conf
我们添加一条规则阻止对 /tmp 目录的访问
SecRule REQUEST_URI “^/tmp[a-zA-Z0-9]*$” “id:1001,phase:2,pass,nolog”
SecRule REQUEST_URI “^/tmp” “id:1002,phase:2,deny,status:403,msg:’Access to /tmp directory is forbidden'”
规则解释:
这里我禁止了对/tmp目录的访问,但允许/tmp后面加字母和数字的目录,比如/tmpabc,是允许的,主要是防止误杀。
“id:1001″:每条规则需要一个唯一的 ID。
“phase:2″:这条规则将在请求处理的第二阶段执行(即在请求头被解析之后,通常适用于 URI 检查)。
“deny,status:403″:如果规则匹配,请求将被拒绝,并返回 403 禁止访问的状态码。
“msg:’Access to /tmp directory is forbidden'”:如果规则匹配,将在日志中记录这条消息。
然后修改modsecurity.conf包含自定义规则文件。
include /www/server/nginx/modsec/custom_rules.conf
重启 Nginx 使配置生效。
五. 日志和监控
ModSecurity 的日志对于监控和调试非常重要。确保在 modsecurity.conf 中正确配置日志:
SecAuditLog /var/log/modsec_audit.log
SecDebugLog /var/log/modsec_debug.log
通过以上步骤,我们在 Nginx 上安装和配置 ModSecurity,可以增强Web 服务器的安全性。ModSecurity 强大的规则集和灵活的配置选项,对安全防护最重要的就是规则,所以一定要定期审查日志,根据需要调整配置,适时更新规则集,以保持最佳的安全状态。