基于Docker的面向网络空间的漏洞靶场设计与实现
2021-04-20唐俊晓
◆唐俊晓
基于Docker的面向网络空间的漏洞靶场设计与实现
◆唐俊晓
(周口师范学院计算机科学与技术学院 河南 466000)
在网络空间安全研究、网络安全人才培养和攻防演练中,靶场对于理论原理与实践技术的结合起着重要作用。为解决资源有限的条件下靶场部署难度大、资源利用效率低的问题,基于Docker虚拟化技术,设计了一种可按需调配资源,构建用户靶机相互独立的漏洞测试靶场。实践测试表明,此系统可以通过构建虚拟网络空间,快速部署动态靶机,便于应用在高校网络攻防平台建设及各类网络安全赛事中。
网络安全;Docker容器;网络虚拟化;漏洞靶场
随着互联网技术的发展,网络安全形势愈发复杂多变。网络空间已成为公认的第五空间,网络安全人才是网络安全发展第一资源,而漏洞是网络安全重要的研究对象,各类的网络安全竞赛成为选拔和培养网络安全领域人才的重要手段[1]。“未知攻焉知防,未知防焉知攻”,构建漏洞靶场系统,通过对漏洞进行测试,以攻击者的角度进行模拟攻击过程,从而学习漏洞成因,了解相关技术原理,是当前网络安全学习的基本方法。在构建网络攻防平台过程中也存在着许多种制约因素,主要包括:在有限资源条件下部署实验环境难度大,需要良好的物理设备支撑,管理困难。其次,网络攻防过程本身具有一定破坏性,尽管其目的不是破坏系统,任何不当的操作都可能对主机、系统、应用软件,甚至对整个计算机网络都会产生一定危害和影响。虚拟化技术能较大程度上缓解以上问题,基于虚拟化技术的方式又具备有应用场景广、破坏性小、扩展性强的特点,使之成了高校网络攻防平台建设及各类网络安全赛事中比较理想的实现手段[2]。
1 系统设计
1.1 系统分析
本文希望设计实现的虚拟化漏洞靶场系统能够真实再现漏洞存在环境,在攻防的过程中能保持系统稳定性,实现资源动态分配,节省物理设备资源。这样的系统满足以下几个条件:(1)系统可以快速部署漏洞环境;(2)不同用户创建的靶机环境相互独立;(3)虚拟的网络环境能真实再现生产环境下漏洞的存在条件;(4)系统按需分配云计算资源,测试中系统能抵御较为剧烈的攻击,既能达到渗透测试演练的目的,又能维持物理主机(运行环境)的稳定性,从而实现系统稳定、安全的运行,有效满足培训练习的要求[3]。
在高校、网络安全赛事等的学习和训练中,一个靶场环境往往会分配给很多学员,若多个学员都使用同一个环境,从攻防的角度来看,培训的过程必然会受到影响。如果学员独享靶场环境,又需要考虑到服务器承载能力和平台运行的稳定性。此类网络靶场的实现需要做到靶机环境独享,且高效利用系统资源。
1.2 系统结构
图1 靶场架构设计
基于上述分析,系统整体结构分为靶场系统模块、Docker管理模块和漏洞库。如图1所示,靶场系统模块分为靶场平台和靶机控制两个部分,靶场平台负责展示用户数据和靶机信息,使用者可以通过靶场平台开启靶机,靶机控制模块对使用者开启的靶机数量进行控制,限定每个用户可以同时开启的靶机数量,在用户启动靶机时会对靶机持续时间进行限制,超过时间将靶机资源回收,使用者也可以自主选择销毁靶机环境,具体的靶机环境由Docker管理模块对镜像实例化后以容器的形式存储在漏洞库里。Docker管理模块分为仓库、容器、镜像三个部分。仓库模块负责存储制作好的漏洞环境镜像,镜像模块负责从仓库中获取漏洞环境镜像以及对镜像添加标签、删除操作,容器模块负责本地容器的创建、运行、终止和删除,创建的容器的生成由镜像实例化得到[4]。
2 靶场实现
2.1 相关技术介绍
复现的漏洞环境通常需要几个服务组织在一起,Docker的核心思想就是如何将应用整合到容器中,并且能在容器中实际运行,将应用整合到容器中并且运行起来的过程称为“容器化”(Containerizing)。Docker网络是容器应用之间通信的核心,也是实现靶场对靶机控制的核心。CNM规定了Docker网络的基础组成要素,CNM中3个基本要素为:沙盒(Sanbox)、终端(Endpoint)和网络(Network),组件连接如下图2所示,三个组件连接组成了Docker环境中最小的调度单位容器。系统搭建在Docker之上,容器之间、容器与外部网络和VLAN之间的连接都依赖于不同的网络,Docker封装的一系列本地驱动,为系统网络设计提供了解决方案。其中bridge是使用最多的也是Docker默认的网络驱动[5]。
2.2 部署靶机环境
在搭建虚拟化漏洞环境时,多数漏洞应用由一些小的服务相互协同来组成完整可用的应用,系统需要复现漏洞的存在环境,并不需要再现完整的生产环境。以部署靶场平台为例,靶场平台是由多种服务组织在一起实现的,其架构如下图3所示,应用容器化的过程中,Dockerfile定义了如何构建应用服务所使用的镜像,Compose.yml是compose文件,主要包括Services,Volumes,Network等设置,Services定义了Docker服务的信息,Services用于配置对应服务挂载的外部目录,Networks通过定义不同的虚拟网络实现了容器网络之间的隔离。通过Docker Compose编排工具将应用启动,它会构建和配置所需要的镜像,并创建Docker网络,实现统一编排,统一部署[5]。
图2 CNM组件连接
图3 部署系统平台流程
部署靶机环境时,将编写好的Dockerfile和Compose文件,进行图3所示的容器编排部署过程,生成的应用即为完整的漏洞环境,将其存放到漏洞库中。为了实现使用时能快速启动靶机环境,可以批量进行此过程,预先在系统上部署大量漏洞环境镜像,在实际使用中可以提供大量靶机环境供使用者选择,使用者在开启靶机的时候,系统只需通过Compose编排组件将漏洞环境进行容器化过程即可,在系统使用人数较多的情况下,有效节省了靶机启动时的资源消耗,也缩短了使用者开启靶机的等待时间。
在实例化的过程中,靶机镜像会存在很多相同的组件,如数据库、Web中间件等,Docker会对要拉取的镜像分层检测,识别出本地已经存在的镜像层并直接使用,被多个镜像共用的镜像称为共享镜像,对于相似度很高的靶机镜像,也会共享很多镜像层。这种方式可以有
效地节省系统空间,提升系统性能。由于靶机并不是同时开启的,此时环境镜像作为静态只读文件保存在系统中,只占用系统的存储资源。使用时系统按用户的需求启动相应的靶机,因此可以在一台低配置的机器上部署大量靶机,占用的只是系统的存储资源。
在实际测试中,用户开启的靶机都是由静态镜像通过容器化生产动态靶机的过程,而不是将靶机直接部署到系统中,为所有使用者共享。从使用者的角度来看,不同使用者打开靶机都需要进行容器化的过程,开启的靶机之间都是相互独立的,使用者可以独享一个靶机,在漏洞测试中能更有效满足测试需求,得到更好的用户体验。
2.3 虚拟网络空间实现
在本系统中,系统所有模块以及动态靶机均以容器的形式存在,容器之间是资源相互隔离的,为了实现系统对靶机的控制和管理,通过Docker网络构造了系统网络空间,容器作为网络节点,实现了靶场系统模块之间的连通与隔离,是部署动态靶场的关键技术[6]。这种网络上的连通与隔离主要体现在靶场系统上,论文对系统的靶场平台网络和靶机控制模块网络实现进行阐述。
靶场平台部署流程如图3所示,为了实现靶场平台基本组件之间的通信,系统设置了一个internal网络,网络模式为默认的bridge模式,图3所示的ctfd、mariadb、redis分别作为系统平台、数据库和系统缓存,并通过compose文件定义了虚拟网络internal,通过Docker Compose统一部署,组件之间将处于这一网络。使用docker network inspect internal命令查看组件之间的网络,如下图4所示,三个组件IP处于同一C段,可以相互通信。靶场平台是一个包含三个组件的容器,通过docker网络连接,容器ctfd_ctfd_1即系统平台,用户的个人信息和实验结果存到容器ctfd_db_1(mariadb)中,中间数据由缓存容器ctfd_cache_1(redis)存储[7]。
图4 平台基本组件之间的网络关联
靶机控制模块是实现系统资源高效利用的关键部分,靶机控制模块以插件的形式连接到靶场平台,利用靶场平台提供插件接口,控制模块可以在靶场平台上对容器进行管理。
如下图5中,靶场平台接入的网络B用于平台组件之间的联系,也就是internal网络,在此基础上,使用docker network create ctfd-containers系统默认创建一个bridge模式的网络,也就是网络B,用于靶机平台对靶机容器进行管理。启动的靶机容器都会加入到ctfd-containers网络中,网络A和网络B都是bridge模式,沙盒被放置在容器内部,为容器提供网络连接,靶机的一个终端(接口)连接到了网络A。靶场平台容器有两个终端(接口)并且分别与网络 A 和网络B相连。因为网络A的存在,此时靶场平台与靶机之间是可以相互通信的,由于没有三层路由器的支持,靶场平台容器的两个终端之间将不能进行通信。
图5 靶场系统核心网络模块
在资源隔离方面,由于沙盒机制的存在,容器之间还是处于资源相互隔离的状态。靶场平台启动靶机控制插件后,通过使用命令docker network inspect ctfd-containers,查看两个模块是否已经加入到同一网络模块下,加入成功后,网络内容器IP处于同一C段,可以进行通信。
靶场控制模块由一系列的脚本文件构成,以插件的形式运行在靶场平台,通过靶场平台可视化管理界面对靶机进行集中控制和管理,无须使用Docker命令工具,很大程度上提高了系统使用效率,降低了系统维护的难度[8]。
3 靶机启动
靶场平台是整个系统的核心,开启靶机环境前,需要准备好靶机环境的Dockerfile或者Docker镜像仓库的地址,将获取到的镜像存放在漏洞库中,便于系统获取靶机环境镜像。
靶机启动流程如图6所示,系统首先会启动靶场平台,这是系统的基础和核心,靶场启动后,接着启动靶场控制插件,靶场平台调用靶场控制插件来对容器进行管理。
图6 靶机启动流程
靶场控制插件启动完成后,首先对靶机镜像完整性进行判断,漏洞库中已经存在靶机镜像,对靶机镜像进行实例化,如果没有此镜像,通过Dockerfile或Docker镜像仓库获取靶机镜像。系统继续对靶机环境实例化结果进行判断,一个可成功实例化的镜像,配置文件中组件之间的联系必须是Compose能正常处理的,组件的组网方式也要符合Docker的网络设计,否则启动结束,提示靶机开启失败。最后,会将启动的靶机实例加入到靶机控制网络,用于控制用户可以开启靶机的数量,并根据系统限定的到期时限开始计时,准备对开启时间超时的靶机进行销毁,经过以上的流程,靶机启动结束[9]。
4 结语
通过对Docker虚拟化技术的研究,本文设计实现了一种面向网络空间的漏洞靶场。在靶场实现方面,靶场预先部署大量漏洞环境镜像,通过Docker的镜像共享技术,减小了系统存储开销,使用时系统按需求实例化相应漏洞镜像,节省了靶机启动时的资源消耗,也缩短了使用者的等待时间。在资源分配方面,利用Docker丰富的网络模式,可以降低网络虚拟化过程中额外的设备性能损失,很好地使容器和网络信息进行直接的转换,实现了靶场对靶机的统一管理,同时也提升了系统的性能。综上所述,此靶场系统为高校网络攻防平台建设和各类网络安全赛事提供了较有效的解决方案,为建设一个能够灵活组网并支持多样化的网络空间靶场打下了良好的基础。
[1]章秀,刘宝旭,龚晓锐,等.Explore-Exploit:一种模拟真实网络渗透场景的安全竞赛[J].信息安全学报,2020,5(04):55-71.
[2]李春林,刘正军,王冶,等.一种改进的基于Docker的网络安全实验平台构建方法[J].通信技术,2019,52(04):927-932.
[3]吴怡晨.网络空间攻防靶场的设计和构建技术研究[D].上海:上海交通大学,2018.
[4][英]Nigel Poulton.深入浅出Docker[M].李瑞丰,等,译.北京:人民邮电出版社,2019.
[5]董博,王雪,索菲,等.基于Docker的虚拟化技术研究[J].辽宁大学学报(自然科学版),2016,43(04):327-330.
[6]肖小芳,宋建新.Docker网络通信研究与实现[J].通讯世界,2017,(22):1-2.
[7]冯一凡,朱文龙,杨双双.基于Docker的分布式网络安全攻防平台设计与实现[J].计算机产品与流通,2020,(03):47.
[8]徐维波.基于SDN和Docker容器的网络虚拟化研究[D].重庆市:重庆大学,2017.
[9]陈一鸣,寇小强,王永利.基于Docker的漏洞验证框架的设计与实现[J].电子技术应用,2018,(11):99-101+106.
周口师范学院大学生科研创新基金项目(ZKNUD2020020)