2. 数学工程与先进计算国家重点实验室, 郑州 450001
2. State Key Laboratory of Mathematical Engineering and Advanced Computing, Zhengzhou Henan 450001, China
Web服务器作为信息存储和发布的主站点,长期暴露在Internet上,是恶意攻击者入侵的主要目标之一,特别是近年来越来越多的企业和个人将Web服务器部署到以Docker容器为代表的云平台上[1],Web服务器面临着更严峻的安全挑战。一旦Web服务器遭受入侵,极有可能出现用户隐私泄露、网页非法外链以及Web服务质量下降甚至终止等问题[2];进一步地,若入侵者控制容器并发生提权、逃逸等行为,就会影响宿主机及其上的其他容器,造成更大的损失。
传统Web服务器保护机制包括入侵隔离技术[3]、入侵检测系统(Intrusion Detection System, IDS)[4]和入侵防御系统(Intrusion Prevention System, IPS)[5]等。这些防御机制依赖安全防御的先验知识,不能防患由未知漏洞产生的安全威胁。为了改变这种防御上的被动性,出现了动态弹性防御技术,主要有入侵容忍技术[6]、移动目标防御技术[7-8]和拟态防御技术[9]等。其中,自清洗入侵容忍是移动目标防御的主要技术之一。Bangalore等[10]通过不断变换和清洗Web服务器来清除入侵威胁,但该方法依赖传统虚拟机的支持,无法保护部署在以Docker容器为代表的云平台上的Web服务器的安全;文献[3]使用AppArmor、SELinux等安全机制增强容器安全,但其无法主动清除入侵威胁;文献[8]通过回滚清除容器安全威胁,但其依赖入侵检测机制支持。针对这一情况,本文提出一种基于Linux名字空间构建Web服务动态运行环境的动态防御方法,该方法在保证Web服务正常的前提下,通过不断地对容器进行变换和清洗来迷惑攻击者,增加入侵者对Web服务器的攻击难度,减小入侵者对Web服务器进行控制的时间窗口,从而进一步增强Web服务器的安全性。
本文的主要工作如下:
1) 提出一种基于Linux名字空间构建Web服务动态运行环境的动态防御方法,利用容器的轻量级、启动速度快的特点,在提高资源利用率的同时,增强Web服务器安全性。
2) 将自清洗入侵容忍和移动目标防御的思想应用于容器,提高了基于容器的云平台Web服务器的安全性。
本文基于Linux仿真平台对所提方法进行了仿真实验,实验结果表明,该方法能有效增强Web服务器安全性。
1 Linux名字空间及容器近些年来,Linux名字空间受到了广泛的关注和研究,现已形成Mount、UTS、IPC、PID、Net、User、Cgroup共七种名字空间[11-13]。名字空间提供了一种资源虚拟化和隔离方案,使得PID、IPC、Network等系统资源不再是全局的,而是属于某个特定的名字空间。如图 1所示,每个进程都与一个名字空间相关联,且只能看到与该名字空间相关联的资源;每个名字空间下的资源对其他名字空间而言都是透明的、不可见的。
用户进程使用系统调用函数clone()、setns()和unshare()来创建名字空间,其系统调用参数、隔离内容和所需权限如表 1所示。而容器就是通过不同的名字空间相互组合使用而构建的虚拟执行环境,容器内的进程直接使用主机CPU运行指令,没有解释、编译、指令级模拟或转换等中间环节,相比其他虚拟化技术,具有更快的执行速度和更低的性能损耗[14]。
利用名字空间的资源隔离机制,本文提出了基于名字空间的Web服务器动态防御方法。
2 方法框架在目前的计算机系统中,Web服务器从启动到终止要经过创建进程、加载程序、初始化、提供服务、释放资源、销毁进程等过程。如图 2所示,由于Web服务器提供服务过程运行时间很长,且主机IP地址、端口号、操作系统版本和Web服务器版本等属性在运行过程中不再改变,给隐藏在正常访问请求中的攻击者提供了足够的时间来探测和发现系统的构造和漏洞,而且一旦攻击者入侵成功,在很长的一段时间内都很难发现和消除。
针对上述Web服务器提供服务过程运行时间很长和相关属性不再改变等问题,本文提出基于Linux名字空间构建Web服务动态运行环境的防御方法,其基本思想如图 3所示,在保证服务连续的情况下,通过不断重启程序来缩短Web服务器进程的生命周期,减小漏洞被探测和利用的可能性;更进一步地,通过还原系统来清除入侵影响。基于名字空间的Web服务器动态防御方法的实现过程如图 4所示,首先使用Linux名字空间构建一个纯净的、无恶意软件的环境来运行Web服务器;当Web服务器运行一段时间后,再次使用Linux名字空间构建一个新的纯净的、无恶意软件的环境来运行Web服务器,并代替原来的Web服务器向用户提供服务。原Web服务器处理完所有剩余请求后结束运行或因超时终止后进入后台进行清洗,待清洗完成后进入候选队列,在某个时刻会再次运行并为用户服务。由于将进程包裹在名字空间中,Web服务器每次启动时都可以有不同的系统名称和版本号等;名字空间内的Web服务器进程不能在名字空间之外创建进程;当名字空间撤销时,Web服务器进程及其创建的各类子进程都会随之消失,不会留下恶意的守护进程,从而保证了Web服务器及宿主机的安全。
传统Web服务器暴露在Internet的时间很长,容易遭受恶意攻击。本文构建基于Linux名字空间的Web服务器运行环境,并通过运行环境的动态变换来减少Web服务器曝光在Internet上的单位时间,增加攻击者的攻击难度,减少入侵带来的损失。
然而单纯地通过启动和终止Web服务器来实现动态变换,必然会出现服务不连续的问题。为解决以上问题,本文主要从Web服务器运行环境构建、Web服务器数据同步和Web服务器调度等三个方面展开工作。
3.1 Web服务器运行环境构建在传统的Web服务器上,攻击者入侵成功后通常会篡改系统关键程序、置留后门,这些恶意行为难以及时发现和清除。要解决这个问题,最好的方式是创建一个Web服务器镜像,每次启动时都加载Web服务器镜像的副本来运行。因此,本文首先创建包含Web服务器及其依赖项的根文件系统镜像,再使用Linux名字空间来加载根文件系统镜像副本,利用名字空间的资源隔离特性来创建一个安全的独立运行环境。Web服务器运行环境构建过程具体如下。
1) 创建包含Web服务器及其依赖项的根文件系统镜像。
本文使用Docker工具来创建包含Web服务器及其依赖项的根文件系统镜像。首先通过docker build命令下载原始文件系统镜像;之后通过docker run命令进入容器系统,并通过相应系统的程序管理工具下载、编译和安装Web服务器及其依赖项;最后通过docker save命令将容器导出为新的根文件系统镜像。
在创建镜像过程中,本文遵循了设计多样性原则,使用了Debian 8、Centos 7、Ubuntu 14.04等不同类型和版本的操作系统,并在其上安装了不同版本的Web服务器和网页脚本语言解释器,其目的是增加攻击者对Web服务器进行探测和攻击的难度,从而降低攻击成功的概率。
2) 使用Linux名字空间封装Web服务器运行环境。
使用Linux名字空间封装Web服务器运行环境(即容器)的过程如图 5所示,其具体实现步骤如下。
① 使用unshare函数将用户进程移动到一个由User、IPC、PID和Net名字空间组成的隔离环境。在这个过程中只申请了一次root权限,用于完成相关的网络配置,使得被隔离的用户进程能够连接外部网络,此后用户进程一直以宿主机上的普通用户权限运行;而通过User名字空间的权限映射,这个普通用户权限的进程在名字空间内具有root权限,这种方式避免了名字空间内进程的真实权限过高造成对宿主机系统的潜在危害。
② 使用fork()函数创建子进程,并使用unshare()函数将子进程移动到一个以PID、Mount和Net名字空间组成的隔离环境。再次使用fork()函数创建子进程,并挂载根文件系统,加载Web服务器程序。这里利用Mount名字空间限制Web服务器进程不能查看宿主机文件系统信息;利用Net名字空间为进程提供隔离的网络环境,使其需要路由和转发才能访问Internet,为Web服务器运行环境的动态变换作准备。
③ 父进程为子进程提供相关的网络配置,并在合适的时机创建新的子进程来提供Web服务,并终止旧的子进程运行。
3.2 Web服务器数据同步在典型的Web服务器系统中,存在两种类型的持久化数据:一种是诸如用户账号信息的长期持久化数据,这类数据需要存储在磁盘、磁带等可长期保留的设备上;第二种是短期存在的会话数据session。由于session数据量较小、有效时间较短,且保存在磁盘上时读写速率较慢,因而主要存储在内存中。
Web服务器停止服务后会进行清洗,原先存储在该运行环境下的所有数据都会被删除,存储session的内存也会被回收,这会造成数据丢失问题,并会影响用户访问体验。为解决这些问题,本文借鉴了分布式Web服务器设计方案[15],使用网络文件系统(Network File System, NFS)来存储第一种类型的数据,使用开源工具Redis数据库[16]来存储第二种数据。NFS和Redis数据库都在Web服务器运行环境之外独立运行,这样不管Web服务器如何变换,这些数据都不会丢失,Web服务器便可以通过网络请求的方式在需要的时候对数据进行读写。NFS和Redis数据库都在Linux名字空间隔离下运行,并通过IPtables限制其访问外网的能力,入侵者难以感知其存在,并难以对其进行攻击。
3.3 Web服务器调度Web服务器调度控制器是实现基于Linux名字空间的动态防御的核心。控制器位于Web服务器运行环境之外,这样做的目的是保证对容器的绝对控制,即使Web服务器被恶意入侵和控制,也不会影响控制器的正常运行。由于突然停止Web服务器的运行可能会导致一些用户的访问请求得不到正常的处理,为解决这个问题,本文将Web服务器调度的一个周期分为以下四个过程。
1) 活跃期:Web服务器在线,接收和处理任何请求;
2) 收尾期:Web服务器处理已存在的请求,但不再接收新的请求;
3) 离线期:Web服务器已下线,隔离互联网,可以清洗;
4) 等待期:Web服务器被重置到原始状态,等待再次上线。
这四种状态的转换关系如图 6所示,每次变换中只有处于活跃期的Web服务器接受请求,在任意时刻网络入口都指向处于活跃期的Web服务器。图 7表示了某时刻Web服务器状态,其中某些Web服务器正在提供服务,而某些Web服务器正在被清洗。在每一种情况下,至少有一个Web服务器正在被清洗,最终每个Web服务器都会被离线、清洗和恢复到其原始状态。
图 7中Web服务器可分为两类:
1) 独立Web服务器。对于独立Web服务器,任意时刻,至少有一个Web服务器在线(图 7中黑圆),接收来自用户的请求,处理并返回结果;其他Web服务器(图 7中白圆)不再接收新来的消息,但是要在离线前完成未处理的请求。离线的Web服务器要进行清洗(图 7中白框),完成清洗后会等待某个时刻再次上线(图 7中黑框)。
2) 非独立Web服务器。对于非独立Web服务器,每个子Web服务器运行着一个功能,所有子Web服务器相互配合实现完整的功能。在进行离线和清洗时需要采用一定的算法对子Web服务器进行选择,以保证Web服务的正常。
4 实验结果与分析实验主要测试Web服务器的功能连续性和安全性。实验主机型号为Lenovo G480,处理器为Intel i5-2450M,主频为2.5 GHz,内存为12 GB,操作系统为Ubuntu 16.04。仿真系统结构如图 8所示,其中容器1、2、3提供Web服务,Web服务器为Apache+PHP;容器Redis提供Session持久化服务,其版本为2.8.4;容器Gate是网络数据的出入口,数据转发规则由IPtables配置。容器Gate有两个网卡,其中eth0连接Internet,eth1连接由容器1、2、3组建的内部局域网。在任意时间,Internet用户的请求都会通过容器Gate转发给控制器指定的Web服务器。
用户访问Web服务器的行为可分为请求包含会话的网页和请求不包含会话的网页两类。对于第一类行为,为验证Web服务器切换对Web服务器数据一致性的影响,设计了统计一次Session会话中用户访问页面次数的实验,验证了Web服务器切换可以保持会话的数据一致性;对于第二类行为,实验通过性能测试工具Apache Bench模拟用户访问行为进行测试。假设Web服务器曝光(活跃期)时间为E,请求并发度(每秒的并发请求数)为U,请求页面大小为M,为使测试覆盖各个Web服务器,测试时间为D=3*E。令:E=10 s,30 s,60 s;U=50,100,125;M=100 KB。表 2记录了实验所得数据,其中曝光时间为Long表示没有采用本防御方法的Web服务器,用来作为基准值参考。因为请求响应平均时间与请求数据大小、并发度正相关,所以合理设置收尾期时间,就可以保证Web服务器能够正常响应用户请求。图 9展示了不同并发度下Web服务器响应用户请求的平均时间与曝光时间的关系,可知曝光时间对Web服务器性能影响很小,在0.02~0.07 ms范围内。
对Web服务器进行入侵的一般流程包括目标信息探测、漏洞利用、权限提升、后门放置等过程。实验模拟入侵过程的各个环节,验证本防御方法对Web服务器安全性的提高。
在目标信息探测和漏洞利用阶段,通过nmap工具探测操作系统类型和Web服务器版本结果如表 3所示,在不同的活跃期,Web服务器具有不同的操作系统类型和Web服务器版本,这使得入侵者对Web服务器的真实信息感到迷惑,加大了其选择可利用漏洞并实施攻击的难度。
在权限提升阶段,实验假设入侵者发现其中一个Web服务器具有任意命令执行漏洞,由于Web服务器是以www-data用户权限运行的,入侵者需要利用该漏洞并通过其他方式获取root权限。为简化实验,在Web服务器目录下放置了一个属主为root的具有setuid(0)代码的C程序,并为其设置setuid位,通过执行该程序,入侵者可以获得一个具有root权限的Web shell。实验验证入侵者的确可以获取容器中的root权限,但该root权限是由宿主机上的普通用户通过Linux User名字空间映射而得的,并不是宿主机的root权限。用Linux User名字空间以普通用户权限创建容器,并在容器中以低权限用户身份运行Web服务器,这种二次降权的方式,可进一步保护宿主机的安全。
在后门放置阶段,利用在权限提升阶段的工作进行了三组测试,包括向Web服务器容器中添加新用户、修改ps等系统关键程序、上传恶意守护进程程序。实验验证本方法虽然不能阻止入侵者在处于活跃期的容器内创建后门等恶意行为,但能够在容器处于离线期时将这些恶意行为清洗和消除。这是因为原Linux名字空间撤销后,容器中的包括入侵者驻留的守护进程在内的所有进程都会被杀死;新容器的文件系统是由原始镜像和经过清洗的Web服务器数据文件组成,入侵者对原系统的修改,例如添加新用户、篡改关键程序等都会被清除。实验过程中通过连接守护进程开放的5555端口的方式对入侵者控制容器的有效时间进行记录,结果如表 4所示。
由表 4可知,入侵者控制Web服务器的有效时间为入侵者控制Web服务器时的容器活跃期剩余时间和收尾期时间之和,因此在保证Web服务器正常工作的前提下,通过调整容器活跃器和收尾器时间,增加Web服务器容器种类等方式,可增加入侵者攻击Web服务器的难度,并定期自动清除入侵对Web服务器的影响,从而提高Web服务器的安全性。
5 结语本文使用Linux名字空间为Web服务器构建了一种动态防御机制,这种机制不依赖于入侵检测过程,而是通过不断的变换和清洗来消除入侵威胁。仿真实验验证了本文方法在提供Web服务器安全性的同时,对系统性能影响很小,对于100 KB的数据,其时间损耗为0.02~0.07 ms。接下来研究将本文方法与入侵检测、预防等方法相结合,增加对入侵行为的感知和记录,增加对Web服务器的弹性调度以及拓宽本方法适用性等。
[1] | 中国信息通信研究院. 2016年云计算白皮书[R]. 北京: 中国信息通信研究院, 2016. (China Academy of Information and Communications Technology. 2016 Cloud Computing White Paper[R]. Beijing:China Academy of Information and Communications Technology, 2016.) |
[2] | SINGER P W, FRIEDMAN A. Cybersecurity and Cyberwar:What Everyone Needs to Know[M]. Oxford: Oxford University Press, 2014: 12-45. |
[3] | BUI T. Analysis of docker security[EB/OL].[2017-04-20]. https://www.researchgate.net/publication/270906436_Analysis_of_Docker_Security. |
[4] | CHUNG C J, KHATKAR P, XING T Y, et al. NICE:network intrusion detection and countermeasure selection in virtual network systems[J]. IEEE Transactions on Dependable and Secure Computing, 2013, 10(4): 198-211. DOI:10.1109/TDSC.2013.8 |
[5] | XU H, CHEN X, ZHOU J M, et al. Research on basic problems of cognitive network intrusion prevention[C]//Proceedings of the 2013 Ninth International Conference on Computational Intelligence and Security. Washington, DC:IEEE Computer Society, 2013:514-517. |
[6] | MADAN B B, GOŠEVA-POPSTOJANOVA K, VAIDYANATHAN K, et al. A method for modeling and quantifying the security attributes of intrusion tolerant systems[J]. Performance Evaluation, 2004, 56(1/2/3/4): 167-186. |
[7] | OKHRAVI H, HOBSON T, BIGELOW D, et al. Finding focus in the blur of moving-target techniques[J]. IEEE Security & Privacy, 2014, 12(2): 16-26. |
[8] | AZAB M, MOKHTAR B, ABED A S, et al. Toward smart moving target defense for Linux container resiliency[C]//Proceedings of the 2016 IEEE 41st Conference on Local Computer Networks. Piscataway, NJ:IEEE, 2016:619-622. |
[9] | 仝青, 张铮, 张为华, 等. 拟态防御Web服务器设计与实现[J]. 软件学报, 2017, 28(4): 883-897. (TONG Q, ZHANG Z, ZHANG W H, et al. Design and implementation of mimic defense Web server[J]. Journal of Software, 2017, 28(4): 883-897.) |
[10] | BANGALORE A K, SOOD A K. Securing Web servers using Self Cleansing Intrusion Tolerance (SCIT)[C]//Proceedings of the 2009 Second International Conference on Dependability. Piscataway, NJ:IEEE, 2009:60-65. |
[11] | BIEDERMAN E W. Multiple instances of the global Linux namespaces[EB/OL].[2017-05-06]. http://www.landley.net/kdocs/ols/2006/ols2006v1-pages-101-112.pdf. |
[12] | ROSEN R. Linux containers and the future cloud[J]. Linux Journal, 2014, 2014(240): Article No. 3. |
[13] | BABAR M A, RAMSEY B. Understanding container isolation mechanisms for building security-sensitive private cloud[R]. Adelaide, Australia:University of Adelaide, Centre for Research on Engineering Software Technologies, 2017. |
[14] | DUA R, RAJA A R, KAKADIA D. Virtualization vs containerization to support PaaS[C]//Proceedings of the 2014 IEEE International Conference on Cloud Engineering. Piscataway, NJ:IEEE, 2014:610-614. |
[15] | TANENBAUM A S, VAN STEEN M. Distributed Systems:Principles and Paradigms[M]. 2nd ed. Upper Saddle River, NJ: Prentice-Hall, 2007: 545-585. |
[16] | CARLSON J L. Redis in Action[M]. Greenwich, CT: Manning Publications, 2013: 90-110. |