catanman
1)
[[email protected] ~]$ newuidmap 7134 65534 5000 1
newuidmap: write to uid_map failed: Operation not permitted
任何想法,这是为什么失败?
文档(http://man7.org/linux/man-pages/man7/user_namespaces.7.html)规定如下:
通过克隆(2) 与新用户 命名了一套完整的能力开出CLONE_NEWUSER标志创建子进程。 < ...>请注意,对execve(2)的调用将导致进程的 功能以常规方式重新计算(请参阅 功能(7))。
这是因为不共享调用returing的控制权交给用户之前“EXEC庆典”和你失去了必要的功能,所以你不能/ gid_map从用户的命名空间内改变uid_map。但是,如果您编译某个应用程序(例如,您可以在user_namespaces(7)的一个示例中做一个小修复),它在'exec'之前更新uid_map/gid_map,则更新将成功。
2)
但是当我从运行新的命名空间似乎仍然 以root的身份,而不是UID 5000运行中的进程:
我缺少什么?
- 该映射不会更改用户。映射链接在子名称空间中的id到其父名称空间中的id,而不是相反的方式。
- 您可以从子名称空间内调用
setuid(2)
或seteuid(2)
将凭据更改为来自同一用户名空间的某些其他凭据。他们当然应该映射到父命名空间的值,否则geteuid()函数将失败。
这里有两个例子:
例1假设我们已经创建了一个孩子用户的命名空间。
arksnote linux-namespaces # unshare -U bash
[email protected] ~ $ id
uid=65534(nobody) gid=65534(nobody) группы=65534(nobody)
[email protected] ~ $ echo $$
18526
现在从(在这种情况下0)一些ID父命名空间中的孩子命名空间让我们链接根:
arksnote linux-namespaces # newuidmap 18526 0 0 1
arksnote linux-namespaces # cat /proc/18526/uid_map
0 0 1
这里发生了什么给孩子命名空间:
[email protected] ~ $ id
uid=0(root) gid=65534(nobody) группы=65534(nobody)
您可以尝试一些其他映射,如newuidmap 18526 1 0 1
,并查看它应用于子用户名称空间,而不是父级用户名称空间。
例2:现在我们没有设置映射为root
:
arksnote linux-namespaces # newuidmap 18868 0 1000 1
arksnote linux-namespaces # cat /proc/18868/uid_map
0 1000 1
在这种情况下,用户root
留给不明的儿童用户的命名空间:
[email protected] ~ $ id
uid=65534(nobody) gid=65534(nobody) группы=65534(nobody)
什么你已经完成[[email protected] ~]$ newuidmap 7134 65534 5000 1
是父级命名空间中的userid 5000与子级命名空间中的uid 65534的关联,但该进程仍然运行为root
。它仅显示为65534,因为此值用于任何未知ID:
函数getuid(),getgid()返回没有映射的uids/gids的/proc/sys/kernel/overflowgid
的值。该值对应于没有任何系统权限的特殊用户:nobody
,如上面输出中的uid/gid中所示。
请参阅user_namespaces(7)中的Unmapped user and group IDs
。
非常完整和有用的答案! – catanman