容器安全防护

(整期优先)网络出版时间:2023-02-14
/ 2

容器安全防护

李达

诸子云安全专家  上海市  200092   

摘要:Docker容器允许开发者将应用及其运行环境打包到一个可移植的镜像中,从而快速运行在任何物理机及虚拟机上,其特点为启动速度快、资源利用率高等,近年来发展势头非常迅猛。但由于Docker容器技术仅依赖于底层操作系统内核的隔离机制,其安全性还存在很大的风险。本文在分析Docker容器的安全风险基础上,提出了相应的安全防护技术要求,并展望了后续研究方向。

关键词 虚拟化;容器;容器安全

中图分类号:TN918     文献标识码:A     文章编号:1008-5599(2020)03-0073-06

Docker是PaaS开源社区的一个基于 LXC的高级容器引擎。Docker是以容器为资源分割和调度的基本单位,通过封装软件运行时所需要的上下文,构建、发布和运行分布式应用的平台。Docker可在单个Linux 操作系统上提供多个独立的系统容器环境,并通过操作系统内核使得每个容器可以拥有独立的运行空间,也拥有独立的网络接口。传统的虚拟化技术中,虚拟机通过管理程序实现对硬件的虚拟化,并且每个虚拟机都有自己的操作系统,在启动速度和资源利用率以及性能上都有比较大的开销。Docker取消了虚拟机中的Hypervisor层和 Guest OS层,使用容器引擎进行调度,因此更为便捷,启动速度更快,资源利用率更高。同时,Docker容器既可以运行在单独的物理机上,也可以嵌套运行在虚拟机上。

1 内核安全防护

1.1 Docker内核安全

1.1.1 能力机制

能力机制是Linux内核一个强大的特性,通过将权限划分为更加细粒度的操作能力来提供细粒度的权限访问控制。既可以作用在进程上,也可以作用在文件上。 为了加强安全,建议容器启用能力机制并禁用以下一些不必要的权限。 (1)完全禁止任何挂载操作。(2)禁止直接访问本地主机的套接字。(3)禁止访问一些文件系统的操作,如创建新的设备和修改文件属性等。(4)禁止模块加载。 这样,就算攻击者在容器中取得了root 权限,也无法获得本地主机的较高权限,因此所产生的影响也是有限的。

1.1.2 安全计算模式

安全计算模式可以限制用户进程的系统调用,并对系统调用参数进行筛选,包括容器对内核应用编程接口API 的调用权限,以及调用内核 API后的处理操作。系统调用是用户态和内核态间最重要的接口,通过限定它可在很大程度上确保进程在安全可控范围内运行[1]。例如不授权内核 API写文件的权限,则在调用内核API创建文件时,可直接拒绝或者杀死用于调用内核API创建文件的进程。安全计算模式策略可通过黑名单或白名单的形式来限制/控制内核 API 的调用。出于安全考虑,建议优先使用白名单机制。

1.1.3 安全增强系统

安全增强系统是由内核实现的强制访问控制,允许管理员更加灵活的定义安全策略。通过策略规定哪些进程可以访问哪些文件,从而限制Docker容器内的进程访问宿主机或其它容器的资源。开启安全增强系统可以限制进程对宿主机文件的访问。(1)安全增强系统策略可以限制容器可访问的资源。(2)安全增强系统策略是全局的,整个系统都需遵循,因此攻击者很难突破。

1.2 容器间的隔离

Docker容器的隔离是基于Linux的命名空间实现的,具体包括PID命名空间、IPC命名空间、NET 命名空间、MNT命名空间、UTS命名空间和USER命名空间。(1)PID命名空间 :进程的隔离。每个容器都拥有自己的PID命名空间,每个PID命名空间中的进程可以有其独立的PID。每个容器可以有其 PID 为1的root进程,也使得容器可以在不同主机之间迁移,因为命名空间中的进程ID与主机无关。容器中的每个进程有两个PID,分别为容器中的PID 和主机上的PID。(2)IPC命名空间:特定进程间通信资源的隔离,包括 SYSTEM VIPC和POSIX消息队列。每个容器都有自己的SYSTEM V和POSIX消息队列文件系统。因此,只有在同一个IPC命名空间的进程之间才能够互相通信。

