浅谈容器运行时

admin 2024年7月8日16:12:33评论11 views字数 3987阅读13分17秒阅读模式

原作者: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 问世,为开发者提供了一种便捷的打包方式,使应用程序“一处构建,处处运行”,以至于容器再次“翻红”,形成一道新的科技浪潮。

浅谈容器运行时
图 1 :Docker 的创始人Solomon Hykes在 PyCon 上首次向全世界公开展示了 Docker

与虚拟机不同,容器与宿主机共享操作系统内核,在效率上更快一些,这种效率使得容器成为部署微服务、实现可扩展、高性能应用程序的理想选择。

浅谈容器运行时
图2:Docker 容器 VS 虚拟机

但正如 CNCF 的年度报告所调查的那样:“一个公司使用容器的范围越广,他们就越有可能将安全性视为容器的一大难题”。

理解容器的核心功能对于理解Runtime如何促进容器的无缝执行和如何管理容器至关重要。

1.1 Runtime 运行容器的步骤

  1. 创建容器,并根据镜像中的应用程序及其依赖初始化环境;
  2. 运行容器,启动应用程序并确保其正常运行;
  3. 管理容器的生命周期,例如:
    1. 监控容器的运行状况;
    2. 在容器发生故障的时候重启容器;
    3. 在不使用容器时清理资源;

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

容器化的环境本质上比传统的工作负载更加复杂,具体体现在:

  1. 更大的攻击面。由于容器及其各种底层镜像的多样性,其攻击面比传统的工作负载要大得多;
  2. 共享内核的架构。容器共享宿主机的操作系统内核。因此,仅保护主机的安全是远远不够的,我们还需要对容器之间的隔离进行安全配置。若没有进行安全配置,容器中的任何漏洞都有可能会危害整个主机;
  3. 动态环境。容器化工作负载的高度动态特性带来了可观测性的挑战,这使得传统的监控工具难以跟踪;

因此,采用整体的安全策略至关重要。理想的安全策略应该涵盖镜像构建到Runtime的监控的方方面面,例如:

  1. 镜像安全防护。在镜像部署之前先进行漏洞扫描,并修复镜像中的漏洞;
  2. 镜像仓库安全防护。在镜像仓库中实施安全访问控制与镜像签名;

因为,最佳的容器安全的实践应该为:

  1. 确保部署环境的安全。实施更强大的防火墙规则,对宿主机的操作系统进行加固;使用提供安全的API 接口和RBAC的编排工具;遵循最小权限原则,将容器配置成以最小的权限运行,避免以root或高权限运行容器;确保镜像中未嵌入secret;
  2. 监控容器互动。实施细粒度的监控,以提供容器健康和行为的可见性。

unsetunset0x06 结论unsetunset

本文,我们了解到Runtime主要负责从容器镜像仓库中拉取镜像、管理镜像的生命周期,以及在系统上执行容器的所有操作。

此外,我们还回顾了Runtime的历史,了解它们在现代软件开发中的作用以及与虚拟机的区别。

最后,我们还研究了不同类型的Runtime工具之间的区别及其安全风险。更多内容请查看我们的【容器安全防护基础】课程中的:

接下来,我们再简单分析一下:Docker、containerd、CRI-O 和 runc 之间的区别~

欢迎关注“喵苗安全”,原创技术文章第一时间推送;
参考资料
[1]

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/

原文始发于微信公众号(喵苗安全):浅谈容器运行时

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月8日16:12:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   浅谈容器运行时https://cn-sec.com/archives/2930941.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息