站点上线那一刻,攻击就开始了。这不是危言耸听,而是互联网的常态。扫描器全天候在网段里探测开放端口、已知漏洞和配置错误,自动化攻击工具比运维人员勤快得多。很多人以为用上云服务商的安全组就万事大吉,实际上安全组只解决了网络层和传输层的访问控制,应用层的注入、跨站脚本、恶意爬虫、CC攻击、暴力破解这些,全得靠应用前面的防护层来扛。商业WAF动辄数万一年,对个人开发者、初创团队或者内部系统来说成本太高。开源的防护工具经过合理组合,完全能构建一套够用、可控、可审计的防攻击防漏洞体系。

体系架构:四层防御模型

单靠一个工具解决所有问题不现实。真正有效的做法是分层防御,让不同组件各司其职。从流量入口到应用内部,可以划分为四层:反向代理层负责流量过滤和WAF规则匹配;运行时防护层通过RASP技术在应用内部拦截恶意调用;日志与监控层收集异常行为并触发告警;最后是定期漏洞扫描层主动发现弱点。每一层都可以用开源工具填上,组合起来就是一套完整的防护体系。

第一层:反向代理与WAF——ModSecurity加Nginx

ModSecurity是开源WAF的事实标准,被Trustwave维护了十几年,规则库成熟度远超其他开源选项。它工作在HTTP层面,能检测SQL注入、XSS、命令注入、文件包含等常见攻击模式。单独部署ModSecurity性能开销较大,最佳实践是把它编译进Nginx做成动态模块。具体做法是拉取ModSecurity源码和Nginx的ModSecurity连接器,编译时指定模块路径,这样Nginx每个请求都会经过规则引擎检查,延迟增加通常不超过2毫秒。

# Nginx配置中启用ModSecurity的关键片段
location / {
    ModSecurityEnabled on;
    ModSecurityConfig modsecurity.conf;
    proxy_pass http://backend;
}

规则方面,OWASP核心规则集是必选项。这套规则集包含超过200条通用检测规则,覆盖注入、会话劫持、敏感信息泄露等类别。默认的偏执级别设为1即可,开到2或3误报率会显著上升,除非你有专门的人力调优。实际部署时一定要先跑一段时间的检测模式,把SecRuleEngine设为DetectionOnly,观察日志里哪些正常请求被误判,逐步加白名单后再切到On模式拦截。很多人一上来就开拦截,结果把正常业务请求干掉,这是最常见的翻车点。

第一层补充:限流与反爬——OpenResty加lua-resty-waf

ModSecurity偏重攻击特征检测,对CC攻击和高频爬虫的防护能力有限。OpenResty是Nginx的增强发行版,内置LuaJIT运行环境,可以用Lua脚本在请求处理阶段做精细控制。lua-resty-waf是一个纯Lua实现的WAF模块,性能比ModSecurity更轻量,适合做IP黑白名单、URI级别限流和User-Agent过滤。更关键的是,你可以用几行Lua代码实现令牌桶限流算法,针对登录接口、API端点这类高价值目标做精确速率控制。

-- 简单的令牌桶限流示例
local limit_req = require "resty.limit.req"
local lim, err = limit_req.new("login_limit", 10, 20)
-- 每10秒允许20个请求,超出返回429
local delay, err = lim:incoming(ngx.var.binary_remote_addr, true)
if not delay then
    ngx.status = 429
    ngx.say("请求过于频繁")
    ngx.exit(429)
end

对于恶意爬虫,单纯靠User-Agent黑名单已经不够,现在的爬虫会轮换UA、模拟浏览器指纹。更有效的手段是结合行为分析:统计单个IP的请求间隔、页面访问序列、资源加载比例。正常用户访问一个页面会连带请求CSS、JS、图片,爬虫往往只抓HTML。在OpenResty里统计这些特征,对不符合正常浏览模式的流量打上标记,逐步降级或返回验证码。

第二层:运行时应用防护——RASP技术

WAF工作在应用外部,通过分析HTTP流量来推断攻击,本质上是在猜攻击者的意图。一旦攻击者用编码绕过、分块传输、协议级混淆,WAF就可能漏报。RASP把防护逻辑嵌入应用运行时,能直接看到代码执行上下文——SQL语句实际长什么样、命令执行前参数是什么、文件读取的路径最终指向哪里。这种视角优势让RASP在检测准确率上远超WAF。

开源的RASP方案里,百度的OpenRASP是目前最成熟的选择。它通过Java Agent或PHP扩展的形式挂载进应用,Hook底层危险函数如Runtime.exec、ProcessBuilder.start、SQL查询入口。当检测到攻击时,OpenRASP能直接阻断并输出完整调用栈,精确定位到业务代码的哪一行触发了漏洞。部署方式很简单,下载对应语言的二进制包,在启动参数里加上Agent路径就行。

# Java应用启动时挂载OpenRASP
java -javaagent:/path/to/rasp.jar -jar app.jar