1.3 资源限制

资源限制(Cgroups)是Linux内核提供的一种机制,可以根据特定的行为把系统任务及其子任务整合(或分隔)到不同资源的组内。启用资源限制可以限制、记录和隔离进程组所使用的物理资源(包括 CPU、内存和I/O 等)。本质上,资源限制是给任务挂上钩子,当任务运行的过程中涉及到某种资源时,就会触发钩子上所附带的子系统进行检测,根据资源类别的不同,使用对应的技术进行资源限制和优先级分配。

2 主机安全防护

主机安全除了传统的防恶意代码、防入侵攻击等外部攻击防护之外,还需要做好相关的安全配置操作,防止引发安全问题。(1)操作系统最小化安装,仅运行必要的服务,删除所有开发工具(编译器等),删除所有监听的服务, 只保留22端口以进行SSH访问。 (2)SSH禁用root登录。 (3)防火墙配置应启用白名单策略,默认禁用所有入站和出站流量。(4)为容器创建独立分区。(5)禁止将宿主机上敏感目录映射到容器。 (6)对Docker守护进程、相关文件和目录进行审计。

3 镜像安全防护

目前Docker使用一个中心验证服务器来完成容器注册的访问权限控制,每个Docker客户端对注册进行 操作(上传或下载)时,都需要完成认证及权限控制。 数字签名及完整性验证。用户获取镜像时先验证签名再使用,防止其被恶意篡改。尽可能使用支持 Https的镜像仓库。对下载的镜像进行安全扫描。通过与CVE数据库同步扫描镜像,一旦发现漏洞则及时处理,或者直接阻 止镜像继续构建。 另外,对于自己构建容器镜像时,镜像中软件应使用最新版本,并且对镜像进行签名防止被恶意篡改。

4 容器安全防护

对容器启动及运行时的权限加以限制,同时禁止不必要的服务,具体包括如下。(1)启动容器时不带Privileged参数,禁止Privileged标记使用特权容器。(2)禁止在容器上运行ssh服务。(3)挂载的容器根目录绝对只读,而且不同容器对应的文件目录权限分离,最好是每个容器在宿主上有自己单独分区。(4)通过设置On-failure来限制容器尝试重启的次数。(5)限制在容器中可用的进程树,以防止 Fork炸弹。 

5 网络安全防护

(1)为了防止链路劫持和会话劫持等问题导致Docker通信时被中间 人攻击,Docker client端与Docker Daemon的通信应该通过加密方式。 (2)默认情况下,可通过指定icc标志来禁止容器与容器之间通信,必要时通过 Iptables 设定规则实现允许容器之间网络流量。 (3)禁止将Docker绑定到其它IP/端口或者Unix Socket。(4)禁止在容器上映射特权端口。 (5)容器上只开放所需要的端口。

6 数据安全防护

检查容器创建模板,防止文件中存在账号密码等敏感信息。原则上,需要避免或者严格限制使用本地HostPath作为容器存储,以防止容器读取主机中的重要文件。行加密保护和安全存储,防止被非法读取或篡改。

7 结束语

目前,Docker容器的安全防护更多的还是依赖于Linux操作系统内核自带的安全能力,通过配置启用相应的安全能力来实现对容器的安全防护[2]。未来将需要进一步研究设计能够对容器进行安全检测、评估以及风险预警的机制和方案,以便及时发现容器的安全问题,更好的保障容器应用的安全。

参考文献

[1] 王欢. 基于容器安全防护平台的关于PaaS容器安全的设计与实现[J]. 通信电源技术,2022,39(6):36-39 .

[2] 任兰芳,庄小君,付俊. Docker容器安全防护技术研究[J]. 电信工程技术与标准化,2020,33(3):73-78.