还在为告警筛选而发愁吗?

一、前言:智能推荐的不足

海量告警筛选问题困扰安全运维值守工作已非一朝一夕,行业内使用各种机器学习方法进行告警评估和筛选的尝试也已经数不胜数。

当面对未知威胁时,很多机器学习方法目前看来效果尚可。随着数据量的不断增加,评估筛选的效果会持续改善,非常适合安全运营场景。

然而,我们在多次实战中发现,在面对已知威胁时,这些方法无论效果和性能都不如写规则好。尤其是,实战中攻击告警研判常常涉及一些外部知识,它们很难输入到结构复杂的模型中。

例如,在实际工作中,值守人员可能已经打电话确认过“这个IP是自己人在做测试”,但要依靠训练样本等输入让模型得到这个知识却非常困难,导致最终使用体验不佳。

因此,在部分告警筛选的场景中,还是需要考虑这些“规则明确的”告警评估问题,以辅助机器学习方法。

以下我们针对基于规则的告警筛选机制进行探讨。

二、现有基于规则的告警筛选机制比较

事实上,已经有很多成熟的基于规则的告警筛选方法,比如直接调整探针策略、提供告警搜索功能、事件规则归并机制等等。

但实际使用时发现,上述方法或多或少还是存在一些问题。

如果直接调整探针策略(比如修改IDS规则),此时策略变更的开销较大,不宜频繁调整,且禁用规则不能消除历史告警,启用规则也不能挽回历史告警;在告警搜索功能中,搜索流程依赖用户主动查询,不擅长同时启用多个筛选规则;而在事件规则归并机制中,事件规则虽然能够筛选出关键告警,却不擅长排除掉无用告警,而且事件记录一旦产生,通常很难再追加或拆分,对于持续时间较长的攻击也比较尴尬。

可见上述机制适用场景不同,无法完全满足需求。经过反复尝试,我们最终选择在流程中添加一层独立的过滤器机制,根据设定规则筛选出/筛选掉一些告警。

三、基于过滤器的告警筛选机制

过滤器的一个优势在于,它可以作用于告警的呈现过程(而非产生告警的过程),因此能够快速筛选历史告警,使得配置失误导致的不可挽回的影响降至最低。

例如,如果我们发现IPS配置中某个应当启用的检测规则实际未启用,即使修改配置将它启用,也无法检测到在此之前已经发生的攻击;但如果使用过滤器机制,当我们发现某个应当启用的过滤规则实际未启用时,只要将它启用之后重新查询告警列表,就可以将符合过滤规则的告警找出来,而不论告警产生于什么时间。

事实上,配置失误的问题在安全值守场景中非常常见,尤其是各类保障工作中,值守人员很可能处于比较糟糕的身心状态,包括但不限于疲惫、枯燥、注意力涣散、杂务纠纷、谣言传播、以及人员密集导致的流行性感冒等…

四、过滤器规则的语言标准

既然要将配置过滤器的工作交给现场用户,就要从机制上提出两点要求:

首先,配置操作不能太复杂,但筛选机制本身却要充足多样。需要的是一种以规则为单位的、易于理解的机制,但其中的规则单元要足够强大;

其次,要考虑不同技术水平的用户,确保技术水平一般也能正常使用,技术水平优秀也允许充分发挥。要使用灵活的语言或结构来定义这些规则,另外提供一系列便利性的常用规则模板。

一般来说,如果要追求灵活性,普通防火墙ACL那种简单的机制肯定不够用。但要是另外设计一套过滤器专用的语言或配置结构,难免会增加用户的学习成本,而且功能上也未必真就能做到足够灵活。

考虑到安全攻防人员掌握最普遍的通用编程语言,Python(各种exp/poc常用)和JavaScript(XSS常用)当居首位,这里选用并行化支持相对较好的Python来实现告警过滤器:

图1:用Python定义告警过滤器

五、RestrictedPython实现

众所周知,Python在数据处理方面的能力相当强劲。但如果不加限制地允许用户提交Python代码并运行,那就是一个白给的RCE漏洞了,安全性层面是无法接受的。

关于如何“执行不受信任的代码”,现有方案众多:虚拟化、容器化、沙箱环境、等等。

但今天要给大家介绍的是一款轻量级解决方案:https://pypi.org/project/RestrictedPython/

图2:RestrictedPython

与沙箱类方案不同,RestrictedPython其实只是限制了“不受信任的代码”可以调用的模块、类、函数等,甚至不需要创建新的进程。

因此,使用RestrictedPython来实现告警过滤器时,不仅在性能上占据优势,还能够方便地向过滤器脚本提供各类API,而且实现起来非常方便。

一个简单的案例如下:

如上所示,RestrictedPython库会劫持其中代码的各种基础功能,允许我们Hook这些功能,从而限制其中执行的代码可以访问的接口。甚至像set这样的内置类型,都需要用户手动提供后才能访问。

所以,RestrictedPython的安全性很大程度上依赖于各个Hook的实现是否严格。但Python代码执行所需的内置对象非常多,要是全都手动检查,实在是一件很麻烦的事情。

为此,RestrictedPython提供了一些默认的__builtins__字典(safe_builtins、limited_builtins等),以及一些内置的保护函数(safer_getattr、guarded_iter_unpack_sequence等),可以帮助我们快速建立一个好用的安全执行环境。

限定在告警过滤器场合中,过滤规则实现以数据处理需求为主,涉及的接口并不多,因此可以比较容易地通过白名单模式进行限制。

六、后记

至此,一款功能灵活的告警过滤器引擎就浮出水面了。实际实现时,为了使用方便,可以提供一些代码生成模板,来达到交互体验和功能灵活的双丰收。

版权声明

本站“技术博客”所有内容的版权持有者为绿盟科技集团股份有限公司(“绿盟科技”)。作为分享技术资讯的平台,绿盟科技期待与广大用户互动交流,并欢迎在标明出处(绿盟科技-技术博客)及网址的情形下,全文转发。
上述情形之外的任何使用形式,均需提前向绿盟科技(010-68438880-5462)申请版权授权。如擅自使用,绿盟科技保留追责权利。同时,如因擅自使用博客内容引发法律纠纷,由使用者自行承担全部法律责任,与绿盟科技无关。

Spread the word. Share this post!

Meet The Author

Leave Comment