APP下载

Docker 容器安全的分析研究*

2020-12-23涂俊亮

通信技术 2020年12期
关键词:镜像校验攻击者

陈 伟,涂俊亮

(中国电子科技集团公司第三十研究所,四川 成都 610041)

0 引言

云计算作为最近几年计算机与互联网界的焦点,得到了众多企业和科研机构的青睐。虚拟化技术作为云计算的关键技术[1],随着云计算的使用也得到了迅速发展。虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机[2]。虚拟化既可以通过硬件模拟来实现,也可以通过操作系统来实现。目前主流的虚拟化技术如XEN、VMware 以及KVM 都是基于虚拟机的平台虚拟化技术[3]。这些方案通常因为虚拟机镜像普遍较大、需要自己独立的完整的操作系统(GuestOS)、占用的硬件资源多等特点,对于大规模的集群部署适应性较差。

Docker 是基于Go 语言实现的云开源项目,诞生于2013 年初[4]。作为一种轻量级的虚拟化技术,Docker 在运行应用上和传统的虚拟机方式相比有显著的优势[5]:①Docker 容器运行很快,启动和停止可以在秒级实现,相比传统的虚拟机方式要快很多。②Docker 容器对系统的资源需求很少,一台宿主机可以运行多达数千个的容器,这在传统虚拟机是不可想象的。③Docker 通过Dockerfile 配置文件来支持灵活的自动化创建和部署机制,提高效率[6]。

随着Docker 容器技术的大量使用,如何确保Docker 容器的安全被看做Docker 容器使用的关键。

1 Docker 安全性分析

Docker 是Linux 操作系统层面的虚拟化实现,其本质和运行在Linux 上的进程没有区别。目前Docker 容器的安全性其本质上依赖于Linux 系统本身[7]。Docker 的安全主要通过以下几个方面实现:①Linux内核的命名空间机制提供的容器隔离安全。通过命名空间机制,可以使运行在同一台宿主机上的Docker 容器中的程序不会受到相互之间的影响,且有自己独有的网络栈不会被其他容器访问。②Linux 控制组机制对容器资源的控制能力安全。Linux 控制组机制可以确保同一台宿主机上的容器公平地分配宿主机的CPU、磁盘和内存等资源,控制组机制也会保证容器发生异常时不会影响宿主机和其他容器的正常运行。③Linux 内核的能力机制所带来的操作权限安全。Linux 提供了更加粒度化的权限访问控制,为保证容器的安全,我们使用Docker 容器时将会对容器的权限做出严格的限制,限制其只能使用容器功能所需的最小权限。

虽然Docker 已经在安全方面做出了诸多限制,但在使用中Docker 受制于自身缺陷存在以下几大类的风险。

图1 容器安全风险概括

1.1 镜像安全风险

Docker 镜像是Docker 容器的静态表现形式,容器运行时的安全取决于Docker 镜像的安全。Docker hub 作为Docker 官方镜像仓库,其中的Docker 镜像对上传者缺乏完善的监管,其版本、质量和安全对于使用者处于不可控状态。

在Dockerfile 中如果不指定USER,Docker 将以root 权限运行该容器,如果被攻击可能会导致宿主机的root 权限被获取。Dockerfile 中使用涉及密码、密钥等信息,一旦被攻击将会导致数据泄露。

使用来源不安全的镜像,将导致Docker 容器出现不可控的安全风险。

1.2 容器虚拟化安全风险

与传统虚拟机相比,Docker 容器没有独立的资源配置,没有在系统内核层面进行资源隔离,因此存在资源隔离与资源限制不彻底的潜在风险。

(1)容器隔离问题

Docker 容器和宿主机共享操作系统内核,Docker 容器与宿主机上其他容器或宿主机之间存在文件系统隔离、进程隔离和进程间通信隔离不到位的潜在风险。

Docker 容器隔离安全风险问题主要存在以下两种情况:①攻击者直接攻击操作系统内核,造成宿主机上Docker 容器出现安全风险。②攻击者通过控制某一个Docker 容器访问宿主机或其他容器非法获取数据。

