Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >rootless Podman如何工作?【Programming】

rootless Podman如何工作?【Programming】

作者头像
Potato
修改于 2019-11-25 07:13:30
修改于 2019-11-25 07:13:30
2.4K00
代码可运行
举报
运行总次数:0
代码可运行

了解Podman如何利用用户名称空间在无根模式下运行。

图片来源:Opensource.com
图片来源:Opensource.com

上一篇有关用户名称空间和Podman的文章中,我讨论了如何使用Podman命令来启动具有不同用户名称空间的不同容器,从而更好地分隔容器。Podman还利用用户名称空间来以无根模式运行。基本上,当非特权用户运行Podman时,该工具将设置并加入用户名称空间。在Podman成为用户名称空间内的root用户后,允许Podman挂载某些文件系统并设置容器。请注意,除了用户可用的其他UID之外,此处没有特权升级,如下所述。

如何创建用户名称空间?

shadow-utils

当前大多数Linux发行版都包含一个Shadow-utils版本,该版本使用/ etc / subuid和/ etc / subgid文件来确定用户名称空间中用户可以使用哪些UID和GID。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat /etc/subuid
 dwalsh:100000:65536
 test:165536:65536
 $ cat /etc/subgid
 dwalsh:100000:65536
 test:165536:65536

添加用户程序自动为添加到系统中的每个用户分配65536个UID。如果系统上已有用户,则需要自己分配UID。这些文件的格式为用户名:STARTUID:TOTALUIDS。在我的情况下,这意味着为dwalsh分配了100000至165535的UID以及我的默认UID,该ID恰好是在/etc/passwd中定义的3265。分配这些UID范围时,请注意它们与系统上的任何实际UID都不重叠。如果您有一个列为UID100001的用户,那么我(dwalsh)将能够成为此UID并可能读取/写入/执行该UID拥有的文件。

Shadow-utils还添加了两个setuid程序(或setfilecap)。在Fedora上,我有:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ getcap /usr/bin/newuidmap
 /usr/bin/newuidmap = cap_setuid+ep
 $ getcap /usr/bin/newgidmap
 /usr/bin/newgidmap = cap_setgid+ep

Podman执行这些文件以设置用户名称空间。通过在无根容器内部检查/proc/self/uid映射和/proc/self/gid映射,可以看到映射。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ podman run alpine cat /proc/self/uid_map /proc/self/gid_map
         0       3267            1
         1       100000          65536
         0       3267            1
         1       100000          65536

如上所示,Podman默认将容器中的root映射到当前UID(3267),然后在/etc/subuid和/etc/subgid中映射分配的UID/gid范围,从1开始。在我的示例中,容器中的UID1是UID100000,UID2是UID100001,一直到65536,也就是165535。

任何来自用户名称空间之外、由UID或GID拥有、但没有映射到用户名称空间的项目似乎都属于kernel.overflowuidsysctl中配置的用户,默认值为35534,my/etc/passwd文件称该用户没有名称nobody。由于您的进程不能作为未映射的ID运行,所以不应用所有者和组权限,因此您只能基于它们的“其他”权限访问这些文件。这包括运行容器的系统上真实root拥有的所有文件,因为root没有映射到用户名称空间。

Buildah命令具有一个很酷的功能,buildah unshare。这使您处于Podman运行时所处的用户命名空间中,但无需输入容器的文件系统,因此您可以列出主目录的内容。

请注意,当在用户名称空间之外列出home dir属性时,内核将所有权报告为dwalsh,而在用户名称空间内部,内核将目录报告为root拥有。这是因为主目录归3267所有,并且在用户名称空间内,我们将该UID视为根目录。

在 Podman中设置用户名称空间后会发生什么?

Podman使用容器/存储来提取容器映像,并且容器/存储足够智能,可以将映像中root拥有的所有文件映射到用户名称空间的根,以及不同uid拥有的任何其他文件映射到用户名称空间uid。默认情况下,此内容被写入~/.local/share/containers/storage。容器存储在无根模式下工作,无论是vfs模式还是Overlay模式。注意:只有在安装了fuse-overlayfs可执行文件时才支持Overlay。

