基于全局流表的流异常检测机制

一、引言

随着信息化的快速发展,攻击者越来越多地有针对性地对某些企业发动有利可图的攻击,如探查内部消息、进行破坏或窃取数据等,而单一的安全防护手段很难防范这些复杂攻击。其一,攻击者采用多种高级攻击手段,普通的检测机制不能有效及时检测到威胁;其二,通过持续渗透,攻击者获得内部资源的权限或内部用户的身份,便会绕过白名单机制。

综合而言,对抗持续高级威胁,应该采用多种防护手段,灵活地通过软件定义的应用编排和安全资源准备,发现攻击链的某一环并及时阻断。面对大型内部网络的海量数据,检测的第一步往往可以通过流量的统计信息入手,及时发现一些异常的访问模式,进而对这些异常流量进行进一步分析。近年来SDN(Software-Defined Networking,软件定义网络)技术越来越流行,SDN控制器提供了实时全局流量的视图,无疑为上述的异常流量检测提供了有力的支撑。

本文介绍了如何使用SDN技术实现全局流表,可记录和查询历史时刻内的所有的访问记录,并能防范如伪造源地址等恶意攻击。

关键字 全局流表 SDN 流异常检测

二、全局流表

全局流表(Global Flow)是指给定网络范围内的所有网络设备上的全部流量汇聚而成的流知识,通过构建全局和实时的流表,可知任意两点间数据流向和访问细节,这对先期分析异常行为有很大的帮助。

全局流表借助安全控制平台通过SDN控制器向网络设备收集流信息,并通过安全控制平台的数据服务进行存储和查询,如图1所示。软件定义安全体系已在前几期技术内刊中已有介绍,本文不做赘述。


图1 全局流表的架构图

本文讨论的场景在OpenFlow/SDN环境中,在 SDN网络中,数据包进入交换机后,按照 Flow Entry的优先级对流表中匹配域中的字段依次进行匹配,如果一个表项匹配成功,则执行相应的指令。所以交换机上的一条流表可以指示流自身信息及其下一步动作。从 SDN通过流表控制数据转发这一机制可以分析,一条流在流经交换机的过程中,在每一台交换机上控制其转发的流表中的 match 匹配字段是一定的,如果某条流的action 域中有修改该流数据包的命令时,match 中的某些字段才会发生改变,但是改变前的 match 和改变后的 match 控制的仍然属于同一条流。

全局流表的意义在于可以将整个网络中的交换机的流表融合,给定一个匹配域(如源IP->目的IP),就能找到所有存在该匹配域的交换机,并按照数据包转发顺序(上一个交换机的output端口与下一个交换机的inport端口可匹配),形成一个路径,可真实还原某个数据包在网络中完整的转发路径。这条路径一方面包含了访问关系的两个端点,记录了所有时刻所有访问记录的详细信息,建立了详细的流数据库;另一方面还包含了访问关系在转发平面上的每个中间点,可避免恶意攻击者伪造地址、攻破网络控制器操纵转发路径等攻击。

2.1. 全局的流量信息融合

全局流表算法的主要思想是首先根据弱节点覆盖求网络最小有效测量集,需满足该有效测量集(弱节点集合)收集的流量在一定误差范围内代表全网流量,然后定时收集弱节点上的流表,经过流分类整合步骤,整合出每条流流经的弱节点集合。由于只获得了每条流流经的弱节点,为部分节点,所以最后通过路径还原算法,将流的路径由弱节点还原至整个网络路径。全局流算法流程如图2所示。


图2 基本算法流程图

为了减少收集流表对网络性能的影响,测量节点应选择的越少越好,因此应求出一个最小的有效测量集,通过该集合收集到网络的全局流量,并可以计算出每一条流的路径。大量实验证明交换机或者路由器具有流量守恒定律,利用这一特性可以有效的减少测量节点,从而减少收集流量对网带来的压力。


遍历过所有的流表信息后,可以将每一条流流经的交换机统计出来,这一操作过程称为分类。

在遍历流表在找每一条流流经的交换机时,将该交换机与其转发端口存成NodePortTuple二元组,在每个集合中保存有多个二元组,构成一个二元组集合,每个二元组可以表示为(niu),该二元组表示该数据流流经交换设备ni,通过其转发端口u转发出去。

