2017-08-31 361 views
0

我试图通过试验unsharenewuidmap命令来更好地理解用户命名空间。取消共享用户命名空间并使用newuidmap设置uid映射

这是我跑的命令:

[[email protected] ~]$ ls -l /usr/bin/newuidmap 
-rwsr-xr-x 1 root root 32944 May 16 19:37 /usr/bin/newuidmap 
[[email protected] ~]$ unshare -U bash namespace 
[[email protected] ~]$ echo $$ 
7134 
[[email protected] ~]$ newuidmap 7134 65534 5000 1 
newuidmap: write to uid_map failed: Operation not permitted 

的/ etc/subuid:

nobody:5000:1 
root:5000:1 

任何想法,这是为什么失败?

我又试图从父命名空间中的相同PID运行newuidmap命令和它似乎工作:

[[email protected] ~]$ newuidmap 7134 65534 5000 1 
[[email protected] ~]$ cat /proc/7134/uid_map 
65534  5000   1 

但是,当我在新的命名空间中运行的过程它似乎仍然是运行根代替UID 5000:

[[email protected] ~]$ exec sleep 20 

从另一个壳:

[[email protected] ~]$ ps aux | grep 7134 
root  7134 0.0 0.0 7292 708 pts/2 S+ 02:07 0:00 sleep 20 

我错过了什么?

回答

1

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

+0

非常完整和有用的答案! – catanman

相关问题