Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >用户命名空间: 现支持在 Alpha 中运行有状态 Pod

用户命名空间: 现支持在 Alpha 中运行有状态 Pod

作者头像
灵雀云
发布于 2023-09-19 00:16:18
发布于 2023-09-19 00:16:18
2200
举报
作者:Campos Catelin (Microsoft), Giuseppe Scrivano (Red Hat), Sascha Grunert (Red Hat)

Kubernetes v1.25引入了仅适用于无状态Pod的用户命名空间支持。在Kubernetes 1.28中解除了这个限制,经过了1.27版本的一些设计更改。

这个功能的美妙之处在于:

  • 采用非常简单(只需在Pod规范中设置一个bool)。
  • 对大多数应用程序不需要任何更改。
  • 通过显著增强容器的隔离性和减轻了被评为高和危急(HIGH和CRITICAL)的CVE(公开漏洞和暴露)来提高安全性。

本文解释了用户命名空间的基础知识,并展示了:

  • Kubernetes v1.28最新版本中的更改。
  • 一个被评为高危但在用户命名空间下不可利用的漏洞演示。
  • 使用这一功能所需的运行时要求。
  • 关于用户命名空间的未来版本中可以期待的内容。

什么是用户命名空间?

用户命名空间是Linux的一个功能,它将容器的用户和组标识符(UID和GID)与主机上的标识符隔离开来。容器中的标识符可以映射到主机上的标识符,以确保不同容器使用的主机UID/GID永远不会重叠。更重要的是,这些标识符可以映射到主机上的非特权非重叠UID和GID。这基本上意味着两件事:

  • 由于不同容器的UID和GID映射到主机上的不同UID和GID,即使它们越出了容器的边界,容器也很难相互攻击。例如,如果容器A在主机上具有与容器B不同的UID和GID,那么它对容器B的文件和进程的操作将受到限制:只能读/写文件允许其他人的内容,因为它永远不会有文件的所有者或组的权限(主机上的UID/GID保证了不同容器的不同)。
  • 由于UID和GID映射到主机上的非特权用户,如果容器越出了容器的边界,即使它在容器内部以root身份运行,它也没有主机上的特权。这大大保护了它可以读/写的主机文件,可以发送信号给哪个进程等等。

此外,授予的权限仅在用户命名空间内有效,而不在主机上有效。

如果不使用用户命名空间,一个以root身份运行的容器在容器突破的情况下具有节点上的root特权。如果某些权限已授予容器,则这些权限也在主机上有效。当使用用户命名空间时,这些情况都不成立(当然,除非存在漏洞)。

1.28版本的变化

正如之前提到的,从1.28版本开始,Kubernetes支持具有状态的Pod的用户命名空间。这意味着具有用户命名空间的Pod可以使用任何类型的卷,不再仅限于以前的一些卷类型。

用于激活此功能的特性开关已被重命名,不再是"UserNamespacesStatelessPodsSupport",而是从1.28版本开始应该使用"UserNamespacesSupport"。进行了许多更改,节点主机上的要求也发生了变化。因此,Kubernetes 1.28版本将该功能标志重命名以反映这一变化。

演示:

Rodrigo创建了一个演示,利用了CVE 2022-0492,并展示了在没有用户命名空间的情况下如何发生漏洞利用。他还展示了在容器使用此功能的Pod中无法使用此漏洞利用的情况。

此漏洞被评为高危,允许一个没有特殊特权的容器读/写主机上的任何路径,并在主机上以root身份启动进程。

访问 https://youtu.be/M4a2b4KkXN8 查看演示

大多数容器中的应用程序今天以root身份运行,或者以半可预测的非root用户(用户ID 65534是一个相对流行的选择)。当您运行一个使用userns的容器的Pod时,Kubernetes将这些容器作为非特权用户运行,您的应用程序无需进行任何更改。

这意味着两个以用户65534身份运行的容器将有效地映射到主机上的不同用户,限制了它们在逃逸情况下对彼此的操作,如果它们以root身份运行,主机上的特权也会降低到非特权用户的权限。

节点系统要求

使用此功能需要Linux内核版本和容器运行时的要求。

在Linux上,您需要Linux 6.3或更高版本。这是因为该功能依赖于一个名为idmap mounts的内核功能,并且在Linux 6.3中合并了使用idmap mounts与tmpfs的支持。

如果您使用CRI-O与crun,这在CRI-O 1.28.1和crun 1.9或更高版本中受支持。如果您使用CRI-O与runc,目前仍不受支持。

containerd的支持目前定位于containerd 2.0;不管您是否与crun或runc一起使用,可能都不会有问题。

请注意,containerd 1.7添加了对用户命名空间的实验性支持,正如在Kubernetes 1.25和1.26中实现的那样。1.27版本中进行的重新设计不受containerd 1.7支持,因此它在用户命名空间支持方面仅适用于Kubernetes 1.25和1.26。