(2)容器逃逸问题

容器逃逸攻击指的是攻击者通过非法手段获取root 权限,获得宿主机或其他容器某种权利下的命令执行能力,影响宿主机或其他容器的运行安全。

(3)拒绝服务攻击

Docker 容器与宿主机共享CPU、内存、磁盘空间等硬件资源,如果不对Docker 容器使用宿主机资源做出限制,攻击者可通过挟持某个容器,使其耗尽宿主机的硬件资源达到使宿主机或其他容器暂停甚至死机的目的。

1.3 网络安全风险

Docker 容器网络安全一直是容器使用中面临的巨大问题之一。Docker 网络由于其特殊的网络环境,相比于传统的网络安全更加严峻。

(1)容器网络攻击

Docker 容器有多种组网模式,提供了容器间通信、跨主机容器间通信、容器集群网络等功能。下面就几种主流的组网模式分析其潜在的网络安全风险。

桥接模式是Docker 默认采用桥接网络模式,桥接模式会在宿主机上创建一个docker0虚拟网桥,并将宿主机上所有采用这种模式的Docker 容器连接在docker0 网桥上,在这种模式下所有的Docker 容器都是互相可达的。桥接模式虽然对容器间互相访问提供了便利,但是由于缺乏安全的管理机制,攻击者可通过广播风暴、嗅探、ARP 欺诈等攻击手段,影响宿主机和其他容器的安全。

MacVLAN 是Docker 容器的网卡虚拟方案,在多租户场景下,为每个租户单独虚拟出独自的网络从而达到隔离的目的。但由于同一虚拟网络环境下Docker 容器之间没有控制访问权限,攻击者仍可以通过广播风暴、嗅探、ARP 欺诈等攻击手段,影响宿主机和其他容器的安全。

Overlay 网络作为目前最主流的跨主机数据传输和路由方案,主要用于搭建跨主机的容器集群网络。和上面两种组网模式一样,由于缺乏访问权限控制,Overlay 仍然存在安全风险。

因此,不管使用哪种组网模式,都存在容器间互相攻击的安全风险。

1.4 容器服务稳定风险

Docker 容器在提供服务时往往需要提供7×24的稳定服务,攻击者可能会从Docker 容器外部以及内部对服务发起攻击,造成服务不可用。

(1)容器内部服务稳定问题

Docker 容器内部服务进程,可能在受到自身程序稳定或外界恶意攻击时停止运行,导致服务暂停,在生产环境中造成损失。

(2)容器运行稳定问题

Docker 容器运行在宿主机上时,可能因为外界恶意攻击被关闭或者删除掉,导致无法提供服务。

2 Docker 安全机制实现

2.1 容器镜像安全机制

为保证Docker 容器镜像的安全性,从官方镜像仓库获取到公共最小基础镜像后,需要使用安全扫描工具对下载的镜像进行安全扫描,目前使用较多的工具包括Docker Security Scanning、Clair 和Trivy 等,可检测镜像中软件含有CVE 漏洞。

在生成可控的容器镜像之后为方便镜像的管理,需要搭建可控的私有镜像仓库。需要确保镜像仓库不被外界公网所访问,在拉取镜像过程中采用内容校验机制解决中途容器镜像被篡改。

为确保Docker 容器中可执行文件和配置文件是可信的,在Docker 容器每次启动前对可执行文件和配置文件进行CRC32 校验,只有校验成功才能启动Docker 容器。假设可执行文件及关键配置文件分别为F1,F2,...Fn,Docker 容器程序部署好之后计算一次所有可执行文件及关键配置文件的校验值C1,并对校验值进行加密保存。Docker 容器启动前对所有可执行文件及关键配置文件再次计算校验值C2,比对两次的校验值。

流程设计如图2 所示:

2.2 容器虚拟化安全机制

