魏兴慎,苏大威,屠正伟,刘 苇,祁龙云,吕小亮,杨 斌
(1.南瑞集团有限公司(国网电力科学研究院有限公司),江苏 南京 210003; 2.国网江苏省电力有限公司,江苏 南京 210024)
云计算作为一种新的计算形式迅速发展起来,作为云计算关键支撑的虚拟化技术得到了深入的发展。Docker基于Linux内核的LXC虚拟化技术,利用Namespace实现应用程序、运行环境的隔离[1],由于其具备轻量化、快置备、低性能损耗等特点,被业界广泛使用。但由于Docker共享宿主机系统内核,与独立内核的虚拟机模式相比,安全面临更多风险[2]。
Docker容器采用客户端服务器的架构模式,客户端与服务端交互,向服务端或守护进程发送请求,服务器或守护进程响应请求,完成所有工作并返回结果。Docker Registry作为容器的镜像仓库,当用户需要运行新的镜像时,服务端会与镜像仓库通信,搜索、拉取新镜像,然后创建并运行容器。当服务端生成新的镜像后,需要上传到镜像仓库保存,方便后续搜索和使用。Docker的公共镜像仓库如Docker Hub和Quay等均存在大量用户生成的镜像。用户可以方便地共享仓库中的镜像,这也带来了严重的安全隐患[3]。
国内有很多关于Docker安全方面的研究工作,但主要分布在如何从底层提升Docker安全性而忽略了Docker镜像仓库这一重要环节,例如文献[2]认为Docker镜像及容器存在被篡改的风险,因此提出可信加固方法应对安全风险。文献[4]提出一种分层式数据安全性防护系统提高对Docker镜像的安全防护。文献[5]对Docker脆弱性进行分析,给出了诸多安全建议,但并没有针对Docker镜像仓库给出安全方案。国外有不少成果关注Docker镜像仓库的安全风险。例如文献[6]分析了全球133个公开Docker仓库中最大的91个仓库,扫描这些仓库中保存的镜像,其中的24%存在较为明显的漏洞,11%的风险等级为高,但并没有给出解决方案。文献[7]系统地分析了Docker Hub上的30万个镜像,发现平均每个镜像有180个漏洞,大多数镜像不会修复这些漏洞,同时漏洞会从父镜像向子镜像传播,但并没有给出如何解决Docker Hub的漏洞问题。本文设计的安全镜像仓库通过对提交到仓库中的镜像进行漏洞扫描和必要的渗透测试,较好地解决了该问题。
本文设计并实现一种安全的Docker镜像仓库SecDr。该镜像仓库从公开漏洞库中和企业内部自有软件漏洞库中获取最新漏洞列表,在Docker用户提交Docker镜像后,立即对该镜像文件进行扫描,获取特征值,并与已知漏洞特征比对,确认镜像的软件包是否包含已知的漏洞;随后在测试环境中运行Docker容器对Docker镜像进行动态渗透测试,检查运行在容器内的应用程序可能存在的漏洞。数据库将保存静态漏洞扫描结果和渗透测试的结果并最终生成报告。该安全镜像仓库在电力行业的电力监控系统[8]开发过程中得到应用。SecDr架构如图1所示。
图1 系统架构图
SecDr静态扫描的流程如图2所示,SecDr的采集器定期从CVE,RedHat,Ubuntu和Debian的公开漏洞数据库,以及企业私有应用程序漏洞数据库中同步最新漏洞信息,这些数据将作为静态扫描的依据对Docker镜像进行检查。用户提交新的镜像到仓库的操作会触发执行器对新提交的镜像静态扫描,静态扫描任务被推送到检查器,检查器从数据库中加载漏洞特征信息,从镜像仓库中逐层抽取镜像文件层的内容,检测静态内容中是否包含漏洞特征,当漏洞被发现时,将通知用户并将该发现保存到数据库中。漏洞、文件层和Docker镜像的对应关系将被保存在数据库中。
对镜像的静态扫描是基于公开漏洞库与镜像文件内容的特征比对实现的。SecDr从公开漏洞库和企业自建漏洞库中获取的漏洞特征值是以如下四元组给出的:
<漏洞名称,软件包名称,版本,风险等级>
由于漏洞库是公开的,所有人都可以通过网页抓取或通过API获取上述漏洞信息。其中“漏洞名称”标识该漏洞的名称,如CVE-2016-10009;“软件包名称”标识存在漏洞的软件包的名称,如OpenSSH;“版本”则标识该漏洞存在于哪些版本中,如5.0;“风险等级”标识该漏洞的影响分值。企业内部积累的漏洞数据需要调用接口获取,内部漏洞的特征值与公开库中漏洞的特征值表示方法相同。
对镜像的扫描就是查找镜像特征的过程。SecDr通过逐层扫描,获得镜像中安装软件包的列表,得到的信息可以用如下五元组标识:
<系统,文件层哈希值,软件包名称,版本,类型>
其中,“系统”标识该镜像是基于哪种操作系统创建的,例如Debian7,CentOS6.5;“文件层哈希值”给出文件层在仓库中的哈希值,通过该值可以唯一确定文件层;“类型”则给出当前软件包是何种形式,如rpm或者dpkg。通过使用一种简单的方法即可获取镜像某个文件层安装的软件包的特征值,即检查该文件层上是否保存了系统软件包安装列表,例如/etc/os-release中记录了系统信息,Debian的系统文件/var/lib/dpkg/available中则记录了所有软件信息。通过读取系统文件中的内容即可收集该文件层的特征值。
通过对比漏洞信息四元组与文件层信息五元组中“软件包名称”、“版本”这2项内容,就可以确定该文件层是否包含了指定的漏洞。SecDr支持的镜像系统包括Debian,Ubuntu,CentOS和Redhat。
Docker早期基于AUFS[9]文件系统的模型使得Docker镜像是由多层文件组成的,默认情况下,只有第一层文件可写,其他层文件则是只读[10]。这种文件模型极大地方便了Docker镜像的共享,大量的文件层可以在不同镜像之间共享,而不需要在运行环境中下载和保存多个副本。SecDr在静态扫描时,充分利用Docker镜像文件系统的特点,在扫描某个Docker镜像之前,首先判断该文件层是否已经被扫描过,如果已经扫描过,则只需要获取扫描结果,从而提高静态扫描的效率。
由于采集器定时从漏洞源获取漏洞信息,因此需要定期针对增量漏洞,对仓库中的所有镜像重新扫描,在增量扫描过程中,可能发现某个文件层包含新的安全漏洞。此时,只需要在数据库中查询该文件层与仓库中镜像文件包含关系,即可确定哪些镜像包含新漏洞,减少扫描工作量。
在企业级的镜像仓库中,新镜像通常基于已有的旧镜像生成,因此镜像之间共享的文件层较多,基于文件层进行扫描优化,能带来较好的效率提升。
对Docker镜像的静态扫描可从文件系统特征分析出系统软件版本存在的漏洞,但对于用户开发的企业应用的漏洞和配置弱点则往往缺乏足够的分析手段。SecDr基于Metasploit,SQLMAP等开源工具组成渗透测试模块,模拟黑客的恶意攻击行为,检验Docker容器的安全性。Metasploit是渗透测试和研究漏洞的平台,高度模块化的架构使得Metasploit具有很好的扩展性。渗透攻击模块对外提供了上千个攻击代码,利用发现的安全漏洞或配置弱点对远程目标系统进行渗透测试[11]。SQLMAP则可以自动化地侦测和实施SQL注入攻击以及渗透数据库服务器[12]。
教科书的首要目的是让学生有知识上的收获,但它决不应仅仅是一门学科概念的累加和拼凑,而应当让学生学会学习和思考;另外,引导学生通过对教科书的研读,找到学习的兴趣,启发学生进一步思考。
SecDr渗透模块的攻击代码是安全团队成员向企业应用研发人员收集应用的基本信息后定制开发的。必要的信息包括应用程序类型、数据库类型、版本、服务端口、用户输入等。研发团队在向SecDr提交镜像的同时,需要提交在安全测试环境中Docker镜像的部署脚本。在实施渗透测试阶段,调用该脚本,从镜像仓库中拉取镜像,在测试环境中运行容器;从后端数据库中下载预编写的渗透代码部署到渗透服务器上,随后执行渗透代码。根据测试结果,生成测试报告。SecDr的渗透过程如图3所示。
图3 SecDr渗透测试实现过程
OWASP建议需要测试的漏洞包含几十种[13]。SecDr基于危害性大小有选择地支持渗透测试内容。按照产生的原因区分,主要包括信息泄露类漏洞、用户交互类漏洞、业务逻辑类漏洞、开源组件共4种类型[14]。
针对信息泄露的渗透:由于没有处理特殊请求导致程序暴露了敏感信息[15],特别是某些Web程序在出错时会将详细错误栈返回到页面,收集这些信息通常是实施进一步攻击的基础[16]。在某些极端情况下,Web应用可能配置程序信息,如数据库连接、账号信息。SecDr基于路径遍历,尝试访问未授权的文件和目录,尝试读取程序日志、源代码和数据库连接配置等敏感文件,并尝试写数据库的上述文件,达到破坏的目的。
针对用户交互的渗透:主要是对身份认证和会话管理的漏洞进行渗透。不严格的用户身份认证或不合理的权限限定可能造成漏洞[17]。SecDr通过暴力破解方法尝试获取管理员默认密码,如果应用程序没有限制用户登录次数,则基于密码字典的暴力攻击,可能获取管理员密码;SecDr同样会尝试非授权访问,绕过身份认证访问非授权信息。
针对业务逻辑类渗透:此部分渗透测试需要针对企业不同应用定制的测试逻辑[18]。例如SecDr对某些应用的输入部分尝试进行SQL注入或XML注入,以此测试应用程序是否对用户输入进行检验和过滤;SecDr针对性提供文件上传功能的应用会进行文件上传渗透测试,检验该应用是否对文件的类型、内容等进行合法性检查;SecDr的渗透测试同样会测试缓冲区溢出的攻击测试,以此验证应用程序是否验证用户输入的长度。
针对开源组件渗透:由于企业应用程序的研发过程中大量使用开源的第三方组件,第三方组件的安全漏洞通常会造成业务应用大面积的安全风险[19]。因此SecDr针对企业常用的各种开源组件的已知漏洞,编写渗透测试代码,对开源组件进行测试。
图4 使用SecDr前后效果图
从图4可以看出,在使用SecDr前,镜像仓库中47%的镜像包含有系统漏洞,其中高危漏洞占比达到15%,在使用SecDr后,仓库中的镜像中只有14%包含有系统漏洞,且不包含有高危漏洞。该结果证明了SecDr的有效性。
由于SecDr部署在单独的服务器上,静态扫描和渗透的对象只针对首次上传到数据库中的镜像,因此对用户下载已经通过安全检查的Docker镜像没有延迟。但用户首次上传Docker镜像后,该镜像为不可用状态,用户不能立即下载使用,镜像上传后首次下载的延迟与渗透测试的强度有关,通常需要数小时完成新镜像的渗透,如果仅进行静态扫描,则只需要数分钟。作为企业内部应用,通过用户方修改用户工作习惯,可以避免因为渗透测试造成的不可用延迟。
由于Docker镜像内容可能存在已知的系统漏洞,这些漏洞可能随着镜像的分发而扩散。部署到Docker容器里的企业应用程序也可能引入了程序缺陷和漏洞。针对上述2种情况导致的Docker内容安全问题,本文设计了一种内容安全的Docker仓库,在用户提交Docker镜像时就进行漏洞静态扫描,并使用预定义的渗透攻击代码对指定容器渗透测试,只有同时通过扫描和渗透测试的镜像才允许保存在该仓库中。在电力行业的项目开发中,SecDr的功能得到有效验证。
参考文献:
[1] 浙江大学SEL实验室. Docker:容器与容器云[M]. 北京:人民邮电出版社, 2015.
[2] 王鹃,胡威,张雨菡,等. 基于Docker的可信容器[J]. 武汉大学学报(理学版), 2017,63(2):102-108.
[3] Combe T, Martin A, Pietro R D. To Docker or not to Docker: A security perspective[J].IEEE Cloud Computing, 2016,3(5):54-62.
[4] 许丽婷,傅翔君,杨晶晶. 基于Docker技术的分层式数据安全性防护系统[J]. 信息化研究, 2017,43(1):51-55.
[5] 杨文林,谭曦,郭俊廷,等. Docker脆弱性分析与安全增强[J]. 信息安全与技术, 2016(4):21-23.
[6] James Sulinski. Docker image vulnerability research[J]. Federacy Research, 2017,3(13):1-3.
[7] Shu Rui, Gu Xiaohui, Enck W. A study of security vulnerabilities on Docker Hub[C]// Proceedings of the 7th ACM Conference on Data and Application Security and Privacy. 2017:269-280.
[8] 胡朝辉,王方立. 电力监控系统通信安全技术研究[J]. 电子技术应用, 2017,43(3):21-24.
[9] Boettiger C. An introduction to Docker for reproducible research[J]. ACM SIGOPS Operating Systems Review, 2015,49(1):71-79.
[10] Giannakopoulos I, Papazafeiropoulos K, Doka K, et al. Isolation in Docker through layer encryption[C]// 2017 37th IEEE International Conference on Distributed Computing Systems. 2017:2529-2532.
[11] Nipun J. 精通Metasploit渗透测试[M]. 北京:人民邮电出版社, 2016.
[12] 李啸,胡勇. 基于sqlmap的被动SQL注入扫描技术研究与实现[J]. 现代计算机, 2016,28(1):38-42.
[13] Meucci M, Muller A. The OWASP testing guide 40[J]. Open Web Application Security Project, 2015,8(3):1-224.
[14] 赵丽娟. Web应用程序渗透测试方法研究[D]. 长沙:中南大学, 2014.
[15] 王丹,赵文兵,丁治明. 应用常见注入式安全漏洞检测关键技术综述[J]. 北京工业大学学报, 2016,42(12):1822-1832.
[16] 韩心慧,王东祺,陈兆丰,等. 云端服务器敏感数据保护方法研究[J]. 清华大学学报(自然科学版), 2016,56(1):51-57.
[17] 宋雅楠,刘萍. 渗透测试的信息抓取策略研究[J]. 计算机系统应用, 2017,26(8):232-237.
[18] 王扬品,程绍银,蒋凡. 应用漏洞扫描系统[J]. 计算机系统应用, 2015,24(12):58-63.
[19] Dashevskyi S, Brucker A D, Massacci F. On the security cost of using a free and open source component in a proprietary product[C]// International Symposium on Engineering Secure Software and Systems. 2016:190-206.