containerd 1.7存在的一个限制是,在Pod启动期间需要更改容器镜像中每个文件和目录的所有权。这意味着它具有存储开销,并且可能会显著影响容器启动延迟。Containerd 2.0可能会包括一个实现,可以消除增加的启动延迟和存储开销。如果计划在生产中使用containerd 1.7与用户命名空间,请考虑这一点。

这些containerd的限制都不适用于CRI-O 1.28。

下一步是什么?

展望Kubernetes 1.29,计划与SIG Auth合作,将用户命名空间集成到Pod安全标准(PSS)和Pod安全准入中。目前的计划是在使用用户命名空间时放宽PSS策略中的检查。这意味着如果使用用户命名空间,那么字段spec[.*].securityContext runAsUser、runAsNonRoot、allowPrivilegeEscalation和capabilities将不会触发违规,行为可能由使用API Server功能开关来控制,比如UserNamespacesPodSecurityStandards或类似的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-15 12:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生技术社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kubernetes 1.28:Sidecar 容器、Job和Proxy的新功能
Kubernetes 1.28 现已发布,具有 44 项新的或改进的增强功能! 此版本包含许多主要功能,例如对 sidecar 容器的内置支持、作业优化和更好的代理。 这些新功能可以帮助您提高 Kubernetes 集群的性能、效率和安全性。
从大数据到人工智能
2023/10/18
1K0
Kubernetes 1.28:Sidecar 容器、Job和Proxy的新功能
Kubernetes 1.25:对使用用户名字空间运行 Pod 提供 Alpha 支持
作者: Rodrigo Campos(Microsoft)、Giuseppe Scrivano(Red Hat)
CNCF
2022/11/28
5350
Kubernetes v1.30 新特性一览
各位 Kubernetes 用户们,请注意!1.30版本即将发布,这将对运维和开发者带来强大的功能。以下是关键特性的详细介绍:
用户1107783
2024/03/25
6120
Kubernetes v1.30 新特性一览
不讲武德,Kubernetes 弃用 Docker刷爆了网络,我们公司也慌了!
目前,kubelet 中的 Docker 支持功能现已弃用,并将在之后的版本中被删除。Kubelet 之前使用的是一个名为 dockershim 的模块,用以实现对 Docker 的 CRI 支持。但 Kubernetes 社区发现了与之相关的维护问题,因此建议大家考虑使用包含 CRI 完整实现(兼容 v1alpha1 或 v1)的可用容器运行时。
芋道源码
2020/12/09
5320
不讲武德,Kubernetes 弃用 Docker刷爆了网络,我们公司也慌了!
容器安全与安全运行环境的重要性
了解容器运行环境的工作机制,缘何若攻击者突破容器的限制,过度耦合的运行环境可能造成主机被接管,以及gVisor和Kata Containers等安全容器运行环境的好处。
云云众生s
2024/03/28
2180
K8s宣布弃用Docker,千万别慌!
近日,Kubernetes 官方发布公告,宣布自 v1.20 起放弃对 Docker 的支持,届时用户将收到 Docker 弃用警告,并需要改用其他容器运行时。
SDNLAB
2020/12/09
15K0
K8s宣布弃用Docker,千万别慌!
Runc 容器初始化和容器逃逸
在每一个 Kubernetes 节点中,运行着 kubelet,负责为 Pod 创建销毁容器,kubelet 预定义了 API 接口,通过 GRPC 从指定的位置调用特定的 API 进行相关操作。而这些 CRI 的实现者,如 cri-o, containerd 等,通过调用 runc 创建出容器。runc 功能相对单一,即针对特定的配置,构建出容器运行指定进程,它不能直接用来构建镜像,kubernetes 依赖的如 cri-o 这类 CRI,在 runc 基础上增加了通过 API 管理镜像,容器等功能。
米开朗基杨
2021/02/25
9390
Runc 容器初始化和容器逃逸
Docker,containerd,CRI,CRI-O,OCI,runc 分不清?看这一篇就够了
自 Docker 开启了使用容器的爆发式增长,有越来越多的工具和标准来帮助管理和使用这项容器化技术,与此同时也造成了有很多术语让人感到困惑。
Peter Shen
2022/04/26
5.2K0
Docker,containerd,CRI,CRI-O,OCI,runc 分不清?看这一篇就够了
2022 年 Kubernetes 高危漏洞盘点
2022 年,Kubernetes继续巩固自己作为关键基础设施领域的地位。从小型到大型组织,它已成为广受欢迎的选择。出于显而易见的原因,这种转变使 Kubernetes 更容易受到攻击。但这还没有结束,开发人员通常将Kubernetes 部署与其他云原生组件一起使用来构建一个完善的工作系统。不幸的是,这种组合会导致具有更多组件的更复杂的基础架构。这最终会增加易受攻击的表面积和范围。
用户5166556
2023/03/18
1.9K0
2022 年 Kubernetes 高危漏洞盘点
1.Containerd容器运行时初识与尝试
本章主要讲解,目前K8S使用率最多的容器运行时讲解, 由于k8s在2020年宣布1.20版本之后将弃用dockershim(其中也有kubernetes与Docker爱恨情仇)时才把containerd拉回大众的视野之中,本章主要讲解containerd基础入门。
全栈工程师修炼指南
2021/07/25
2.8K0
1.Containerd容器运行时初识与尝试
Inspektor Gadget:云原生时代下的 eBPF 工具链框架
Hello folks,我是 Luga,今天我们来聊一下云原生生态领域的 eBPF 工具链管理框架 - Inspektor Gadget 。
Luga Lee
2023/11/17
4970
Inspektor Gadget:云原生时代下的 eBPF 工具链框架
【容器安全系列Ⅱ】- 容器隔离与命名空间深度解析
在本系列的第一部分中,我们了解到容器实际上只是 Linux 进程。现在,我们需要了解容器如何与主机的其余部分隔离。换句话说,我们如何确保在一个容器中运行的进程不会轻易干扰另一个容器或底层主机的操作?
星尘安全
2024/08/17
2020
【容器安全系列Ⅱ】- 容器隔离与命名空间深度解析
经验分享:Docker安全的26项检查清单(checklist)
容器以及编排工具(例如Kubernetes)开创了应用开发的新时代,让微服务架构以及CI/CD的实现成为了可能。Docker是迄今为止最主要的容器运行时引擎。然而,使用Docker容器构建应用也引入了新的安全挑战和风险。
Jintao Zhang
2022/12/07
8570
经验分享:Docker安全的26项检查清单(checklist)
【K8s】Kubernetes 网络之 Pod 网络调试
在实际工作中,我们经常会遇到一些疑似网络方面的故障问题,从而需要对 Kubernetes 集群中的 Pod 进行网络调试。
行者Sun
2024/12/27
1260
【K8s】Kubernetes 网络之 Pod 网络调试
带你搞懂Kubernetes Pod 如何获取 IP 地址
Kubernetes 网络模型的核心要求之一是每个 Pod 都应该有自己的 IP 地址,并且集群中的每个 Pod 都应该能够使用这个 IP 地址与其进行通信。有多个网络提供商(flannel、calico、canal 等)实现了这种网络模型。
用户1107783
2024/04/18
4590
带你搞懂Kubernetes Pod 如何获取 IP 地址
容器运行时
要把进程运行在容器中,还需要有便捷的SDK或命令来调用Linux的系统功能,从而创建出容器。容器的运行时(runtime)就是运行和管理容器进程、镜像的工具。
CNCF
2022/11/28
1.6K0
容器运行时
Kubernetes 弃用 Docker刷爆网络,有什么替代品?
通过以上架构图,可以看到每个 Kubernetes 节点都与控制平面彼此通信。各个节点上的 kubelet 获取元数据,并执行 CRI 以在该节点上创建 / 删除容器。 1、但 Docker 为什么会被弃用?
java进阶架构师
2020/12/17
1.4K0
Kubernetes 弃用 Docker刷爆网络,有什么替代品?
OCI容器与Wasm初体验
WebAssembly(Wasm)有一套完整的语义,在web中被设计成无版本、特性可测试、向后兼容的,当然,WebAssembly 不仅可以运行在浏览器上,也可以运行在非web环境下。实际上wasm是体积小且加载快的二进制格式,其目标就是充分发挥硬件能力以达到原生执行效率,在本文中,将介绍以容器镜像方式运行Wasm工作负载的场景,关于运行时的介绍可以参看Containerd深度剖析-runtime篇
zouyee
2023/02/06
1.1K0
细说Containerd CVE-2020–15257
周日有空,zouyee带各位看看11月末CVE-2020–15257的安全漏洞。Containerd是基于OCI规范实现的一款工业级标准的容器运行时。Containerd在宿主机中管理容器生命周期,如容器镜像的传输和存储、容器的执行和管理、存储和网络等。containerd-shim是用作容器运行的载体,实现容器生命周期管理, 其API以抽象命名空间Unix域套接字方式暴露,该套接字可通过根网络名称空间访问。因此,一旦普通用户获得主机网络访问权限(通过启动主机网络模式的容器),则可以访问任一容器的API,并以此提权。例如生命周期管理,高级网络,资源绑定,状态抽象以及这些抽象概念多年来的变化。
zouyee
2021/02/01
1.4K0
细说Containerd CVE-2020–15257
一文搞懂Kubernetes容器运行原理
Hello folks,我是 Luga,今天我们来分享一下与云原生体系有关的话题- 云原生技术-Container。 作为一个“核心”要素之一,容器技术在云原生生态中发挥着重要的意义。
Luga Lee
2023/04/28
1.9K1
一文搞懂Kubernetes容器运行原理
相关推荐
Kubernetes 1.28:Sidecar 容器、Job和Proxy的新功能
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文