【摘 要】 本文从容器技术、镜像、网络和运行环境等维度分析了应用容器带来的4个安全挑战,总结了5项应对举措,并从容器全生命周期保护出发,提出了容器安全解决方案。
【关键词】 云原生 容器安全
1 引言
随着云计算的发展,以容器和微服务为代表的云原生技术,受到人们的广泛关注,其中Docker和Kubernetes (K8S)是企业容器运行时和容器编排的首要选择。然而,在应用容器和K8S过程中,大多数企业都遇到过不同程度的安全问题,如何保障容器安全,已成为企业最关心的问题。
2 应用容器带来新挑战
容器应用之前,云中应用系统多数运行于虚拟机上,但虚拟机仍会有额外的资源浪费和维护成本,而且其启动速度较慢。为进一步提升应用交付效率和资源利用率,因具有占用资源少、部署速度快和便于迁移等特点,容器技术开始受到企业青睐。在典型的云原生环境中,通常包括主机、镜像、容器、容器编排平台、网络和微服务等对象,但由于目前多数企业使用容器技术部署业务应用,故下面将重点分析与容器相关的安全挑战。
2.1 容器技术风险
作为一种操作系统虚拟化技术,容器共享操作系统内核,但并未实现完全隔离,若虚拟化软件存在漏洞,或宿主机被攻击,将会造成容器逃逸或资源隔离失效,影响某个容器或多个容器的安全。
◎容器逃逸:利用虚拟化软件存在的漏洞,攻击者通过容器获取主机权限,可攻击容器所在主机,甚至是该主机上的其他容器。过去几年内已经发现了多个相关漏洞,其中CVE-2019-5736是RunC的一个安全漏洞,它会导致18.09.2版本前的Docker允许恶意容器覆盖宿主机上的RunC二进制文件,使攻击者能够以根用户身份在宿主机上执行任意命令。
◎资源隔离失效:攻击者只要攻破容器操作系统内核,就可访问到主机上的文件系统,或进入其他容器,导致容器隔离失效。如果把主机的文件系统挂载到多个容器的目录里,容器就可以访问同一个目录,将会引起信息泄露或内容篡改等安全问题。
2.2 不安全的镜像
镜像是一个包含应用/服务运行所必需的操作系统和应用文件的集合,用于创建一个或多个容器,它们之间紧密联系,镜像的安全性将会影响容器安全。根据镜像创建和使用方式,通常有3个因素影响镜像安全。
◎现有镜像不安全:镜像通常是开发者基于某个现有镜像创建的,无论是攻击者上传的恶意镜像,还是现有镜像存在的安全缺陷,基于它创建的镜像都将会是不安全的。
◎使用包含漏洞的软件:开发者经常会使用软件库的代码或软件,如果它们存在漏洞或恶意代码,一旦被制作成镜像,也将会影响容器的安全。
◎镜像被篡改:容器镜像在存储和使用的过程中,可能被篡改,如被植入恶意程序和修改内容。一旦使用被恶意篡改的镜像创建容器后,将会影响容器和应用程序的安全。
2.3 东西向攻击
网络实现了容器之间、容器与外部之间的通信,以及应用之间的交互,但在虚拟化的容器网络环境中,其网络安全风险较传统网络更复杂、严峻。以Docker环境为例,它支持Bridge、Overlay和Macvlan等网络,尽管实现方式不同,但有一个共同和普遍的问题:如果容器之间未进行有效隔离和控制,则一旦攻击者控制某台主机或某台容器,可以以此为跳板,攻击同主机或不同主机上的其他容器,也就是常提到的“东西向攻击”,甚至有可能形成拒绝服务攻击。
2.4 运行环境未加固
作为容器的载体和编排管理软件,主机和容器编排平台等运行环境也是容器安全的重要因素之一。如前所述,主机上的容器并未实现完全隔离,如果主机未进行安全加固,一旦攻击者发起提权攻击,将会控制主机上其他容器。对于不安全的容器编排平台同样如此,某汽车制造企业就曾深受其害,由于其公有云环境中的K8S Master节点未设置密码保护,攻击者在盗取访问权限后,使用K8S集群挖掘加密货币。
3 容器安全应对举措
容器就利用了大部分Linux通用的安全技术,它们构成了容器安全的基础。面对新挑战,无论传统的安全加固,还是新的镜像组成分析,镜像、容器技术、网络和主机等不同层面的安全措施,都将有助于提升容器安全性。
3.1 Linux内核安全
Linux通用的安全技术包括命名空间(Namespace)、控制组(Cgroups)、系统权限(Capability)、强制访问控制(MAC)系统以及安全计算(Seccomp)等。一个好的容器平台,应该具备这些能力,下文将聚焦前3种能力。
◎命名空间(Namespace):本质上容器是由各种命名空间组成的,它们为容器提供了基础隔离,让每个容器拥有独立的进程ID、网络栈、根目录、内存、用户名和主机名,如图1所示。

◎ 控制组(Cgroups):控制组负责实现资源审计和限制,让每个容器公平地分享主机资源,并设置了限制,以免单个容器过度消耗资源,影响到主机系统和其他容器运行,也可以防止拒绝服务攻击,如图2所示。