OpenRASP的默认策略已经覆盖了命令执行、文件读取、SQL注入、SSRF、反序列化等高风险操作。建议开启"阻断模式"而不是只记录日志,因为RASP的误报率比WAF低得多——它看到的是真实的函数调用,不是正则匹配HTTP报文。唯一需要注意的是性能开销,实测在普通业务场景下CPU增加约百分之三到百分之五,对于大部分应用完全可以接受。

第三层:日志收集与异常检测——Wazuh

防护工具会产生大量日志,ModSecurity的审计日志、Nginx的访问日志、OpenRASP的告警日志、系统认证日志,分散在各处。攻击者往往会先做信息收集,试探多个入口,单看某一个日志看不出全貌,关联分析才能发现攻击链。Wazuh是开源的安全信息与事件管理平台,可以理解成开源版的SIEM。它由管理端、Agent和索引引擎三部分组成,Agent装在每台服务器上收集日志并做初步分析,管理端汇总后匹配规则,触发告警。

部署Wazuh最简单的方案是用官方提供的Docker Compose一键拉起全套,包含管理端、Elasticsearch索引和Kibana可视化面板。重点在于规则调优:默认规则集超过3000条,很多针对的是企业AD环境或特定软件,直接全开会产生大量噪音。建议先关闭所有规则,只打开Linux认证失败、Nginx 4xx/5xx状态码突增、ModSecurity拦截事件、OpenRASP告警这四类规则,然后根据实际告警逐步增加。告警输出可以对接企业微信或钉钉的Webhook,让运维人员第一时间收到通知。

第四层:主动漏洞扫描——Nuclei加自定义模板

被动防御做得再好,漏洞还在代码里就是定时炸弹。定期主动扫描是必须的环节,但不是随便跑个工具就完事。Nuclei是近年崛起的开源漏洞扫描器,基于YAML模板定义扫描规则,社区维护了超过6000个模板,覆盖常见CMS漏洞、配置错误、未授权访问、信息泄露等。它的优势是速度快、模板可读性强、能精确控制扫描范围,不会像传统扫描器那样对目标造成压力。

实际使用时不要直接跑全部模板,那等于对目标做全量轰炸,既慢又容易触发防护规则。应该按业务特征筛选:站点用WordPress就只跑WordPress相关模板,用Java就关注Spring、Struts、Fastjson相关漏洞。扫描频率建议每周一次,结合CI/CD流水线在预发布环境先扫一遍,发现高危漏洞直接阻断上线。Nuclei支持输出JSON格式报告,可以写脚本把结果自动导入Wazuh做关联分析。

# Nuclei扫描指定目标,只使用特定标签的模板
nuclei -u https://example.com -tags wordpress,cve -severity high,critical -o scan_result.json
体系整合与自动化运维

四层工具各自独立运行只是及格线,真正形成体系需要打通数据流和响应链路。一个可行的自动化流程是:Nuclei定期扫描发现漏洞,结果推送到Wazuh;Wazuh汇总扫描结果和实时告警,根据严重级别决定是否触发响应脚本;响应脚本可以调用OpenResty的API临时封禁攻击IP,或者通知运维人员紧急修补。这套流程用Python或Go写个中间调度程序就能串起来,不需要采购昂贵的SOAR平台。

证书管理也别忘了集成进来。Let's Encrypt的免费证书配合Certbot自动续期,配合Nginx的SSL配置强制HTTPS,把传输层加密做扎实。很多攻击的第一步就是嗅探明文传输的凭证,HTTPS是性价比最高的安全投入,零成本就能挡住中间人攻击和会话劫持。

常见误区与实战经验

第一,不要迷信任何单一工具。ModSecurity规则写得再好,碰到零日漏洞或者定制化攻击照样可能绕过。RASP再精准,也管不到网络层的DDoS。分层防御的价值在于增加攻击者的成本和不确定性,每一层都在消耗对方的时间和资源。

第二,日志留存时间要够长。很多攻击不是一次性的,攻击者可能先埋下后门,隔几个月才利用。建议ModSecurity审计日志和Nginx访问日志至少保留90天,磁盘成本远低于被入侵后的损失。

第三,测试环境也要上防护。不少人只在生产环境部署WAF,测试环境裸奔,结果攻击者通过测试环境拿到源码或数据库备份,横向移动到生产环境。测试环境至少要有基本的IP白名单和ModSecurity检测模式。

第四,定期复盘拦截日志。防护工具不是部署完就结束了,每个月抽时间看Wazuh的统计面板,分析攻击趋势、高频攻击源、被拦截最多的规则类型。这些数据能告诉你攻击者最近在盯什么,业务代码哪个模块最薄弱,下一次迭代应该优先修哪里。

开源防护工具的组合使用,核心优势不是省钱,而是透明和可控。商业WAF的规则引擎是黑盒,被绕过你也不知道为什么。开源方案每一行规则、每一条检测逻辑你都能审查和修改,出了问题能定位到根因。这种掌控感,才是自建防护体系最值钱的部分。