Nginx Rift漏洞rewrite规则临时缓解配置
Nginx Rift漏洞临时缓解:用rewrite规则快速加固配置
近期安全社区曝光的Nginx Rift漏洞,在官方补丁上线前,许多运维同学需要一种立即可行的临时方案。
本文提供一套基于rewrite规则的缓解配置,不需要修改Nginx核心,也不影响现有业务逻辑,新手也能照着操作。
理解漏洞与临时缓解思路
Rift漏洞主要利用Nginx对特定URI解析时的逻辑缺陷,攻击者可以通过构造的请求绕过安全限制。临时缓解的核心思路:对疑似攻击的请求路径或查询参数进行拦截或重定向,阻断漏洞利用条件。
rewrite规则可以在请求到达后端之前就做出判断,是效率最高的临时方案之一。
前置准备
- 确认Nginx版本:登录服务器,执行
nginx -v查看版本号。如果版本在受影响范围内(具体可关注官方公告),临时缓解十分必要。 - 开启rewrite模块:Nginx默认已内置rewrite模块,无需额外安装。检查配置中是否加载了
ngx_http_rewrite_module。 - 备份原有配置:操作前务必备份
/etc/nginx/nginx.conf以及站点配置目录。
操作步骤:编写rewrite规则
在站点配置文件(通常位于 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/)的 server 块内添加规则。
以下规则示例拦截以 /admin 开头的路径并统一返回403,同时拒绝对可疑参数的请求。
location /admin {
return 403;
}
# 拦截特定攻击特征:如 `?cmd=` 或 `?exec=` 等参数
if ($arg_cmd) {
return 403;
}
if ($arg_exec) {
return 403;
}
更温和的方案:也可以将可疑请求重定向到一个安全页面或首页。
if ($arg_cmd) {
rewrite ^(.*)$ /safe.html redirect;
}
注意:if在location中使用有一定性能开销,但作为临时缓解完全可接受。若需更高效,建议搭配map模块或geo指令,本文不做扩展。
将修改保存后,执行 nginx -t 测试配置语法是否正确。
如果显示 syntax is ok,则执行 systemctl reload nginx 或 nginx -s reload 使新规则生效。
避坑指南
- 不要覆盖已有rewrite:如果server块内已存在其他rewrite规则,注意顺序。Nginx按顺序匹配,应将缓解规则放在最前面。
- 避免误拦正常请求:先在小范围测试,比如仅拦截特定IP或路径段。可以先放一份白名单:
allow 10.0.0.0/8; deny all;配合location。 if的陷阱:if在location中容易引发意想不到的行为,例如if内的return会终止后续处理。务必在测试环境验证。- 监控日志:开启Nginx的access_log,观察被拦截的请求是否符合预期。
效果验证
- 使用curl模拟攻击请求:
curl -I http://your-server.com/admin
# 预期返回 403 Forbidden
- 带参数的攻击请求:
curl -I "http://your-server.com/index.php?cmd=whoami"
# 预期返回 403 或重定向到安全页面
- 正常业务请求:确保原有页面访问正常,无404或跳转错误。
常见问题FAQ
Q:规则生效后需要一直保留吗?
A:不,这只是临时缓解。官方补丁发布后,应及时安装补丁,然后移除这些临时规则。
Q:我的站点有多个server块,都要添加吗?
A:是的,每个暴露在公网的server块都需要添加相同的缓解规则。
Q:如果某个合法请求恰好包含敏感参数怎么办?
A:需要调整规则,使用更精确的匹配。例如只拦截 cmd 参数值为特定危险命令的情况,而不仅仅是参数存在。
Q:Nginx提示 unknown directive?
A:检查是否误写了指令,或者步骤中没有正确保存文件。
---
如果你正在处理Nginx Rift漏洞的临时缓解,建议先按本文步骤在测试环境完整执行,确认无误后再应用到生产。
遇到异常时,优先检查 if 规则是否与现有location冲突,并回看避坑部分。
安全从来都不是一劳永逸,临时缓解只是争取时间的策略,后续务必跟上官方补丁。