内核仅允许用户名称空间root挂载某些类型的文件系统。目前,它允许挂载procfs,sysfs,tmpfs,fusefs和绑定挂载(只要源和目标归运行Podman的用户所有。虽然内核团队正在努力允许挂载OverlayFS,但尚不支持OverlayFS)。

然后,如果使用fuse-overlayfs,Podman将挂载容器的存储;如果存储驱动程序使用vfs,则不需要挂载。不过,vfs上的Podman需要很大的空间,因为每个容器都会复制整个底层文件系统。

紧接着Podman会与一些tmpfs一起装载/proc和/sys,并在容器中创建设备。

为了使用主机网络以外的网络,Podman使用slirp4netns程序为无特权的网络名称空间设置用户模式网络。Slirp4netns允许Podman将容器内的端口暴露给主机。注意,内核仍然不允许非特权进程绑定到小于1024的端口。需要Podman-1.1或更高版本才能绑定到端口。

无根Podman可以使用用户名称空间进行容器分离,但您只能访问/etc/subuid文件中定义的uid。

总结

Podman工具使人们能够在不牺牲系统安全性的情况下构建和使用容器。 您可以授予开发人员所需的访问权限,而无需授予他们root权限。

而且,当您将容器投入生产时,您可以利用用户名称空间提供的额外安全性,以使工作负载彼此隔离。

本文系外文翻译,前往查看

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

