云原生中的容器技术及其安全配置规范

2021-09-14 02:33张小梅郭新海
信息通信技术 2021年4期
关键词:镜像虚拟化容器

丁 攀 张小梅 郭新海 刘 安

中国联通研究院 北京 100048

1 云原生发展概述

云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。NIST指出云计算由一个可配置的共享资源池组成,该资源池提供网络、服务器、存储、应用和服务等多种硬件和软件资源,资源池具备自我管理能力,用户只需少量参与,就可以方便快捷地按需获取资源[1]。经过十几年的发展,云计算作为数字化转型的重要基础设施,已经由“面向云迁移应用”的阶段演进到“面向云构建应用”的阶段,即由“以资源为中心”演进到“以应用为中心”的云原生基础设施阶段,云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API[2]。

在云原生应用和服务平台构建过程中,Docker技术凭借其轻量、秒级部署、易于移植、弹性伸缩和活跃强大的社区支持,成为了云原生等应用场景下的重要支撑技术。Docker是以Docker容器为资源分隔和调度的基本单位,封装整个软件运行时环境,用于构建、发布和运行分布式应用的平台。Docker可以在容器内部快速自动化地部署应用,并通过操作系统内核技术为容器提供资源隔离与安全保障。

2 容器核心技术及其安全风险

2.1 容器技术概述

2.1.1 容器功能及其架构

与虚拟机相比,Docker平台将资源的抽象从硬件级别上移到了操作系统级别,虚拟机抽象整个硬件服务器,而容器抽象操作系统的内核。这是一种完全不同的虚拟化方法,虚拟机和容器对比如图1所示。

图1 Docker和传统虚拟化方式对比

Docker体系结构使用客户端—服务器模型,并且由Docker客户端、Docker主机、网络和存储组件以及Docker Registry/Hub组成,Docker架构如图2所示[3]。

图2 Docker架构图

Docker客户端实现与Docker Daemon进行交互,它们可以部署在同一台主机上,也可以独立部署。Docker主机提供了执行和运行应用程序的完整环境,它由Docker Daemon、镜像、容器、网络和存储组成。

Docker主要的操作对象包括镜像、容器、网络和存储,镜像用于存储和运送应用程序,可以单独使用镜像来构建容器,也可以对其进行自定义以添加其他元素来扩展当前配置。Docker以应用程序驱动的方式实现网络功能,在Docker网络中,host网络实现共享主机的网络栈功能,bridge网络实现创建网关和IP子网功能。Docker可以将数据存储在storage driver管理的容器层中,也可以存储在容器上挂载的文件系统中。

2.1.2 实现容器的核心技术

Docker容器本质上是宿主机上的进程,Docker通过cgroups实现了资源限制,通过Namespace实现资源隔离,通过写时复制(copy-on-write)实现高效的文件操作[4]。

Linux操作系统通过cgroups可以设置进程使用CPU、内存和磁盘IO资源的限额,通过优先级让一些组优先得到更多的CPU等资源。Namespace管理主机中全局唯一的资源,实现资源间的隔离,进程在彼此隔离的Namespace运行时不可见,并且认为自己是独占系统的。Docker镜像采用写时复制策略,实现多个容器之间共享镜像,每个容器在启动的时候不需要单独复制一份镜像,只需要将所有镜像层以只读方式挂载,只有在系统文件发生变化时,才会把变化的内容记录在可读写层,以此减少磁盘空间占用和容器启动时间。

2.2 主机操作系统及其安全风险

无论是硬件的虚拟化还是操作系统的虚拟化,两者都需要寄生于主机操作系统上,所以操作系统的安全是虚拟化安全的前提条件。虽然容器提供了功能强大的软件级别的隔离机制,但使用共享内核无疑会导致相对于虚拟机管理器甚至容器专用操作系统而言更大的攻击面。Docker在主机操作系统面临的风险包括主机操作系统漏洞风险、共享内核安全风险、用户访问权限不当风险、Docker版本及安装环境风险、篡改主机操作系统文件风险等[5]。

2.3 Docker Daemon配置及其安全风险

Docker Daemon是容器服务的核心,为了理清Docker Daemon存在哪些方面的安全风险,我们从Docker Daemon的工作流程图来详细分析[6],如图3所示。

图3 Docker Daemon的工作流程图

用户是使用Docker Client与Docker Daemon建立通信,Docker Daemon首先提供HTTP Server的功能,使其可以接受Docker Client的请求。Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式存在。Job通过镜像管理驱动graphdriver将下载镜像、通过网络管理驱动networkdriver创建并配置Docker容器网络环境、通过execdriver来完成限制Docker容器运行资源或执行用户指令。libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。