假设一条流流经交换机dpid1,该流从该交换机的转发端口为3,那么将<dpid1,3>一起存入到hashmap中。经过分类之后的数据结构举例如图3所示。

图3 分类操作后的全局流表结构

但需要考虑一种前述的复杂场景:同一条流在流经不同交换机后,其流的某些字段的可能会被修改,所以一条流可能有多个不同匹配的流表,最终全局流表算法输出结果是一个 map

Key:是该流在整个流经过程中经历的所有交换机的 match 集合的 md5 值。比如 key_list=match_1+match_2+match_3,那么 key 为 key=md5(match_1+match_2+match_3),match_1,match_2,match_3 是按照其被修改的顺序排列。

Value:是一个复合的对象,包含该流的所有 match 集合以及该流流经的交换机路径。Match 集合是一个 list 对象,list={ match_1,match_2,match_3},路径是一个链表集合,path={dpid1,dpid2,dpid3……}。此时全局流结构如图4所示:


图4支持地址转换的全局流表数据结构

2. 2 全局流表样例

全局流表模块利用网络控制器的拓扑API收集拓扑信息,假设网络控制器返回的数据格式如下所示,其中列表中的每个JSON对象表示了一条交换机与交换机的连接关系。

[

{

“src-switch”: “00:00:00:11:22:03:04:01”,

“src-port”: 3,

“dst-switch”: “00:00:fa:40:d0:82:71:4a”,

“dst-port”: 1,

“type”: “internal”,

“direction”: “bidirectional”

},


{

“src-switch”: “00:00:1e:15:3a:5d:7f:4e”,

“src-port”: 2,

“dst-switch”: “00:00:fa:40:d0:82:71:4a”,

“dst-port”: 2,

“type”: “internal”,

“direction”: “bidirectional”

}

]

那么全局流表模块把所有交换机的流表信息收集起来之后,通过特定的算法(弱顶点覆盖算法),解析出全局流信息。通过API获取的全局流的两条样本数据如下:

{

    "status": "ok",

    "result": {

        "99194ec2bdc26f53b7ce1492265cc1ac": {

            "matchlist": [

                {

                    "id": "c7fc6816e5d6acb6d9ada6d95683c2fd",

                    "wildcards": 3678448,

                    "inputPort": 20,

                    "dataLayerSource": "fa:16:3e:c8:43:53",

                    "dataLayerDestination": "fa:16:3e:9d:c8:58",

                    "dataLayerVirtualLan": -1,

                    "networkSourceInt": -1,

                    "networkDestinationInt": -1,

                    "queryPage": 1,

                    "querySize": 5,

                    "match": "fa:16:3e:c8:43:53;fa:16:3e:9d:c8:58;0.0.0.0;0.0.0.0;0;0;0;-1;-1;0;0;0;0;3678448",

                    "redirect": true

                }

            ],

            "pathlink": [

                {

                    "nodeId": "00:00:3a:99:81:f9:19:44",

                    "portId": 0

                }

            ],

            "packetCount": 3,

            "byteCount": 163

        },

        …

        "66443400e3237e55876168a2d911cc36": {

            "matchlist": [

                {

                    "id": "3441e9d7d33ad5e6c9ce1d2b3b58007d",

                    "wildcards": 3678448,

                    "inputPort": 3,

                    "dataLayerSource": "fa:16:3e:3b:69:23",

                    "dataLayerDestination": "44:03:a7:74:a6:4a",

                    "dataLayerVirtualLan": -1,

                    "networkSourceInt": -1,

                    "networkDestinationInt": -1,

                    "queryPage": 1,

                    "querySize": 5,

                    "match": "fa:16:3e:3b:69:23;44:03:a7:74:a6:4a;0.0.0.0;0.0.0.0;0;0;0;-1;-1;0;0;0;0;3678448",

                    "redirect": true

                }

            ],

            "pathlink": [

                {

                    "nodeId": "00:00:e0:db:55:1f:99:b4",

                    "portId": 0

                },

        {

                    "nodeId": "00:01:45:90:ff:1f:89:b3",

                    "portId": 1

                }

            ],

            "packetCount": 50,

            "byteCount": 22330

        }

    }

}

    其中result中的每个JSON对象表示了一条全局流数据,pathlink表示流经的交换机。

三、GFaaS

全局流表可作为一种服务对外提供接口,供安全控制平台之上的应用调用,形成全局流表即服务(GFaaS),如图5所示。

 


