《Apache Flink 案例集(2022版)》——3.机器学习——奇安信-如何设计信息安全领域的实时安全基线引擎(2) https://developer.aliyun.com/article/1228164
基线的周期分为 learn,ready,close,expire 四个阶段:
learn 表示学习阶段,在这个阶段基线学习输入的事件流;
ready 阶段表示当前时间线已经到了基线的学习截止时间,但是因为延迟时间,基线需要等待一个延迟时间,在这个时间段基线可以继续学习延迟的事件,同时基线可以用于异常检测;
close 表示当前时间线到了延迟时间,此时基线不再学习输入的事件,只用于异常检测; expire 表示当前时间线到了基线超时时间,需要基线停止进行异常检测,并删除。
基线的计算由两种情况触发:
第一种是事件触发计算,每条事件到达之后会触发一次异常检测计算;
第二种是时间触发计算,基线周期会注册时间定时器,时间定时器触发之后会触发相关基线计算流程。
基线的输出分为基线异常事件输出和基线内容输出:
基线异常事件输出发生于基线异常检测过程,当发现异常事件时需要输出对应的事件;
基线内容输出发生于基线学习完成之后需要将基线本身进行输出,用于基线编辑和基线本身异常分析。
在基线学习过程中,通常学习周期是比较长的,比如最近一周、最近一个月等,长周期的学习通常会面临一个数据割裂的问题,比如学习最近一周的数据,但是现在是星期三,也就是说最近一周的数据分成两个部分,其中从星期一到星期二的数据是保存在历史数据存储中,星期三及之后的数据是实时发生的,这里会涉及历史和实时数据融合学习的问题。这里可以分为三种情况:
第一是待学习数据全部是历史数据,这需要支持历史数据学习范围探测,和在线基线更新;
第二是待学习的数据全部是实时数据,这要求支持基线自动学习、基线自动检测和基线自动更新;
第三种是历史和实时数据融合,这需要支持历史和实时数据边界划分、基线融合、重复数据消除。
用户在使用过程中经常要对规则进行操作,这些操作会引起运行任务的启停,启停过程中数据需要前后保证一致,不能因为启停而导致保存的数据丢失。
Flink 本身支持任务重启时重新加载数据,但是在基线引擎这里问题会比较复杂,因为用户可能会停用、启用或者修改规则,这会引起规则集发生变化,进而引起执行图发生变化,为了保证任务重启时不变的规则能正确从 savepoint 加载到到正确的数据,需要支持图局部状态稳定,即在图优化过程中图局部变化不影响其它子图,同时在代码生成过程中保证稳定子图生成稳定的执行代码,变化规则只影响与其相关的子图,其它不变的规则不受影响。
基线学习过程中通常保存大量的中间数据,为了加快 savepoint 和 checkpoint 速度,需要对复杂数据结构的序列化和反序列化进行优化,还需支持增量状态。引擎服务通常需要对多用户提供分析服务,因此还需对多用户多任务的状态进行管理,保证每个任务都能准确关联到其对应的状态数据。
未来规划
随着知识的扩散和各类安全漏洞的频发,各种攻击手法和安全威胁也层出不穷,这对安全分析能力的要求也越来越高,需要引擎能持续进行更新和优化,以提高对安全攻击的检测能力,后续需要继续将更多更好的行为学习算法和技术与安全基线集成,提高安全基线的检测能力。同时期望能将引擎的一些实践通过某些渠道回馈到社区,让更多的人能使用其中好的设计和实践。