Docker Daemon负责所有与容器相关的操作,Docker Daemon方面的安全风险包括客户端配置、容器网络配置、容器镜像配置、容器存储配置等方面。一方面我们需要关注攻击面暴露的重要参数的配置,另一方面还需要关注配置这些敏感参数的系统文件。

2.4 容器镜像及其安全风险

镜像是容器运行的基础,容器引擎服务通过使用不同的镜像来启动容器。镜像是按层封装好的文件系统和描述镜像的元数据构成的文件系统包,包含应用所需要的系统、环境、配置和应用本身。分层存储是容器镜像的主要特点之一,每个镜像都是由一系列的“镜像层”组成。当需要修改镜像内的某个文件时,只会对最上方的读写层进行改动,不会覆盖下层已有文件系统的内容。当提交这个修改生成新的镜像时,保存的内容仅为最上层可读写文件系统中被更新过的文件,这样就实现了在不同的容器镜像间共享镜像层的效果。

基于Dockerfile创建镜像是最常见的镜像的构建方式,比如现在构建一个新的镜像,Dockerfile文件内容为:

FROM debian #①

RUN apt-get install emacs#②

RUN apt-get install apache2#③

CMD [“/bin/bash”]#④

上述指令的信息为:①基于debian base构建镜像,②安装emacs编辑器,③安装apache2,④容器启动时运行bash。图4展示的是使用Dockerfile文件构建的镜像,最上层是有读写属性的容器层,剩余的是有只读属性的镜像层。仓库是集中存放镜像文件的场所,仓库分为公开仓库和私有仓库,目前,全世界最大的仓库是Docker官方的 Docker Hub。

图4 容器的镜像结构

通过上述容器构建及存储的过程,我们在使用镜像的过程中所面临的风险包括基础镜像的安全风险、镜像安全配置风险、Dockerfile文件使用风险和镜像仓库使用风险等。

2.5 运行时的容器及其安全风险

第2.3节讨论的容器守护进程存在的安全风险,是基于运行在主机上的所有容器进行考虑的,是服务系统级别的安全实践。本节所讨论的容器运行时的安全风险,是针对具体运行的容器存在的安全风险,是容器实例维度级别的安全实践。在守护进程中进行配置后,也可以根据具体的容器定制化的配置需求,在容器启动时配置对应参数,覆盖容器服务的默认配置。

容器是以进程的形式运行在主机上的,运行的容器进程是隔离的,彼此之间有独立的文件系统、网络以及主机进程树。使用docker run指令来定义容器运行时的资源,我们需要合理地配置docker run的参数来保障运行时的容器安全。

详细的docker run参数可以参考Docker Commandline Reference[7],其中安全相关的参数配置大致可以分为四大类,如表1所示。

表1 docker run安全相关配置参数

2.6 容器操作及其安全风险

因为容器使用及注销便捷,导致镜像和容器的泛滥。基于安全实践的建议包括:不要在同一主机上使用太多的镜像、不要在主机上运行过多的容器、通过标签的方式区分旧的可能存在漏洞的镜像。

3 容器安全配置

关于Docker的安全配置核查或者最佳实践,具有较大影响力的是CIS Docker Benchmark[8],它基于各行业、各职位专家所达成的共识。但是,CIS的每个测试条目是相互独立的,内在的关联性也不明确。所以,我们希望根据容器所存在的安全风险,梳理归并相关的安全配置方案,使得Docker的安全配置方案便于科研人员理解。

通过梳理,主机、Docker Daemon、容器镜像、运行时的容器、容器操作的安全配置方案分别如表2、表3、表4、表5、表6所示。

表2 主机安全配置方案

表3 Docker Daemon安全配置方案

表4 容器镜像安全配置方案

表5 运行时容器的安全配置方案

表6 容器操作安全配置方案

4 总结

容器安全的防护应该覆盖到容器的整个生命周期,包括容器的构建、分发和运行三个阶段。容器安全基线配置涉及到容器生命周期的各个阶段,对于容器安全起到至关重要的作用。应对Docker容器生命周期里的安全问题,需要可操作、可执行的Docker安全基线检查清单,这个清单除了需要清晰、可查、可维护,以供在生产环境中执行基础架构的安全检查和审计之外,还需要系统可理解。本文在梳理容器面临的安全风险的基础之上,总结归纳了CIS Docker Benchmark五个大类二十个小类单机版容器的安全配置需求,使得Docker的安全配置方案更具条理性,更便于容器安全研究人员系统的理解容器安全配置。

猜你喜欢
镜像虚拟化容器
镜像
难以置信的事情
镜像
液体对容器底及容器对桌面的压力和压强
服务器虚拟化的安全威胁及防范分析
取米
镜像
浅谈虚拟化工作原理
用户怎样选择虚拟化解决方案
虚拟化整合之势凸显