5 全局流表服务示意图

该服务包括数据的存储和查询。简单而言,可以订阅-推送的方式,将安全控制平台收到的流数据推送到存储节点,目前该存储节点支持ElasticSearch(ES),可提供丰富多样的实时搜索查询功能。前端Django站点调用ESPython API,完成数据的查询功能。

3.1. 全局流数据的存储

全局流数据是通过订阅-推送模式进行存储,根据事件类型分别保存为当前流量和历史流量库。

安全控制器使用分布式消息队列把需求的数据绑定到相应的事件上,运行时把事件推送到消息队列中,那么只需要在固定的模块中订阅相应的事件,就能够在事件被触发的时候获取需求的数据。

安全控制器定时收集的流信息,将当前的流量存储到当前流量库中;同时,如果发现某些上一时刻的流消失后,会触发一个流结束事件并推送到消息队列。全局流表模块收到该事件则表明数据流已结束,则将该流存储到历史流量库。

经过解析后的全局流数据,一个记录包含13个字段,最终以JSON格式保存到ES数据库中。样本数据截图如下:


3.2 全局流数据检索

全局流数据检索应用,可以检索目前网络中存在的符合查询条件的流,并以表格的形式呈现。目前可支持对源目的MAC、源目的IP和源目的端口的匹配。查询得到获知满足条件流在所有交换机上经过的路径。前端如图6所示。

图6 全局流表查询图

全局流历史记录查询应用,查询的数据不止当前网络中的数据,还可以包括历史时刻的数据,这对安全事件发生后的取值是有帮助的。

四、全局流数据的应用

全局流表记录了网络中的所有访问信息,可以为多个安全应用所服务。

4.1. 流异常检测和回朔

通过全局流表知识,安全应用可以获知任意时刻源目的连接的起止时间和流量大小,进而可以建立一个正常访问的基线(Baseline)。

运行时,安全应用从全局流表中遍历当前流的数据,如果发现某条流在基线之上(即不符合正常访问的模式),则认为该访问存在风险。例如正常情况下数据库服务器B只会被前端Web服务器C访问,但某日办公主机A突然与某日连接B,这就存在异常;再如某内网服务器D短时间内向整个网络进行大量TCP SYNC尝试,这也触发了异常报警。

一旦安全应用检测到流级别的异常后,则可通过SDN控制器将异常流量牵引到如IDS或TAC做进一步的数据包payload检测或文件行为分析。

当安全应用或安全专家确认内网中确实发生了恶意攻击后,需进行取证和加固。此时可借助全局流表,找出攻击者的攻击路径。因为历史流表中记录了攻击者从一开始的尝试,到渗透成功后的进一步攻击行为痕迹,只要找出恶意样本对外连接的模式,以及攻击者在受害节点对外扫描、攻击等特征,就能分析攻击者是如何一步一步进入,也能获知有哪些主机被攻破,可生成相应的调查报告,并对受害主机进行恢复和加固。

4.2. 伪造源地址欺骗

伪造源地址的攻击(如某些SYNC Flood)在传统网络中较难防范,但全局流表可抵御这些攻击。

文中3.2展示了检索满足某些条件的流经过哪些交换机,也就是说全局流表可展示流量在二层网络中的路径。那么对于伪造源地址的攻击而言,尽管这些数据包的源地址被改写为不存在的地址或其他用户的地址,但其经过的交换机却真实地记录了它们的轨迹,如果攻击者的源主机就在本网络中,那么流表路径上的第一个交换机的inport所连主机就是恶意主机,这在事后的审计追查非常有用。

4.3 全局流数据可视化

对全局流数据进行可视化,能够对流信息有更为直观的判断。图7为全局流数据可视化的截图:

图7 全局流表展示图

图中蓝色圆圈为交换机,红色圆圈为主机,黑色的线表示物理链接关系,高亮的线表示网络中的流信息,并且根据每条流的颜色随该流的byte_count字段而改变。

下一步工作将会以历史时刻为搜索条件,动态展现某个时刻的流量信息。

五、结束语

全局流数据有着更广阔的应用场景,比如在入侵检测方面,能够通过设置阈值、数据挖掘等各种方式,一定程度上检测到异常流,提供安全服务。

Leave a Comment

Your email address will not be published. Required fields are marked *