WAF 的工作原理
WAF 和 Nginx 类似,也是一种“反向代理”的设计。以应用服务器为 Nginx 为例,WAF 通常部署在 Nginx 应用服务器的前端,直接暴漏给互联网公开访问。当用户客户端的发起请求时,请求流量会首先(或先经过CDN服务器)到达 WAF 服务器,WAF 通过一组规则对恶意流量过滤并清洗,仅对合法的流量放行到 Nginx 服务器。
WAF 的必要性
尽管 Nginx 和 Web 框架本身都有一些安全机制确保能来自客户请求的合法性,但正确识别和处理 Web 攻击是一个复杂而专业的事情,从系统设计角度来讲,各模块应该各司其职:WAF 清洗好网络流量将正常的流量放行,Nginx 处理好负载均衡、权限、跨越等通用问题,而 Web 框架则可更专注业务本身。
雷池 WAF - SafeLine
市面上可选的适合中小型网站的免费 WAF 产品并不是很多,看川博客目前采用的是来自国内网络信息安全公司 - 北京长亭科技的雷池 SafeLine 社区版。社区版在功能上肯定没有付费版本强大,但对于中小型网站来说功能足够了。
雷池 SafeLine 的部署、配置和使用方法在其官网有详细说明,这里我仅说下几个关键要点:
雷池 WAF 的资源占用
从实际使用上来看,雷池 WAF 是很轻量的服务,安装运行后系统整体内存和CPU使用率并没有明显提升。按雷池官网说明,最小化安装环境为:1 核 CPU / 1 GB 内存 / 5 GB 磁盘,能满足了绝大多数服务器环境。
独占 80/443 端口
启用 SafeLine 后,其作为用户流量的最先达到的服务器,应该独占 web 端口(80或443)。如果将其部署在和 Nginx 同一台服务器,需要 Nginx 使用其它端口,此时 WAF 和 Nginx 属于本地内部通信,Nginx 不需要启用 HTTPS,另外这种情形下如果启用 WAF,则所有 Nginx 站点都启用,无法做到部分启用部分不启用。
获取正确的客户端 IP
雷池默认通过 Socket 连接获取请求者的源 IP,如果请求在到达雷池之前,还经过了其他代理设备(如 CDN 等),则需要配置以便雷池正确获取请求者原始 IP。
以使用腾讯云 CDN 为例,请求链路中经过的所有节点的 IP 存储在请求 Headers 的 X-Forwarded-For
字段。
Nginx 服务器获取真实请求 IP
启用 WAF 后,从请求流量方向看,Nginx 服务器的上游为 WAF,如果不特殊处理,在 Nginx 的日志中请求总是会显示为 WAF 服务器的 IP。需要在 Nginx 的 http 域添加配置以确保 Nginx 能获取正确的客户端 IP:
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
留言板