我想了解是否可以将用户命名空间中的两个用户映射到主机上的两个不同用户。
目标是在rootfs
(ubuntu 基础,因为我正在尝试从头开始构建一个容器)内复制我在主机上拥有的相同权限。
例如:
- 之下的一切
/
都应属于root
。 /home/user
应该属于常规的user
。
为了实现这一点,我考虑在用户命名空间中使用 UID 映射,如下所示:
UID in user namespace ---> UID on host
1000 (admin) -> 0 (root)
1001 (bob) -> 1001 (bob)
这种映射可能吗?
以下是我已经尝试过的方法:
- 运行
echo -e "1000 0 1\n1001 1001 1" > /proc/[PID]/uid_map
以定义映射,但出现错误。 - 尝试为每个用户手动修改
/proc/[PID]/uid_map
使用。newuidmap
但是,我从来无法映射多个用户,而且我似乎根本无法映射 UID 0(根)。
更新:
我已阅读手册页并遵循其中提到的限制,但仍然收到错误消息。
例如:
# terminal 1
unshare --user bash
echo $$ # 11591
# terminal 2 as user 'alex' (uid = 1000)
newuidmap 11591 0 0 1
# newuidmap: uid range [0-1) -> [0-1) not allowed
newuidmap 11591 1001 1001 1
# newuidmap: uid range [1001-1002) -> [1001-1002) not allowed
即使使用 运行,这些命令也会失败sudo
。
我也尝试映射到我声明的 subuid,但它仍然不起作用:
cat /etc/subuid
alex:100000:65536
root:200000:65536
self:300000:65536
cat /etc/subgid
alex:100000:65536
root:200000:65536
self:300000:65536
内核文档指出,命名空间中只有一个 UID/GID 可以映射到主机 UID/GID 0。单个 UID-0 映射
1000 0 1
必须出现在任何其他映射之前。检查用户和组 ID 映射:uid_map 和 gid_map。
https://man7.org/linux/man-pages/man7/user_namespaces.7.html
https://man7.org/linux/man-pages/man7/pid_namespaces.7.html
禁止范围重叠。例如,
1001 1001 1
不得与第一个映射冲突。如果没有
newuidmap
,操作会因权限不足而失败,即使以命名空间内的 root 身份操作也是如此。非特权用户只能在其分配的子 UID/GID 内创建映射。
从
/etc/subuid:
从
/etc/subgid
:使用
newuidmap
和newgidmap
设置安全映射。手册页解释了语法:
这里有用户可以更详细地解释这一点^^