干安全运维这行,最怕的不是设备报警,而是报警了没人处理。早几年处理网页木马攻击,常规流程就是登录防火墙看一眼日志,确认攻击源IP,再手动拉黑。运气好碰上非工作时间,攻击流量已经打了一两个小时,服务器上的网页木马早就传上去了。后来开始推动“网御星云防火墙 自动封禁 网页木马攻击”这套组合,才真正把响应时间从小时级压缩到分钟级。这篇文章就把我落地这套方案时踩过的坑、调整过的参数、总结出来的排查经验完整梳理一遍,给同样被网页木马攻击困扰的运维同行做参考。
先说清楚,网页木马攻击不是一个单一漏洞利用,而是包含WebShell上传、恶意JS注入、漏洞探测在内的一整类问题。自动封禁的逻辑并不复杂:防火墙通过特征库和异常行为分析识别出恶意请求,确认攻击源后,按照预设策略把源IP自动加入黑名单,持续阻断一段时间甚至永久封禁。难的点在于识别规则怎么调、封禁范围怎么定、出现误封怎么快速解禁区。
1. 整体设计方案与核心思路
1.1 网页木马攻击的完整链路和封禁核心价值
很多甲方客户提需求时都只说一句“网站被上传了木马”,但实际上攻击链是分段的。我先用一次典型的WebShell攻击来拆解:攻击者先对目标网站做指纹探测,确认中间件版本和后台路径,然后利用文件上传漏洞或者后台弱口令,把一个类似shell.php的脚本传上去。脚本上传成功后会接收远程指令,攻击者通过HTTP请求调用这个脚本,执行读取配置、遍历目录、反弹连接等操作。
这里面存在两个可以被防火墙拦截的关键节点。第一个节点是恶意流量刚到达服务器的那一刻,比如上传请求中包含脚本特征,或者路径中出现可疑文件名;第二个节点是攻击者已经拿到WebShell后,向脚本发送的指令流量中包含大量敏感函数调用,比如eval、system、base64_decode。
自动封禁的核心价值,就是在这两个节点上做即时反应。传统手动封禁的问题在于,无论攻击者怎么换IP,只要他还在继续探测,就能一直换源尝试。人工登录防火墙看到告警再判断再封禁,怎么也要几分钟。而自动封禁不依赖人的反应速度,检测到特征命中后立刻触发阻断动作,攻击者还没完成下一步操作就已经被断了路。我在实际项目中做过对比测试,同样一个攻击载荷,手动模式从告警到封禁平均耗时4分钟以上,自动模式只有几秒钟。
1.2 为什么“自动封禁”比“手动处理”更适合实际生产环境
有些刚入行的运维会觉得,自动封禁有风险,万一误封了正常用户怎么办,还是手动确认更稳。这个想法在流量小、业务单一的环境下成立,但一旦面对真实攻击场景就撑不住。网页木马攻击往往伴随着扫描器批量扫路径、多IP轮换、凌晨时段高频尝试,人工守不住也判断不过来。
自动封禁不是把所有判断都交给机器,而是把“已知可信特征”交给机器,把“灰色地带”留给人工。比如,一个包含典型WebShell路径的请求,一个UA头跟正常浏览器差异巨大的请求,这种命中基本上不存在争议,直接自动封。而那种看起来像攻击但特征不太明确的请求,则可以通过告警、短信通知等方式推给值班人员做二次判断。
从响应时间的角度看,自动封禁的价值更明显。网页木马攻击一旦得手,攻击者可能马上开始挂马、植入后门、横向移动。攻击持续的时间越短,损失越小。自动封禁能做到秒级切断,这给后续的溯源和清理争取了足够时间。我的习惯是,自动封禁策略一定开,但会配套设置合理的封禁时长和告警通知,确保“快”和“稳”之间有个平衡。
1.3 影响范围管控:先想清楚要封什么再动手
自动封禁最关键的设计决策,不是能封多快,而是封禁的影响范围有多大。这里必须区分三个层次:只阻断当前会话、阻断攻击源IP一段时间、永久封禁攻击源IP。
只阻断当前会话对防护网页木马攻击来说基本没用,因为攻击者发起下一个HTTP请求时,会话就重新建立了。阻断攻击源IP是最常用的手段,但要注意IP是动态的,攻击者手里的代理池很大,封禁单个IP只能减缓攻击节奏,并不能彻底解决问题。永久封禁则要非常慎重,一旦误判,影响的就是整整一个出口IP下所有正常用户。
我通常建议把自动封禁的默认范围设置为“攻击源IP+指定端口+指定协议”,时长为600到1800秒。这样即使误判,影响面也足够小,阻断时间足够短。对于确认为严重威胁的IP,比如来源一致的攻击请求在短时间内重复触发多次,可以提升为永久封禁。这个思想在设计策略时必须提前明确,否则等到产生业务影响再来调整就晚了。
2. 识别方案与核心检测要点
2.1 基于HTTP请求特征的识别规则
网页木马攻击的流量再伪装,也总会在HTTP请求中留下痕迹。我落地时整理了一套比较实用的识别维度,覆盖了绝大部分网页木马攻击场景。
第一个维度是URL路径特征。典型的WebShell文件名就那几个,shell.php、cmd.php、eval.jsp,更隐蔽一点的会做文件名混淆,比如1.php.bak、images.php.jpg,或者把脚本藏在静态目录下面。防火墙的特征库会覆盖常见WebShell文件名的正则匹配规则,但实际环境里攻击者可能用随机文件名,这时候就要结合其他维度综合判断。
第二个维度是请求方法分布。正常用户访问网页基本都是GET请求,POST请求主要发生在表单提交的场景。但WebShell命令交互通常走POST方式,尤其是参数中包含cmd、exec、command这类敏感字段时,匹配度就很高。如果某个源IP在短时间内对同一URL发起了远超正常数量的POST请求,且参数内容触动敏感函数特征,那基本可以判定为攻击行为。
第三个维度是请求头特征。很多自动化攻击脚本的User-Agent非常固定,比如某个特定版本的扫描器标识,或者干脆UA为空。真实浏览器一般都会带完整的UA环境信息,包括浏览器内核、操作系统版本等。我在策略里设置了UA异常检测规则,把UA为空、UA与业务应用版本不匹配的请求单独标记出来,再配合其他特征决定是否封禁。
2.2 基于攻击行为的联动分析
单条请求特征匹配容易误判,但如果把一段时间的多条请求串联起来看,攻击行为就非常明显了。我在防火墙上见过一种经典行为模式:同一源IP在60秒内,先后访问了/admin/login.php、/upload/、/uploads/shell.php,三条请求的间隔都在几秒以内,这个节奏明显是自动化扫描加利用的组合攻击。
除了请求路径递进,还有时间维度的异常。正常业务流量通常服从一定的日内分布规律,但攻击流量往往在凌晨2点到5点出现脉冲式上涨。为此,我结合防火墙内置的异常检测模块,设置了“单IP单位时间内新建HTTP连接数”阈值,一旦超过预估值就直接拉进观察名单,再配合特征库确认后触发自动封禁。
基于行为的检测有一个好处,就是能抓到特征库还没来得及覆盖的新变种。特征库是滞后的,新出现的WebShell变种在刚出来的一段时间里,特征库不一定能识别。但攻击者的行为模式改变不了,他们扫描、上传、执行、外联的步骤,总会暴露在会话交互的节奏里。这套思路落实下来,我的经验是能多拦截大概两到三成的变种攻击。
2.3 特征库、威胁情报和云端联动的组合打法
网御星云防火墙在检测上并不是只靠本地特征库,它还有威胁情报联动这一层。本地特征库解决的是已知攻击的快速匹配,威胁情报解决的是已知恶意IP的提前阻断,两个机制组合起来,效果会比单一模式好很多。
我建议实战中开着本地特征库的“高检出模式”,并配置每周至少两次自动更新。有人担心高检出模式会导致误报比例上升,这个担心有一定道理,但可以通过白名单和封禁时长参数来对冲。高检出模式拉高了告警量,反而让真正有价值的攻击行为更容易被过滤出来。
威胁情报模块的作用偏前置一点。防火墙定期同步云端恶意IP库,当外部请求源IP命中恶意IP记录时,可以直接在会话建立阶段就拦掉,甚至不需要走到特征匹配那一步。这个功能对已知僵尸网络频率高的场景非常有效。配置时需要注意,云情报更新是实时的,设备需要保持外网连通,很多离线部署的环境容易忽略这一点,导致情报库几个月不更新,形同虚设。
3. 实操过程与核心配置步骤
3.1 梳理网络边界与安全域划分
真正开始配置防火墙之前,先花时间梳理网络结构,这一步我建议不要省。很多自动封禁失效的案例,根因都是策略作用在错误的安全域上。比如防火墙部署在核心交换机和服务器之间,但你只配置了外网接口的安全策略,结果攻击流量从内网纵向移动过来,防火墙看都不看一眼。
我的划分习惯是:外网区对应连接互联网的接口,信任区对应内部办公网,DMZ区对应对外提供服务的Web服务器、应用服务器。网页木马攻击主要针对DMZ区,所以Web服务的入站流量策略要配置在外网到DMZ方向,出站流量策略要配置在DMZ到外网方向。这里需要特别注意,WebShell被上传成功之后,攻击者可能会在DMZ区服务器上发起往外连的请求,防火墙同样要监控出站方向的异常流量。
设备上安全域的配置完成后,下一步就是给Web服务器建地址对象。我通常会建一个Web服务器组,把对外提供Web服务的所有服务器IP都纳入进来,方便后续策略引用。地址对象不要用单个IP散着建,不然后面策略一多,管理就乱了。
3.2 封禁策略的配置步骤与关键参数
下面是我整理的一套最小可落地的自动封禁配置步骤,可以直接参考:
第一,配置地址对象。把受保护的Web服务器添加为“Web服务器组”,把外网网段添加为“外网地址”对象。
第二,配置服务对象。网页木马攻击流量基本都走HTTP和HTTPS,建好对应端口。
第三,配置检测策略。进入防火墙的防护策略配置页面,新建一条“外网访问Web服务器”的策略,指定源地址为外网地址,目的地址为Web服务器组,服务为HTTP/HTTPS,然后把恶意代码防护、Web攻击防护、异常行为检测全部勾选为启用,动作设置为“告警并自动封禁”。
第四,配置自动封禁参数。选择封禁对象为“源IP”,封禁时长为600至1800秒,对反复触发规则三次以上的源IP设置为永久封禁。同时开启告警推送,把告警信息发送到值班手机或者邮件。
第五,配置白名单。把内部管理IP、公司出口IP加入白名单,避免日常运维操作被误识别为攻击。
这套配置落地之后,我习惯再做一次模拟验证。工具层面,用一个测试脚本模拟上传WebShell请求,直接观察是否触发封禁动作。验证通过之后再切换到真实防守模式,不建议一开始就在生产环境做全量开高拦截。
3.3 日志观测与封禁效果验证
自动封禁配置完成后,不是丢在那里就不管了。日志观测是判断规则是否合理的重要窗口。我一般每天固定看一眼防火墙的当日报表,重点观察几个指标:自动封禁事件总数、命中规则的分类占比、封禁的源IP数量、解禁后的重复命中率。
如果自动封禁事件数一直在涨,但业务看起来没受任何影响,说明攻击探测确实存在,策略在起作用。如果封禁事件极少,但安全情报里已经提示有WebShell攻击告警,那大概率是漏报,需要回查特征库是否更新、策略方向是否配置正确、服务对象是否覆盖了服务器的真实端口。
还有一个很容易被忽略的验证方法:查看防火墙上的“攻击源IP命中趋势”。真正有威胁的攻击源,被解禁之后往往还会卷土重来。如果某个IP解禁后短期内又被封,而且每次都命中同一个攻击特征,那说明这个IP不是偶然误判,应该手动提升为更长时间的黑名单。
4. 常见问题与排查技巧实录
4.1 正常用户被误封的处理流程
误封是自动封禁方案里最让人头疼的事。我遇到过的典型情况是:某公司出口IP下挂了几百号员工,其中一个人访问了含特殊参数的URL,结果整个出口IP被封了,全公司都上不了网。
这种情况发生后,最快的止损方式是临时解禁,然后查看该IP命中了哪条规则、哪个特征。处理流程是:登录防火墙后台,进入封禁列表,找到该IP,查看“命中规则详情”。如果发现是规则写得过严,先将封禁状态解除,再调整规则动作,由“封禁”改为“仅告警”,观察一段时间,确认误报率降下来再重新启用封禁。
避免这类误封的关键在于配置精确性。比如UA异常检测规则,要先把自家业务系统里合法的UA样本收集起来,加进白名单。有些内部系统用的是定制客户端,UA和浏览器完全不同,不调整规则的话,这类IP一上线就会被封。
4.2 日志显示已封禁,但攻击仍然存在
这个问题的出现频率也很高。封禁动作“生效了”,但攻击还在继续,怎么看都很矛盾。我的排查经验是分两步走。
第一步,确认封禁的是不是真正的攻击源。有时防火墙做了源NAT转换,外部攻击流量经过多层设备后,防火墙看到的源IP可能是内网网关的IP,而不是攻击者真实IP。这种情况封禁无效,因为后续请求还是会通过网关转发进来。解决方案是调整防火墙部署位置,或者利用TCP Option、X-Forwarded-For等字段提取真实源IP。
第二步,确认封禁策略是否作用在正确的接口方向。自动封禁规则如果只绑定了外网接口,而攻击流量是从其他接口进来的,自然封不住。我在排查时会把防火墙上的会话表拉出来,看看攻击相关的会话是从哪个接口建立的,然后确认对应的策略组是否包含了自动封禁动作。
4.3 解禁时效与封禁策略的运营踩坑
封禁时长的设置直接影响业务可用性和安全效果。我见过有人把所有封禁时长都设成永久,结果遇到一次批量误报,整个区域的业务全部瘫痪,恢复异常困难。所以我在自己的环境里一直坚持分层设置。
第一层,临时封禁,时长30分钟,用于高频探测但没有明显攻击载荷的IP。第二层,攻击封禁,时长24小时,用于命中了WebShell特征、恶意JS注入特征的IP。第三层,永久封禁,只用于极少数确认有真实攻击行为且高度活跃的IP。这个分层设计看起来保守,但它保证了误封的影响不会超过可接受范围。
运营层面还要考虑封禁列表容量。防火墙的黑名单容量有限,如果永久封禁条目太多,会占用设备资源。我的做法是定期清理超过三个月没有重新触发的永久封禁条目,把这些IP转入观察名单。不是彻底放行,而是重新进入检测流程,如果再次命中,则重新进入永久封禁逻辑。
4.4 封禁只是第一步,服务器端清理同样不能少
自动封禁能把攻击源挡在门外,但已经被上传的网页木马,并不会因为防火墙封禁了源IP就自动消失。攻击者换一个IP还能继续控制已经植入的WebShell。这里必须强调,自动封禁方案要跟服务器端排查配合起来,才算形成闭环。
我处理过一起案例:防火墙自动封禁了攻击IP,但服务器仍然每隔一段时间就出现恶意请求记录。后来登录服务器排查,发现Web目录里躺着一个伪装成图片文件的PHP木马,攻击者早就通过这个后门在持续操作了。防火墙把攻击IP封了,攻击者只要换一台跳板机,从WebShell本地执行命令,依然可以继续控制服务器。所以自动封禁之后,立刻进行全盘文件排查、WebShell专杀、日志审计,一个都不能少。
针对被植入WebShell的服务器,我自己的排查顺序是:先查Web目录下最近修改的文件,重点看脚本文件、可执行文件、图片中混入的脚本代码;再查系统计划任务和启动项有没有异常;最后查数据库是否有异常账号和多余的管理员权限。清理干净之后,再用防火墙的“模拟访问”功能验证一下,确认WebShell已经失效。
还有一个补充技巧,就是利用防火墙的“文件隔离”功能。某些型号上可以配置对上传目录的脚本文件做拦截,即使攻击者上传成功,文件也会被隔离在临时区域,不会真正落到Web目录里。这个功能在生产环境中有时候会因为兼容性问题导致正常文件上传失败,我建议先在测试目录验证,再全量铺开。
4.5 一张排查参考表
为了便于日常运维快速查阅,我把几个高频问题整理成了速查表。
| 现象 | 可能原因 | 排查动作 |
|---|---|---|
| 正常用户被封禁 | 特征规则过严,命中UA或参数误判 | 查看命中规则详情,临时解禁,调整特征阈值 |
| 封禁后攻击仍在 | 未识别真实源IP,或策略方向没覆盖 | 检查源NAT和会话入口,重新绑定接口方向 |
| 规则不告警也不封禁 | 特征库未及时更新,动作配置为仅审计 | 检查特征库版本,调整动作为告警并封禁 |
| 封禁列表涨得很快 | 攻击者使用代理池扫IP | 改封禁策略为命中三次后永久封禁,并加情报黑名单联动 |
| 设备性能下降 | 并发会话数过高,日志量过大 | 调整检测频率,减少重复规则,关闭不必要审计日志 |
5. 最后的实操体会
这套“网御星云防火墙 自动封禁 网页木马攻击”的方案落地到现在,我最大的体会是:自动封禁不是一次配置完就能躺平的功能,它需要一个运营过程来打磨规则、验证效果、处理误报。刚开始部署的那个月,我把所有有疑问的命中事件都翻出来看过一遍,逐步把误封率降了下来,这才敢放开全量自动封禁。
最后分享一个我一直在用的小技巧:每次发生新的网页木马攻击并且确认有效拦截之后,我会把攻击样本里的特征手工提取出来,写进防火墙的“自定义特征规则”里,作为本地特征库的补充。这么做的好处是,即使官方特征库还没更新到最新的变种,我的设备也能提前拦截。
如果你正准备上手这套方案,建议从最小范围开始,先选一台低风险的Web服务器做试点,把检测、封禁、告警、解禁、日志回查整个流程走顺,再逐步扩展到全业务。别急着一次把所有策略都打开,留给自己的调试空间越大,后面翻车的概率就越小。