基于消息中间件的分布式网络扫描
2020-12-16胡栋梁秦晓军王晓锋
胡栋梁,秦晓军,王晓锋
(1.江南大学 物联网工程学院,江苏 无锡 214122; 2.江南计算技术研究所,江苏 无锡 214083)
0 概述
网络安全不仅是国家安全的重要组成部分,还关系到人民群众的财产和信息安全。网络扫描作为研究网络安全的第一步,其通过对网络主机进行扫描,使得运维人员了解到网络主机的安全配置和运行服务,从而发现并处理存在的安全威胁,同时对网络风险等级进行评估[1]。传统的网络扫描一般采用单点主动扫描,适用于层次简单、规模较小的局域网。由于应用性能需求导致网络规模不断扩大,也促使网络构成日益复杂。在实际应用中,运维人员通常将具有一定规模的计算机网络划分为若干个子网,通过设置VPN和防火墙实现私有网络的安全性。上述技术的应用虽然可提高网络的可用性,但是降低了网络的可管理性,同时还限制传统单点扫描技术对较大规模网络实施网络扫描的能力。
为进一步提高网络扫描的实时性和准确性[2],本文提出一种分布式网络扫描架构和任务调度算法。其中,分布式网络扫描架构采用三层架构,且主控节点可调度感知节点,而感知节点可跨区域部署,因此感知过程可以不受地域限制。任务调度算法则通过分析历史感知时间,找到最优感知节点进行调度。
1 相关工作
1.1 单点扫描
在单点扫描方面,经典性的扫描软件主要包括Nmap[3]与Zmap[4],由于软件设计的局限性,两者都不具备分布式扫描的特点,无法进行大规模、跨内部网的网络扫描。文献[5]针对现有网络扫描技术中存在扫描静态性功能、分析评估功能等不足,在对现有扫描技术基本原理综合分析的基础上,对网络扫描技术智能化策略进行分析探讨,并构建一种符合智能化策略的网络扫描系统概念模型。文献[6]提出分块二分算法,合理设置2次提取IPID序列号间等待的基本延时,以提高IPID隐蔽网络扫描效率。文献[7]提出一种限制RST速率的空闲扫描方法,以逃避传统空闲扫描检测方法的检测。以上研究提出的扫描方案均是针对单点扫描方法以及逃避扫描检测机制进行改进,并未提出采用分布式扫描方案[8]来解决大规模网络扫描效率较低的问题。
1.2 分布式任务调度算法
在分布式任务调度算法方面,文献[9]结合网格计算环境构建一种描述网格体系结构的完全分布式模型,该模型着重于分布式负载平衡算法的建模和描述。利用模型检验对研究协议的不同性质进行形式化验证,并给出一组性能分析结果。文献[10]针对当前任务调度算法的资源利用率低、负载严重失衡等难题,提出基于负载均衡的任务调度优化算法,以提高分布式系统性能。该算法根据节点的性能实现任务的重新分配和调度,使得节点负载尽可能均衡合理。文献[11]提出一种基于纳什均衡联合调度策略的分布式强化学习算法,相比于静态调度算法,该算法利用更少的系统知识,即可使得调度器去主动学习任务到达和执行的相关先验知识,以适应相邻调度器的分配策略,促使调度器的策略趋向纳什均衡。文献[12]提出对异构分布式计算系统的形式化描述,并建立静态任务调度问题的理论体系。通过分析总结最长动态关键路径(Longest Dynamic Critical Path,LDCP)算法的核心思想及存在的不足,提出一种运用节点信息流量减少CPU空闲时间碎片的并行任务调度优化算法。
上述调度策略都是根据任务的权重或者负载进行任务分配和调度,并未考虑通信子网的通信时间,因此不能直接运用到网络扫描中。基于以上分析,本文将重点研究消息中间件[13]技术的分布式扫描框架,并寻找最优感知节点的分布式调度算法。
2 分布式网络扫描架构与通信流程
2.1 分布式网络扫描架构
本文采用一种三层模型[14]的分布式端口扫描架构,具体如图1所示。
图1 分布式网络扫描三层模型Fig.1 Three layer model of distributed network scanning
由图1可知,三层模型架构分别为控制层、中间件层与感知层,其主要特征是利用中间件层将控制层和感知层完全解耦,提升扫描系统的可扩展性与并发性。该架构的主要优势是将传统的单节点扫描扩展为多节点共同扫描,且多节点可处于跨区域不同的通信子网中。动态增加扫描节点数即可提升整个系统的扫描效率。此外,由于采用多节点机制,可利用分布式任务调度算法将给出的一系列扫描目标动态分发到距离最近的扫描节点,从而提高扫描目标节点的效率,降低扫描时间。目标集合是扫描的目标节点集合,其是大规模网络中运行TCP/IP协议的网络设备集合,主要包括主机、路由器、服务器与防火墙等网络设备,且该层不属于三层架构模型。三层架构的功能为:
1)控制层处于最上层,也是三层架构的核心,它控制着扫描任务的分配、定义、注册、调度与下发。相比传统的二层扫描架构[15],控制层并不直接将扫描任务发送给指定的感知层扫描节点,而是将所有的控制信息均经过中间件层间接地与感知层交互,其工作流程如图2所示,且具体步骤为:
(1)任务分配模块根据任务分配算法将用户定义的扫描任务分配到子任务中。
(2)任务定义模块将一个子任务以一个task对象来实现,task是调度的基本单元。
(3)任务注册模块将会分配task一个全局唯一的task ID,并将其持久化写入数据库。
(4)任务调度模块根据调度算法从数据库中取出子任务task ID并转交给任务下发模块。
(5)任务下发模块将消息队列中的任务消息经过消息中间件发布出去。
图2 分布式网络扫描控制层工作流程Fig.2 Workflow of distributed network scanning control layer
2)中间件层[16]使用一种分布式应用间互相通信的消息队列技术,该技术可工作在磁盘或内存上[17],其中存储的任务消息可被控制层和感知层消费。通过使用消息中间件,可降低感知层扫描程序和控制层控制程序的耦合度,且感知层与控制层可相互独立工作。
图3中的消息中间件使用交换模块将任务下发模块下发的任务消息根据设定的routing key转发到不同的队列中,HostX将消费其中的任务消息。队列的技术模型采用点对点P2P模型,具体如图4所示。该模型表示通过生产者Client调用API生产的消息Message1发送到Queue中,且只能被唯一消费者Client消费。因此,图3中队列QueueX消息只能被唯一指定的HostX消费,当一个任务消息经过交换模块进入QueueX中时,该任务消息将会排在队列末尾,当且仅当其前面的消息被扫描节点Woker执行后,该任务消息才会被执行。
图3 消息中间件流程Fig.3 Procedure of message middleware
图4 点对点模型Fig.4 Point to point model
3)感知层是三层架构中的最底层,其主要负责扫描任务的执行。感知层应用程序消费来自中间件层传递的控制消息,并根据消息获取扫描目标和扫描策略,并进行相应的扫描行为。分布式网络扫描感知层流程如图5所示,具体步骤为:
(1)接收任务消息模块获取中间层的任务消息,并且回传一个确认消息给中间层。
(2)分析模块根据task ID从注册管理器中获取扫描目标和扫描策略,且将分析信息发送至扫描器。
(3)根据扫描策略启动扫描器,扫描器的扫描技术分为使用icmp协议扫描、tcp协议扫描以及udp协议扫描等,根据扫描策略使用扫描协议。扫描目标是目标主机的集合,即IP地址的集合,IP地址有2种表示方法,具体如表1所示。
图5 分布式网络扫描感知层工作流程Fig.5 Workflow of distributed network scanningawareness layer
表1 IP地址表示方法Table 1 IP address representation
相比传统的控制层和感知层的两层架构,本文设计的三层架构具有以下特点:1)可跨平台、跨操作系统操作;2)具有良好的开放性和易扩充性;3)系统管理简单,具有较高的可用性;4)支持异种数据库和数据持久化。
2.2 分布式网络扫描通信流程
分布式扫描通信流程如图6所示,该流程主要包括描述各层包含的模块、各层之间信息流以及模块之间的信息流。它整体描述了扫描任务在该分布式系统中,从主控节点信息配置、任务定义注册、任务下发到任务执行的整套通信流程,具体步骤为:
步骤1主控节点信息配置,包括配置broker_url用于信息交换的消息队列Message Queue,以及存储扫描结果的数据库DataBase与result_serializer设置传输数据格式。
步骤2主控节点对扫描任务定义与注册,扫描任务定义中使用任务分配算法将任务集划分成若干个互相独立的任务,并计算得到执行该任务耗时最少的扫描节点地址。然后将任务向注册管理器注册,注册管理器记录所有主控节点定义的任务ID和任务描述,并回复注册成功信息。
步骤3通过扫描任务的调度与下发,获取注册的任务ID,主控节点利用任务ID和执行该任务的扫描节点地址构造任务消息,并调用下发管理器下发任务。
步骤4任务消息下发至消息中间件后,消息中间件根据任务消息中包含的扫描地址,通过路由功能将任务消息转发至相应的扫描节点。
步骤5相应扫描节点获取从消息中间件中传递的任务消息,并从中解析获取任务ID,扫描节点根据任务ID从注册管理器中获取具体的任务描述。
步骤6扫描节点通过获取到的任务描述,启动一个扫描线程执行该任务。当有多个任务到达时,则开启多个线程并发执行。
步骤7当扫描任务执行完成,获取扫描结果并将其存入扫描结果数据库,将任务完成信息回传至消息中间件并通知主控节点。
步骤8主控节点接收到任务完成信息后,从扫描结果数据库中提取结果信息。
图6 分布式扫描通信流程Fig.6 Communication procedure of distributed scanning
3 分布式扫描任务调度算法
基于上述分布式扫描框架,为进一步提高扫描效率,本文对面向扫描任务的分布式调度算法进行研究。
3.1 相关定义
定义1目标主机是网络扫描的目标。A={a1,a2,…,am}表示扫描目标地址集合,其中,m为扫描目标的数量。
定义2扫描策略是用户指定的扫描类型的不同组合,P={p1,p2,…,pn}表示需进行的扫描策略,其中,n表示扫描类型的数量。扫描类型根据协议的类型不同可分为icmp协议扫描、tcp协议扫描等,其扫描原理为:扫描节点Client使用不同的扫描类型向目标主机Server发送不同类型的报文,并根据返回的报文分析得出结果。扫描策略通过使用不同组合的扫描类型,分析获得目标主机的详细信息。
定义3扫描任务[18]主要包括目标主机和扫描策略2个部分。扫描任务H=(A,P)是由扫描目标和扫描策略组成,在一个扫描任务中,不同的扫描节点对不同的目标主机进行网络扫描时,它们之间是彼此独立的,相互之间不需要消息通信,因此,不同目标的扫描可以调度到多个扫描节点中并行执行。本文将扫描目标作为任务划分的标准,并将一个扫描任务分解为多个独立子任务,且每个子任务就是对扫描目标进行指定扫描策略的网络扫描。因此,扫描任务集变换为H={h1,h1,…,hm},其中,hi,i∈[1,m]。
定义4扫描节点。单点主动扫描节点可根据用户指定的目标主机和扫描策略进行主机发现、端口扫描、服务发现和操作系统探测等网络扫描。在模型设计中假设扫描节点运行于硬件配置相同的机器中,因而可以假设各扫描节点的处理能力是相同的,扫描节点集合W={w1,w2,…,wr},其中,r为扫描节点的数量。
定义5扫描任务调度。采用任务调度算法将扫描任务调度到各个扫描节点中,该算法的目的是在最短时间内获取最准确的结果。
3.2 任务调度模型分析
图2控制层结构描述了调度模块的功能,下文通过图7的形式化语言详细描述调度模型。
图7 调度模型示意图Fig.7 Schematic diagram of scheduling model
与传统的单点扫描加入控制器模块相比,图7提出的调度模型将对扫描任务的控制管理与调度进行解耦,解决了由于扫描任务过多而造成程序阻塞、扫描效率降低的问题,且添加的就绪、等待队列使网络扫描从同步扫描转化成异步扫描,提升了程序调度子任务的性能。
扫描任务集合H和扫描节点集合W可以构造一个r×m的通信矩阵Z,用来表示扫描节点和扫描目标之间的通信时间。
其中,zij,i∈[1,r],j∈[1,m]表示第i个扫描节点与第j个扫描目标之间的通信时间。需要特别说明的是:当扫描节点i与扫描目标j属于同一通信子网时,zij为0;当扫描节点i与扫描目标j不能建立连接或j不响应任何探测报文时,zij为∞。
当扫描大规模网络时,进行一种扫描类型所需的时间为:
t(pi)=ui+cit,i∈[1,n]
(1)
其中,ui表示执行某种扫描类型需要的CPU处理时间,ci表示探测数据包在扫描节点和目标主机间的传输次数,t表示探测数据包在目标主机和扫描节点之间的传输时间。扫描策略是多种扫描类型的组合,因此完整的执行时间为其包含的所有扫描类型的执行时间之和,表示方法如下:
(2)
将通信矩阵Z代入式(2),可得:
cl>0,i∈[1,r],j∈[1,m]
(3)
tij(P)=α1+zijα2>0,i∈[1,r],j∈[1,m]
(4)
假设各个扫描节点CPU处理能力和传输次数是相同的,则分配给各节点的扫描子任务数量成为负载指标的主要考虑因子。本文使用L集合表示某时刻t各扫描节点的负载情况,L(t)={l1,l2,…,lr},Li(t),i∈[1,r]表示t时刻分配给第i个扫描节点的扫描子任务数量,0≤li≤m。使用矩阵Qm×r表示扫描任务集调度方案,Qpi=j表示在第i个扫描节点上的第p位,将执行第j个子任务,其中i∈[1,r],p、j∈[1,m]。任务调度矩阵的列向量Qi则为分配给第i个扫描节点的子任务集。
扫描任务完成时间取决于各个扫描节点执行完主控节点分配的子任务而花费的最长时间,因此可给定一个该扫描任务调度目标,即寻找扫描任务集H在扫描节点集W上执行时间最短的任务调度矩阵Qbest,使得花费时间最大的扫描节点的完成时间最小。
Y(Q)=min(maxYi),i∈[1,r]
(5)
其中,Yi,i∈[1,r]表示第i个扫描节点执行完分配的子任务集需要的时间。
对于任意的扫描子任务hj,在理想情况下,应当将其分配到执行该扫描子任务最快的扫描节点上,而子任务hj在扫描节点wi,i∈[1,r]上的完成时间包含2个部分:一部分是完成子任务hj分配给wi的任务集Qj的执行时间,另一部分是hj在wi上的完成时间。
(6)
由式(6)推出最快的完成时间为:
(7)
因此,式(7)即为将扫描子任务分配给扫描节点的判断标准。根据该标准,最优任务调度矩阵Qm×r需要满足以下约束条件:
1)主控节点必须将扫描目标分配至与其在同一通信子网的扫描节点中,即在通信矩阵Z中zij=0的扫描目标和扫描节点。
3.3 基于历史扫描时间任务调度Dscan算法
根据上述分析,Dscan算法将子任务分配给任务数量最少的扫描节点,能够保证以最快的时间完成扫描任务。相对于传统的单点扫描,该算法优化了扫描节点对目标主机的选择。
Dscan算法描述如下:
步骤1fori=1 tomdo
在通信矩阵Z中,表明目标主机或其所在网络不可达的此类任务跳过,不对其执行,并将其从扫描任务集中删除。若存在唯一扫描节点与扫描目标在同一网络中,则直接将该扫描子任务分配给该扫描节点wi,并在任务调度矩阵Q中的第j列添加hi的任务号。判断所有子任务是否已经分配完毕,若已分配完毕则转至步骤4;否则未分配子任务为m′并转至步骤2。
步骤2fori=1 tom′ do
1)寻找与所探测目标主机hi处于相同子网的扫描节点wj,并将wj加入到扫描节点子集合w′中。
2)如果m′为空,则跳出该循环体,否则继续执行下一步骤。
3)由于在w′中各个扫描节点与所探测目标主机hi通信时间相同,则选择已分配任务数最少的扫描节点wj,j∈[1,r],并将hi分配给wj执行,即在任务调度矩阵Q中的第j列添加hi的任务号。
4)将相应扫描节点wj的已分配数增加1,并判断所有扫描子任务是否已经分配完毕,若已经分配完毕则转至步骤4;否则未分配子任务为m″并转至步骤2。
步骤3fori=1 tom″ do
1)计算扫描子任务hi在各个扫描节点的完成时间y(wj),j∈[1,r]。
2)找出能够使得min(y(wj)),j∈[1,r]最小的扫描节点wbest,best∈[1,r],将扫描子任务hi分配到wbest中,并将该子任务号添加至任务调度矩阵Q中。
步骤4确定任务调度矩阵Q,并完成子任务的分配。
4 实验验证与评估
4.1 实验环境
实验场景搭建在Openstack[19]Queue版本云计算管理平台上,各虚拟主机[20]使用的操作系统版本为CentOS[21]Linux 7 Core Kernal 3.10.0-327.e17.x86_64,配置信息为1v CPU、2 GB RAM与10 GB DISK。虚拟Router使用的操作系统是搭载路由软件Quagga[22]的Ubuntu[23]12.04.5 LTS,配置信息为1 V CPU、4 GB RAM与40 GB DISK。
目标网络拓扑模拟的是一个分布式网络环境,且Dscan系统部署在该分布式环境中。
4.2 扫描时间分析
在上述虚拟主机与路由器配置情况下,构建目标主机的发现场景,网络拓扑示意图如图8所示。其中,VM1,VM2,…,VM11均为虚拟主机,R1~R5均为虚拟路由器,“云”表示主机所在网络。通过Openstack搭建上述网络测试环境,3种扫描方法部署如表2所示。
图8 网络拓扑示意图Fig.8 Schematic diagram of network topology
表2 3种扫描方法中节点部署描述Table 2 Description of node deployment ofthree scanning methods
3种扫描方法针对的目标网络分别是192.168.11.0/24、192.168.0.0/20、192.168.0.0/16、192.160.0.0/12与192.0.0.0/8,在对存活主机和非存活主机进行主机扫描时,扫描协议均采用ICMP协议,记录3种扫描方法对目标网络的扫描时间,结果如图9所示。
图9 3种扫描方法的扫描时间对比Fig.9 Comparison of scanning time of three scanning methods
从图9可以看出:当扫描主机个数小于4 096个(即目标网络为192.168.11.0/24、192.168.0.0/20)时,Dscan、Nmap的扫描时间几乎是一致的,且均低于Zmap;当扫描主机个数大于65 535时,Dscan的扫描时间保持在1 min以下,而Nmap和Zmap的扫描时间有不同幅度增长;当扫描网络为192.0.0.0/12时,Dscan可在2 min内完成扫描,然而Nmap和Zmap无法在该时间内完成扫描。通过该实验验证了分布式扫描系统Dscan相比传统的单点扫描可提高扫描效率,同时也验证了本文提出的分布式框架中任务分配方案的可行性。
4.3 CPU占用率分析
根据网络拓扑部署实验环境,分别利用Dscan、Nmap与Zmap对目标网络192.0.0.0/12进行扫描,运行过程均在主机VM1上进行,且以运行10 s、20 s、30 s、40 s、50 s与60 s为采集点,所得扫描程序的CPU使用率如图10所示。从图10可以看出:在运行时间大于10 s后,Dscan扫描的主控节点在VM1上的CPU使用率从16%逐渐降至1%,这是因为Dscan主控节点在10 s前需要计算将各个扫描任务分发至其他扫描节点的时间,当分发任务完成后,主控节点异步等待其他扫描节点完成扫描任务,主控节点只需维持与各个扫描节点的连接即可,而其他2种扫描方法的CPU使用率在运行期间一直保持为16%和58%,远高于Dscan的CPU使用率。通过该实验验证了分布式扫描方法Dscan相比传统的扫描方法可降低主控节点CPU资源使用率,达到节省资源的目的。
图10 3种扫描方法的CPU使用率对比Fig.10 Comparison of CPU usage of three scanning methods
4.4 分布式调度算法的有效性
根据互联网IP地址分配中心取得网络号,实验将其划分为8个网络区域,且主控节点和扫描节点分别为116.193.16.5与xxx.xxx.xxx.3。图11为在该网络中存在的8个网络区域,且每个区域存在若干主机。本文将扫描每个区域的网络设备情况设置为一个扫描任务,并将其下发给主控节点与扫描节点。
图11 网络区域示意图Fig.11 Schematic diagram of network area
在不使用3.3节所述的分配算法时,扫描任务hj随机下发给节点wi,i∈[1,r]。而经过上述分配算法后,扫描任务将会下发给与扫描任务相同的通信子网或者通信时间最少的通信子网。本文算法使用前后的响应时间对比如图12所示。从图12可以看出:当扫描区域数量为1、2时,本文算法使用前后的响应时间均为50 s,上下波动不到1 s;随着扫描区域数量的增多,响应时间相差逐渐增大,且当扫描区域数量增大至8时,采用本文算法后响应时间增加至100 s,远低于未使用调度算法的290 s。该实验可表明通过使用分布式扫描任务调度算法可提高分布式扫描效率,由此验证了本文所提调度算法的有效性。
图12 本文算法使用前后的响应时间对比Fig.12 Comparison of response time before and afterthe algorithm used in this paper
5 结束语
本文基于分布式网络扫描思想,对中间件异步通信技术进行研究,构建一种由控制层、中间层与感知层组成的三层分布式网络扫描框架,提出一种扫描任务调度算法。通过多组实验验证了分布式网络扫描技术相比传统单点扫描技术可有效提高扫描效率,降低单台主控端的CPU使用率。后续将对端口扫描技术进行进一步研究,在保证分布式网络扫描有效性的情况下,提高扫描效率与准确性。