原作者:Nicolas Ehrman
来源:WIZ
写作日期:2024/02/12
unsetunset0x00 前言unsetunset
容器运行时(Container Runtime,简称Runtime)需要通过和操作系统内核进行紧密协作,来为容器提供运行环境,是容器真正运行的地方。
如果大家使用过Java,可以简单认为Java 程序就是容器,JVM就是Runtime;JVM需要为Java程序提供运行环境,而容器需要在Runtime中运行。
接下来,我们以新手的视角来浅谈一下容器运行时的功能、类型、常见工具以及安全风险~
unsetunset0x01 Runtime的功能unsetunset
容器技术起源于早期的Unix系统。在《第 1 课 容器安全威胁建模》中,我们了解到:2013年3月15日Docker 问世,为开发者提供了一种便捷的打包方式,使应用程序“一处构建,处处运行”,以至于容器再次“翻红”,形成一道新的科技浪潮。
与虚拟机不同,容器与宿主机共享操作系统内核,在效率上更快一些,这种效率使得容器成为部署微服务、实现可扩展、高性能应用程序的理想选择。
但正如 CNCF 的年度报告所调查的那样:“一个公司使用容器的范围越广,他们就越有可能将安全性视为容器的一大难题”。
理解容器的核心功能对于理解Runtime如何促进容器的无缝执行和如何管理容器至关重要。
1.1 Runtime 运行容器的步骤
-
创建容器,并根据镜像中的应用程序及其依赖初始化环境; -
运行容器,启动应用程序并确保其正常运行; -
管理容器的生命周期,例如: -
监控容器的运行状况; -
在容器发生故障的时候重启容器; -
在不使用容器时清理资源;
1.2 与宿主机的操作系统交互
Runtime 需要与宿主机的操作系统进行紧密交互。例如操作系统的namespace 和cgroup[1]。
它们利用操作系统的各种功能来隔离和管理每个容器的资源,确保容器内的进程无法干扰其他的容器或宿主机,从而保持一个安全稳定的环境。
1.3 资源的分配和管理
Runtime还是资源管理的重要组成部分,因为它们可以为每个容器分配和调节 CPU、内存和I/O,以防止过度占用资源。
这种特性在多租户环境中尤为常见,若要了解多租户相关的知识,请查看1.4 多租户。
unsetunset0x02 Runtime VS Engineunsetunset
虽然容器运行时(Container Runtime,简称Runtime)负责运行容器,但容器引擎(Container Engine,简称Engine)是一个更广泛的系统。Engine可以管理更多的容器生命周期,例如:镜像的分发、容器的编排和Runtime的管理。
一个常见的误区是:Runtime 等于 Engine。以Docker 为例,虽然 Docker 的Engine包含了Runtime,但它还提供了一套用于构建、交付和运行容器化应用程序的工具。
unsetunset0x0 Runtime的类型unsetunset
为了满足基本的容器运行到复杂的容器编排的需求,容器运行时大致可以分为底层的Runtime、高层的Runtime 和专门的Runtime。这些Runtime的独特功能及抽象程度如下所示:
类型 | 描述 | 特征 | 资源管理 | 与Linux内核的交互 | 安全 | 用例 |
---|---|---|---|---|---|---|
底层的Runtime | 直接与操作系统内核交互的最基本的、最小的Runtime | 直接与操作系统交互;高效、细粒度的控制; | 对资源的细粒度控制 | 与 namespace和cgroup等功能直接交互; | 具备基本的安全功能,主要依赖于宿主机操作系统的安全功能; | 需要轻量级的、最小的工具来运行容器;有其他用于处理编排的工具的大型系统; |
高层的Runtime | 更抽象,还提供了除了基本的容器运行之外的其他功能。 | 镜像管理;基本的网络功能;友好的用户交互; | 更广泛的管理功能,通常与编排平台集成; | 抽象交互,通常需要通过额外的界面进行; | 通常包括或集成了额外的安全功能; | 全面的容器管理;适用于开发环境; |
专门的Runtime | 为特定的平台或用例定制的Runtime,例如:kubernetes的边缘计算 | 针对特定的平台进行了优化;可能包括针对物联网等特定环境的功能; | 根据特定Runtime及预期用例而变化; | 各不相同,但通常会根据特定的环境或平台优化 | 可能包括针对目标平台或用例的专门的安全功能; | Kubernetes 部署;边缘计算和以物联网为中心的应用程序; |
unsetunset0x04 常见的Runtime 工具unsetunset
由于Runtime功能强大且用户广泛,市场上有许多关于Runtime的工具,如下所示:
Runtime 工具 | 描述 | 特征 | 安全 | 用例 |
---|---|---|---|---|
Docker | 用户在容器中创建、部署和操作应用程序的全方位的平台 | 用户友好界面;集成容器编排;支持镜像管理;支持跨平台; | 集成安全功能;定期更新补丁 | 全面的容器管理;适用于开发和生产环境; |
containerd | 业界标准的Runtime,强调易用性、可靠性和跨平台的兼容性; | 支持OCI格式的镜像;支持镜像的推送与拉取;支持多租户;支持OCI运行时规范 | 注重标准和合规性,设计安全;定期的漏洞扫描; | 全面的容器管理;适用于开发和生产环境; |
runC | 基于OCI 标准的启动和管理容器的命令行界面工具 | 底层操作;与操作系统直接交互;轻量级和简约;专注于容器的执行; | 包含基本的安全功能,主要依赖于宿主机的操作系统的安全功能;支持安全配置; | 需要与容器进程直接交互的场景;高度的控制和定制; |
CRI-O | 为Kubernetes环境量身定制的精简的Runtime | 针对Kubernetes进行了优化;支持OCI格式的镜像;使用CNI进行网络连接;默认安全; | 设计的时候充分考虑了Kubernetes的安全性;定期更新以应对Kubernetes特定的威胁; | Kubernetes的部署环境;优先考虑效率和Kubernetes兼容性的环境; |
Podman | 由社区驱动的处理容器和pod的Runtime工具,与kubernetes系统完全兼容 | 无守护进程且轻量级;与Docker兼容;支持Kubernetes;支持跨平台 | rootless操作增强了安全性;支持安全配置和策略; | 安全、轻量级的容器管理;安全优先的环境;与Kubernetes兼容的部署; |
Docker[2]在众多Runtime中脱颖而出,成为一个多功能且用户友好的平台,非常适合需要集成环境来构建、分发和运行应用程序的开发人员;
Containerd[3]和Runc[4]提供了更专业和更底层的功能,在Runtime的核心方面精益求精;
CRI-O[5]针对Kubernetes进行优化,使其成为Kubernetes生态系统中可以投入大量资金的首要选择;
Podman[6]通过使用无守护进程的容器管理脱颖而出,提供了一种独特的方法,与以安全为重点的简约环境完美契合;
总而言之,不同种类的Runtime反映了容器领域中不断发展的多样化的需求,也为各种部署策略和运行要求提供了定制的解决方案;
unsetunset0x05 安全风险unsetunset
容器化的环境本质上比传统的工作负载更加复杂,具体体现在:
-
更大的攻击面。由于容器及其各种底层镜像的多样性,其攻击面比传统的工作负载要大得多; -
共享内核的架构。容器共享宿主机的操作系统内核。因此,仅保护主机的安全是远远不够的,我们还需要对容器之间的隔离进行安全配置。若没有进行安全配置,容器中的任何漏洞都有可能会危害整个主机; -
动态环境。容器化工作负载的高度动态特性带来了可观测性的挑战,这使得传统的监控工具难以跟踪;
因此,采用整体的安全策略至关重要。理想的安全策略应该涵盖镜像构建到Runtime的监控的方方面面,例如:
-
镜像安全防护。在镜像部署之前先进行漏洞扫描,并修复镜像中的漏洞; -
镜像仓库安全防护。在镜像仓库中实施安全访问控制与镜像签名;
因为,最佳的容器安全的实践应该为:
-
确保部署环境的安全。实施更强大的防火墙规则,对宿主机的操作系统进行加固;使用提供安全的API 接口和RBAC的编排工具;遵循最小权限原则,将容器配置成以最小的权限运行,避免以root或高权限运行容器;确保镜像中未嵌入secret; -
监控容器互动。实施细粒度的监控,以提供容器健康和行为的可见性。
unsetunset0x06 结论unsetunset
本文,我们了解到Runtime主要负责从容器镜像仓库中拉取镜像、管理镜像的生命周期,以及在系统上执行容器的所有操作。
此外,我们还回顾了Runtime的历史,了解它们在现代软件开发中的作用以及与虚拟机的区别。
最后,我们还研究了不同类型的Runtime工具之间的区别及其安全风险。更多内容请查看我们的【容器安全防护基础】课程中的:
接下来,我们再简单分析一下:Docker、containerd、CRI-O 和 runc 之间的区别~
namespace 和cgroup: https://blog.nginx.org/blog/what-are-namespaces-cgroups-how-do-they-work
[2]Docker: https://www.docker.com/
[3]Containerd: https://containerd.io/
[4]Runc: https://github.com/opencontainers/runc
[5]CRI-O: https://github.com/cri-o/cri-o
[6]Podman: https://podman.io/
原文始发于微信公众号(喵苗安全):浅谈容器运行时
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论