这几年,随着各家企业安全建设的日渐成熟,安全运营越来越得到重视。讲到安全运营,实际上脱离不开相关的安全产品及技术,尽管相关产品和技术已发展了这么多年,但整体现状却不是特别乐观。
如果要把安全产品粗粗分个类,我们可以有这么一种分法:端点型的和综合平台型。
端点型的安全产品,像EDR、NDR、WAF等,虽然可以在端点上把能力做到极致,但它们的安全视角是非常有限的,仅仅能看到、检测到自身端上的数据,很多似是而非的行为无法判定是不是真正的攻击。
综合平台型的安全产品,像SIEM、SOC、态势感知等,虽然汇集了大量安全数据,实际情况往往陷入1+1 < 2甚至1+1< 1的困境,对于单点产品的威胁检测和响应的效率提升非常有限。
大家肯定听说过木桶效应,这个在企业安全中也一样存在:整个企业的安全水位线取决于安全防护水平最低的那块木板。
谁都不想被这块木板所困扰,那么,怎么样才能提升企业整体的威胁检测和响应能力呢?
这个时候,XDR(可扩展威胁检测与响应)就应运而生了。
下面给大家介绍一下XDR平台具体使用到的技术栈。这块内容主要给大家自研或者学习过程中,作为技术选型的参考。这里会围绕XDR提供的四大功能(采集、分析、检测、响应)进行介绍。
数据采集功能中,主要用到了分布式数据采集框架、高性能分布式消息队列、分布式文件/对象存储。
XDR采集的数据,整体上分为网络流量、日志、事件三大类,每种数据都有各自最佳的采集框架。
日志类数据,有Apache Flume、Logstash、Filebeat。Logstash、Filebeat都是Elastic出品的,Filebeat相对Logstash,比较轻量级,底层基于golang编写,有非常好的性能,部署的时候就一个可执行文件和配置文件。
网络流量类数据,一般以pcap格式传输和保存。linux上简单的可以选择tcpdump、tshark,tshark是wireshark的命令行版本。当然,也可以选择基于底层抓包的类库编程实现。linux上网络流量抓包可以选择libpcap,windows上可以选择winpcap。这两个都是比较底层的类库,也可以选择更高层的封装,比如golang版本的gopacket,python版本的pypcap。但总得来说,底层都是基于libpcap或者winpcap。
libpcap有个比较大的问题,在大量流量下,丢包率比较高。可以考虑PF_RING,但是PF_RING需要安装支持PF_RING的网卡驱动。
这里顺便讲一下分布式文件/对象存储,抓取到的pcap文件,需要存储到分布式文件/对象存储上,供后续的报文解析和内容分析。
分布式文件/对象存储分为支持对象存储和不支持对象存储。支持对象存储有MinIO、Ceph,如果没有大量的、长期的、多种类型的文件存储需求,可以选择MinIO,Ceph相对比较重。
事件类数据,比如windows安全事件、mysql binlog,这些事件通常需要调用特定api、和特定进程通信获取数据。windows安全事件的有winlogbeat,采集到的数据都已经非常友好地格式化为json格式了。mysql binlog的有canal、flink cdc。
另外,还有一类属于综合型的采集框架,集成多种采集方式,比如apache nifi,还提供了一定的etl能力,可以以可视化方式编排采集和etl。
上面这些采集框架,除了nifi之外,都缺乏对采集端的统一管理能力,比如采集端有没有正常在采集、采集量有多少、能不能暂时先关闭采集、能不能限制采集端过多得占用主机的资源,这个是XDR在实际落地的时候需要考虑的。
最后,采集到的数据需要发送到高性能分布式消息队列上,供后端的解析和etl系统进行消费。不直接在采集端进行解析和etl的主要原因在于,解析和etl通常都是一个消耗cpu的过程,把这些功能从采集端分离出去,中间通过消息队列进行消费的负载均衡,有助于提升整个系统的负载。
消息队列业内基本上会选择kafka,另外,也可以考虑新兴的apache pulsar。kafka在实际XDR落地实现过程中,topic分区没法动态调整,无法原生支持有序和延时消息等问题,也是令人头疼的问题,好在都有变通方案,而且在吞吐量足够高,基本满足需求。
技术栈:分析
数据分析功能中,主要考虑在海量数据的情况下,用户需要边观察数据边分析。这就要求 XDR提供海量数据的近实时分析能力。下面是一些常用的技术。
搜索引擎,主要用于数据的快速搜索和回溯,es和solr两个基本上是唯二选择。solr和lucene师出同门,相对有比较好的性能表现。es自动化运维比较方便。两者仁者见仁智者见智。
为了提高海量数据的聚合计算速度,近实时数据分析引擎一般采取空间换时间的方法,这个空间可以是内存、磁盘、cpu等资源。典型的如预计算,将维度数据提前计算好并存储起来,比如kylin。另外典型的有利用多节点并行计算的mpp,将计算分摊到更多节点上的cpu和内存,比如presto。这里有一点要注意,类似presto的mpp类分析引擎,通常只提供一个分析引擎,计算和存储分离,好处是可以独立各自扩展,坏处是需要再选择部署一个存储引擎,而且存储引擎无法针对分析引擎进行特定的优化。
这里单独把clickhouse列出来,不仅因为最近几年的确很火,而且在单表TP级数据量查询上的性能的确很出色。虽然clickhouse也可以算是mpp类分析引擎,但它却一起提供了存储引擎,而且针对不同的场景提供了多种数据存储模型。
另外,分析中,有时候需要基于图的关联查询和分析,特别是二度三度关联的场景,可以选择图数据库。neo4j一直是霸占第一的宝座,但是分商业版和社区版,社区版不支持集群部署,这是一大遗憾。国产可以选择nebula graph,性能较好,社区活跃度也较高。
选哪一种分析引擎,没有唯一选项,还是得看实际需求。如果采集到的数据种类较少,字段固定,预计算类型和clickhouse都是很好的选择。另外,es和solr在大数据简单查询条件下的近实时搜索优势还是非常明显的,并且也支持不是特别复杂的非海量数据的快速聚合,在XDR落地实现中几乎是必选。
很多时候,需要多种技术的组合使用。
最后,这里还涉及到如何可视化展现数据,主要是前端相关的技术,echarts是一个不错的选择,除非echarts已经满足不了了,比如绘制一些大屏、复杂的网络拓扑图等,可以考虑d3。
技术栈:检测
乍一看,检测功能中的技术非常多,但很多是可选的。我们一个个看。
决策引擎,也就是规则引擎,检测过程中最为核心的组件,所有的检测逻辑最终都要在规则引擎上实现。
传统方案可以选择jboss的drools,作为规则引擎里的元老级和全能型框架,当然全能也意味着重量级。如果没有强烈的需求,并不太建议选择。
轻量级方案有easyrules,十分钟上手,半天看完源码,足够轻量级。但很多情况下,估计会不太够用,需要扩展,甚至扩展了还不如选其它的框架。
这里我比较推荐表达式引擎,有些表达式引擎甚至还支持简单的if else逻辑和自定义函数,几乎是一门新的编程语言了。国产的aviator和qlexpress都是很好的选择。qlexpress支持自定义函数。
groovy其实不能算表达式引擎,但使用groovy完成简单的表达式求值完全没问题,更复杂的还可以动态生成groovy代码完成更加复杂的逻辑。当然,太过于底层,面向字符串的编程也是使用groovy作为规则引擎的一个大问题。
另外,flink cep也可以作为规则引擎,和flink进行很好地集成。如果使用flink作为实时流计算框架,flink cep是一个很好的选择。
规则引擎负责的是逻辑和算法,至于其中用到的数据,就是下面的各种框架和数据库们的事情了。
首先是实时流处理框架,这里只写了一个flink,实际上目前业内的最佳选择,也就是flink。用于实时计算相对简单的较短时间内的数据。
其次是离线数据处理框架,这里也只写了一个spark,同样的,也是目前业内的最佳选择。用于离线计算相对复杂的跨天跨周跨月的数据。
然后是图计算框架,这块有基于spark的graphx,有apache孵化的giraph,也有国产Tecent的Plato。这里面spark graphx整体的计算性能较差,但和spark集成度较好。
接着是机器学习开发框架,把机器学习相关的框架放在检测功能中,倒不是指在检测功能中去使用这些框架,而是指检测功能中会调用这些框架调教出来的模型。而且,这里也没有把深度学习框架放进来,我觉得安全领域对深度学习的落地场景太少。
最后提一下这个高性能缓存和KV数据库,这些缓存和数据库主要是给实时流处理框架在计算过程中使用,存储中间计算结果或者查询全局缓存类数据。因此,这类缓存和数据库必须是支持高性能并发读写的,数据结构可以足够简单。
技术栈:响应
响应功能的核心技术就是工作流引擎,市面上主流的工作流引擎无非jboss的jbpm,以及activiti和从activiti衍生出来的flowable、camunda,大同小异,选择一个适合自己的就行。