本文系外文翻译,前往查看

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Docker 大势已去,Podman 即将崛起
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
9620
Podman 保姆级使用教程,太顶了!
cockpit-podman 软件包作为 cockpit 插件可集成于 Web UI 中,实现 Web UI 管理容器。
米开朗基杨
2022/04/09
21.4K1
Podman 保姆级使用教程,太顶了!
【云原生 • Docker】Docker核心UTS Namespace原理实践
Docker三大支柱核心技术:Namespace、Cgroups和UnionFS,这节通过一个UTS Namespace简单实践小案例,更加直观理解Namespace资源隔离技术。
Reactor2020
2023/04/20
9691
【云原生 • Docker】Docker核心UTS Namespace原理实践
Docker Rootless 在非特权模式下运行 Docker
Rootless 模式允许以非 root 用户身份运行 Docker 守护进程(dockerd)和容器,以缓解 Docker 守护进程和容器运行时中潜在的漏洞。Rootless 模式是在 Docker v19.03 版本作为实验性功能引入的,在 Docker v20.10 版本 GA。
Se7en258
2021/12/31
7.8K0
Docker Rootless 在非特权模式下运行 Docker
如何在Rootless模式下运行Docker
告别sudo!无需Root权限也能玩转Docker?本文教你如何在无Root模式下安装Docker,利用用户命名空间隔离权限,保障安全。但需注意端口限制和cgroup v2依赖。更有uidmap安装、NGINX测试等干货,更有Podman等替代方案,云原生安全再升级!
云云众生s
2025/03/20
2640
CentOS8 安装和使用podman
使用rootless用户pull ubuntu镜像,竟然报这种错误。 发现错误:
双面人
2020/12/01
1.7K0
打开云原生大门:了解Linux命名空间的奥秘和Docker容器隔离技术
RootFS (Root File System),即根文件系统,是 Docker 容器启动时内部进程所能感知到的整个文件系统结构的起点,可以简单理解为 Docker 容器的根目录。 它是容器运行环境的基础,承载着容器运行所需的一切资源。
Lion 莱恩呀
2025/05/02
960
打开云原生大门:了解Linux命名空间的奥秘和Docker容器隔离技术
Kubernetes v1.30 新特性一览
各位 Kubernetes 用户们,请注意!1.30版本即将发布,这将对运维和开发者带来强大的功能。以下是关键特性的详细介绍:
用户1107783
2024/03/25
6360
Kubernetes v1.30 新特性一览
CVE-2018-18955:较新Linux内核的提权神洞分析
鉴于目前还没有针对这个漏洞的详细分析,原作者的advisory对新手来说也很不友好,我就写了这篇文章。
FB客服
2019/05/09
1.5K0
CVE-2018-18955:较新Linux内核的提权神洞分析
【漏洞复现】CVE-2023-2640 Ubuntu本地权限提升
Ubuntu是一种基于Linux操作系统的自由软件,它以用户友好的界面和易用性而著称。
信安百科
2023/09/24
3.6K0
【漏洞复现】CVE-2023-2640 Ubuntu本地权限提升
Linux本地提权漏洞CVE-2021-3493
OverlayFS漏洞允许Ubuntu下的本地用户获得root权限。Linux内核中overlayfs文件系统中的Ubuntu特定问题,在该问题中,它未正确验证关于用户名称空间的文件系统功能的应用程序。由于Ubuntu附带了一个允许非特权的overlayfs挂载的补丁,因此本地攻击者可以使用它来获得更高的特权。
用户5878089
2021/04/29
1.6K0
Linux本地提权漏洞CVE-2021-3493
Podman 从入门到精通
在本文中,我们将了解 Podman(Pod Manager的缩写)、它的功能和用法。
我的小碗汤
2023/03/19
2.5K0
Podman 从入门到精通
隔离 Docker 容器中的用户
笔者在前文《理解 docker 容器中的 uid 和 gid》介绍了 docker 容器中的用户与宿主机上用户的关系,得出的结论是:docker 默认没有隔离宿主机用户和容器中的用户。如果你已经了解了 Linux 的 user namespace 技术(参考《Linux Namespace : User》),那么自然会问:docker 为什么不利用 Linux user namespace 实现用户的隔离呢?事实上,docker 已经实现了相关的功能,只是默认没有启用而已。笔者将在本文中介绍如何配置 docker 来隔离容器中的用户。 说明:本文的演示环境为 Ubuntu 16.04。
星哥玩云
2022/07/19
3.6K1
隔离 Docker 容器中的用户
Podman 5.0重大改进详解
Podman 5.0 已发布,其中也包含一些重大更改,但不必担心;除非您使用 podman machine,否则您甚至不会注意到它们。
云云众生s
2024/04/10
6060
CVE-2021-3493:Ubuntu OverLayFS提权
Ubuntu的一个具体问题是在Linux内核中的overlayfs文件系统,它没有正确地验证文件系统功能在用户名称空间方面的应用,由于Ubuntu中的一个补丁允许非特权的overlayfs挂载,本地攻击者可以利用它来获得更高的权限。
Al1ex
2021/04/22
5970
CVE-2021-3493:Ubuntu OverLayFS提权
走进Network Namespace学会容器网络调试
Linux的Namespace[1]机制提供了一种资源隔离的解决方案,而目前Linux内核里面实现且支持的Namespace有7种,如下表:
公众号: 云原生生态圈
2020/10/10
6620
Kubernetes 1.25:对使用用户名字空间运行 Pod 提供 Alpha 支持
作者: Rodrigo Campos(Microsoft)、Giuseppe Scrivano(Red Hat)
CNCF
2022/11/28
5470
浅谈日常使用的 Docker 底层原理-三大底座
适合的读者,对Docker有过简单了解的朋友,想要进一步了解Docker容器的朋友。
宁在春
2023/10/16
1.8K0
浅谈日常使用的 Docker 底层原理-三大底座
最流行的容器运行时Podman,如何拿下17K Star?
Podman是一个基于libpod库开发的容器运行时,用于在Linux操作系统上管理和运行容器。与传统的Docker容器运行时不同,Podman无需依赖Docker守护进程,它可以在不同的Linux发行版中独立运行。
MCNU云原生
2023/03/17
1K0
最流行的容器运行时Podman,如何拿下17K Star?
说说linux容器的隔离
说到docker,大家都懂。但是LXC可能就比较陌生。Docker的起源于LXC。LXC的英文全称是Linux Container,相比较其他虚拟机而言,是一种轻量级虚拟化技术,它介于Chroot(linux的一个改变根目录挂载点的机制)和完整开发的虚拟机之间。LXC不使用单独的内核资源,但是可以创建一个类似的Linux操作系统环境。
mariolu
2020/02/13
3.2K0
相关推荐
Docker 大势已去,Podman 即将崛起
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验