假设我有用户“myuser”,uid/gid“1001”,文件“/etc/subuid”和“/etc/subgid”包含以下内容:
myuser:100000:65536
此设置是否可以以某种方式用于允许用户“myuser”访问所有者为“100000”的文件?
答案1
是的,在以下人员的帮助下setuid 根公用事业newuidmap
和newgidmap
与...一起工作/etc/subuid
和/etc/subgid
。
类似的工具播客,泊坞窗,或 LXC 都需要这些setuid 根安装的实用程序可在普通用户的无根/非特权模式下工作。如果没有这些工具,就没有足够的权限来引导此操作。
所有冗长的解释都在用户命名空间应阅读该联机帮助页以了解如何使用这些功能。简而言之,一旦创建了用户命名空间(使用非特权操作),特定的伪文件/proc/<PID>/{uid,gid}_map
就可以写入一次且只能写入一次来设置映射。具有正确的(主机)权限,备用uid/吉德然后可以将中允许的范围/etc/sub{uid,gid}
映射到用户命名空间中。
用户我的用户本身(无需任何特殊命令的帮助)可以写入这些伪文件,但是:
只允许拥有其自身(主机uid第1001章 1001)uid在用户命名空间中(明显可能有用的选择是它本身或 0 )根)。无论如何,这都必须从其他进程完成,因为新进程暂时没有映射到新创建的用户命名空间中。与任何非映射的uid被翻译成溢出uid(默认情况下 65534 又名没有人)直到“解决”,因此它无法写入自己的
/proc/<PID>/uid_map
文件。就算变成了根在此名称空间中,因为它只能影响根哪个是主机uid1001,这个没用。系统调用(以及使用它们的命令)都是为了不允许权限升级。除了失败等之外,当尝试更改映射时,EPERM
它们也可能失败EINVAL
uid(即:主机uid第1001章 1001)uid。对于团体来说也是如此,但附加的限制是它必须首先丧失使用的能力
setgroups
在能够写入之前/proc/<PID>/gid_map
(这是为了避免能够消除自己从一个群体到逃避对作为该组的一部分添加的文件的限制)。
所以uid100000 当然是达不到的:setuid 根工具是必需的。
这里的目标是映射普通用户我的用户和uid1001(除了newuidmap
从属 ID 之外还允许在映射中使用)作为根用户(uid0),以及还至少映射主机uid用户命名空间内的 100000:这允许通过(用户命名空间的)将一个更改为另一个根需要的时候。在这里,我将再次将额外的 100000 映射到 ... 100000。我也会做同样的事情吉德,假设/etc/subgid
是 的镜像/etc/subuid
。
这是一个关于如何使用newuidmap
和进行操作的实际示例newgidmap
,全部来自初始主机用户我的用户。如上所述,这需要两个进程,因此这里两个终端中有两个 shell。这些人的举动setuid 根命令可以替换为从(主机)运行的正确制作的echo
(或等)命令printf
根用户。
术语1:
$ unshare --user sh
$ id -u; id -un ; id -g; id -gn; echo pid:$$
65534
nobody
65534
nogroup
pid:13273
term2(重用之前的PID命令中的值):
$ newuidmap 13273 0 1001 1 100000 100000 1
$ newgidmap 13273 0 1001 1 100000 100000 1
再次 term1 (exec sh
只是为了让 shell 显示“已解决”和“已升级”状态):
$ id -u; id -un ; id -g; id -gn
0
root
0
root
$ exec sh
#
# touch mytest
# chown 100000:100000 mytest
term2(此处显示的内容与术语1,因为选择的映射具有相同的值):
$ ls -l mytest
-rw-r--r--. 1 100000 100000 0 Apr 21 18:00 mytest
$ touch mytest
touch: cannot touch 'mytest': Permission denied
术语1:
# chown 100001:100001 mytest
chown: changing ownership of 'mytest': Invalid argument
# chown root:root mytest
术语2:
$ ls -l mytest
-rw-r--r--. 1 myuser myuser 0 Apr 21 18:00 mytest
任何子流程来自术语1现在将控制uid100000,包括文件系统操作。
可以使用更大的范围或更智能的映射,因为允许/etc/subuid
影响更多的事物或更容易地影响事物(例如:将 100000 映射到我的用户相反, withnewuidmap 13273 0 1001 1 1001 100000 1
会允许简单地su myuser
运行术语1,尽管存在一些非致命错误,但应该会成功)。例如,这还允许访问/救援/备份(仅在文件系统级别,而不是网络等其他功能)用户 LXC 实例,该实例将由于某些不相关的问题而拒绝启动。