在容器架构中,在已有的Cgroups、Namespace和内核能力机制上可通过增强操作系统内核层面的相关机制达到Docker 容器安全的资源管理。

(1)资源隔离与限制

Cgroups 对Docker 容器的CPU、内存和磁盘I/O 速度等资源项已经做出了限制,为防止某个容器耗尽宿主机上的硬件资源。在容器启动时,可以使用CPU、Memory、Device 参数对CPU 使用率、内存占用率、磁盘读写速率进行限制。

图2 容器镜像启动流程

对磁盘使用容量限制,为每个容器创建单独用户,限制每个用户的磁盘使用量。使用XFS 等文件系统目录进行磁盘使用量限制。为每个容器创建固定大小的虚拟文件系统。

(2)强制访问控制

通过SELinux 机制实现Docker 容器对宿主机资源的访问限制,在启动Docker 容器时可通过docker daemon --selinux-enabled=true 命令启动SELinux。

2.3 容器网络安全机制

(1)容器流量限制

在生产环境中宿主机通常会部署成百上千个Docker 容器为多租户提供服务,为避免个别容器抢占绝大部分的带宽,导致其他Docker 容器服务不可用,采用Linux 的流量控制模块traffic controller 对容器网络进行流量限制。

(2)白名单访问控制

为防止恶意的网络攻击,保证Docker 容器的网络安全,可以通过配置白名单策略实现网络访问控制。白名单的访问策略,可以由Linux 自带的防火墙机制实现。

(3)禁止容器间通信

当Docker 容器单独提供服务而不需要多个Docker 容器组成微服务时。为防止Docker 容器间恶意攻击需要禁止容器间通信,可通过命令dockerd--icc=false 完成设置。

2.4 容器服务程序安全机制

Docker 容器最主要的功能就是提供健壮、稳定的轻量级虚拟化服务。为保证Docker 容器内服务程序的稳定性,在容器内可由看门狗程序进行定期检查。同时,可以建立一个容器管理中心,定期接收容器内心跳程序发来的心跳数据,并根据接收情况进行处理。

(1)看门狗程序

“看门狗”程序主要用作Docker 内服务的启动和检查工作。其主要工作流程如图3 所示。

步骤1:启动容器内服务程序。

步骤2:定期检查服务程序的状态,发现服务程序挂掉后,上报记录问题到管理模块,重新启动服务程序。

步骤3:等待下一次检查。

(2)心跳程序

通过实现Docker 容器内心跳进程,向管理中心定期发送心跳和运行数据,达到容器内资源监听等目的。其主要流程如图4 所示。

图3 看门狗程序执行流程

图4 心跳处理流程

步骤1:Docker 容器内心跳进程,定期向管理中心发送Docker 容器CPU、内存使用率等数据。

步骤2:管理中心接收Docker 发送的数据,对数据进行记录,若容器CPU、内存等数据长期超过设定的安全值,则需要对该Docker 容器进行检查和资源重新分配。

步骤3:管理中心在超时时间内未接收到Docker 容器内心跳进程发送的数据。发送ICMP 包到Docker 容器,若容器无返回,则通知宿主机删除该容器并重新创建。

步骤4:ICMP 包返回,则进一步通过IP 地址和端口执行TCP 检查,接收返回的检查结果,若检查结果成功则表示Docker 容器可用,否则通知宿主机删除该容器并重新创建。

3 结语

本文通过分析Docker 容器在使用中可能遇到的安全风险,给出了解决方案。在Docker 容器生产部署时,应全面考虑可能出现的安全风险,根据部署场景给出对应的安全需求分析,并结合Docker容器的安全解决方案,形成容器安全应用最佳实践。

猜你喜欢

镜像校验攻击者
使用Excel朗读功能校验工作表中的数据
镜像
正面迎接批判
镜像
正面迎接批判
智能电能表的现场快速校验方法探讨
电子式互感器校验方式研究
有限次重复博弈下的网络攻击行为研究
镜像
浅谈微电子故障校验