容器环境下校园数据安全研究
2021-10-27张燕子
张燕子
(西安邮电大学,陕西 西安 710121)
0 前 言
随着高校数字化建设的不断发展,为了节约硬件成本、加强网络安全管控,虚拟化技术已经成为绝大多数高校数据中心的基础配置。通过构建私有云管理平台[1],可以将硬件基础设施以IaaS(Infrastructureas a Service)的方式为全校各单位提供虚拟化计算和存储资源[2]。然而,这种通过分配虚拟服务器共享硬件资源的方式存在着人工参与工作量大、部署速度慢、资源管理粒度过大等问题,尤其是虚拟服务器管理权限分配到用户后,很难满足操作系统安全管理、业务应用快速变更、资源弹性扩展等需求。
目前,高校数据中心的建设方向正在朝着云原生标准应用的架构发展。容器技术作为云原生应用中最重要的核心技术[3],相比传统的虚拟机更加轻便快捷,采用容器技术的数字化底层计算环境,既能够增强其系统整体的安全性,也能让系统具有更佳的可扩展性和移植性,为以后系统功能的添加和数据库的迁移打下良好的基础。容器可以将数字校园内部系统模块的环境变量和配置隐藏起来,也可以把运行在一个机器上众多隔离的软件联系起来,目前在高校智慧校园建设中得到日益广泛的应用,但容器本身设计上存在的安全问题也越发突出。本文提出通过对容器整体进行隔离的设计思路,使容器无法访问主机内核和宿主机文件系统,从而解决容器本身组件存在安全漏洞的问题。
1 容器技术概述
1.1 云原生技术
云原生(Cloud Native)是近年来高校数字化建设应用与研究的热点。云原生的理念是直接按照云上部署的目标去设计应用与服务架构,不再按照传统应用向云端迁移的设计思想。可以在云计算环境下构建与部署大量微服务应用,利用容器实现对各组件的打包集成,再对容器进行动态调度,从而实现云计算整体资源的优化配置。因此,云原生技术架构具有敏捷开发、性能可靠、高弹性、易扩展、故障隔离和持续更新等特性[4]。云原生计算基金会(Cloud Native Computing Foundation, CNCF)定义的云原生技术集合包括容器、微服务、服务网格、不可变基础设施与声明式API[5]。
1.2 容器技术应用
容器技术是云原生的关键技术,本质上就是将多个软件应用封装在一个空间中并进行隔离,包括软件的所有的配置信息、软件的从属关系、运行环境、运行时的工具及其附件。
在云运行的环境当中,每个微服务应用都需要搭建配置信息和购买服务器节点等费用,使用容器可以节省大量成本开支和不必要的工作量。容器之中运行的不是虚拟机,能够具备比虚拟机更加良好的性能。在现实应用环境当中,容器和微服务的相互结合,可以构建便捷、可扩展和经济花费较小的软件工具。除了实现微服务的隔离之外,容器还可以为云原生的应用程序带来更多的好处,使用容器,可以很便捷地将微服务程序的所需运行环境、配置信息、环境变量及其所属关系移植到理想的服务器节点,而且无需重新去配置和部署环境,从而具备良好的可移植性。
1.3 容器运行时工具runC
容器运行时(Container Runtime)从传统意义上来说就是代表容器从拉取镜像到启动运行再到中止的整个生命周期。在OCI(Open Container Initiative)标准中,对容器运行时提出了两个规范,即运行时规范(OCI Runtime Spec)和镜像规范(OCI Image Spec)[7]。这两个规范允许不同开发者开发的容器能够在异构runtime 上运行,从而保证了容器的可移植性和互操作性。
Docker公司与CoreOS和Google公司联合创建了容器技术标准化组织OCI(Open Container Initiative)[6],对容器技术标准提出了业界标准定义 。 在这一标准下,工业界提出了一个创建并运行容器的命令行工具runC。这是一个轻量化工具,能够屏蔽不同系统和版本的差异,使容器操作标准化,可以不用通过Docker引擎,直接运行容器。在Docker创建容器的过程中,runC的位置处于容器管理引擎的最底层,直接与操作系统 kernel 紧密协作,为容器提供运行环境。
2 容器应用中的安全问题分析
Docker是轻量化的容器,具有轻量、高效和便携的优势[8]。其轻量性体现在可以通过对宿主机内核的访问而省去不必要的流程,运行速度更快;其高效性体现在容器可以实现跨平台的迁移,以及更加快速的部署和实现;其便携性体现在创建和删除容器更加便利,对于功能的更新只需远程推送更新而不需要实地部署。
目前,将校园数据中心所部署的系统中各个功能和传统的容器技术相结合,通过对教师、学生、后勤、科研等各个业务信息系统的设计与重新部署,在原有的基础上,将各个功能实现的所有附属信息全部以微服务的形式部署在云端的容器之中,对于整个业务来说其功能实现全部都在云上。云的大数据容量简化了系统的扩容能力,也为以后系统功能的更新和扩展提供了更好的便捷性[9]。为每个业务功能设计其专属容器,可能会出现功能过多导致的容器数量增多,这可以通过分级的方式进行简化。相较传统的虚拟机模式,在业务系统的可扩展性上有了很大提升,但其安全问题也不可忽视。
容器有权限之分,特权容器的权限最高,可以执行服务器的任何操作,拥有对客户端资源的访问权限。如果两个容器之间为了实现各自目标而进行关联,但是各自都有权限等级,就必须满足最低的要求,只能选择损失最小的一方进行交互[10]。这意味着,如果恶意程序掌握特权容器的规则,则它们可能会被破坏。如果几个不同的容器之间相互进行攻击,共用的内核被攻击,则其他容器也会受到牵连。
出现这些问题的根本原因在于runC组件出现了问题。runC的主要任务是容器的启停和资源隔离。因为runC在使用文件系统描述符时存在漏洞,会导致最高权限容器被抓取,造成容器的逃逸和越权访问宿主机的文件系统。攻击者可以通过恶意镜像,或者改变容器运行时的配置信息来利用其漏洞。
针对runC组件有两种主要攻击方式:一种是攻击者可能会将容器镜像修改为恶意程序,runC被替换为此恶意程序,宿主机在执行容器命令的时候就会触发恶意程序;另一种是攻击者利用特权容器,将容器运行时的系统文件恶意修改,如果宿主机在该容器中创建新进程,会被攻击者欺骗从而激活恶意程序,runC可以通过使用自定义带有恶意程序的二进制文件去替换容器内新进程的二进制文件来达到索引的目地,将runC被替换为此恶意程序,从而执行容器运行命令导致触发恶意程序[11]。
3 容器安全升级措施
传统的Docker容器设计如图1所示,多个容器共享主机内核和硬件资源,对容器之间做了沙箱隔离,只是提升了容器本身的安全性,但容器之间和主机内核还是会因为runC的漏洞而对安全性构成威胁。
图1 Docker容器结构
通过对容器本身安全的分析,对原来的容器的结构进行重新的规划,改造后的安全容器结构图如图2所示,可以通过pod对容器统一管理。一个pod里可以有一个或多个容器,为每个容器创建专属于它的独立虚拟内核。该虚拟内核只负责用来运行容器,并不包含整个操作系统环境。在容器内部,其运转方式并不像传统的虚拟机,相当于一个容器内核,只是通过占用尽可能少的内存空间进一步降低内存的开销。每个容器都在各自单独的虚拟机中启动,不会去访问主机内核,从而杜绝了通过恶意代码入侵其他邻近容器的可能。通过对容器硬件的隔离,限制不受信任的租户,使其运行的应用程序和之前删除的应用程序都能被同一个集群安全隔离,不再有污染数据的可能性。
图2 安全容器结构
4 结 语
本文介绍了校园数据中心中常用的Docker容器结构,分析在部署应用时由于容器组件存在漏洞所导致的安全问题,提出对容器整体添加隔离层的安全措施,对容器的内核和硬件基础设施进行虚拟化,将很大程度上提升容器本身的隔离性能,从而阻断发生容器逃逸和访问宿主机文件系统的可能性。