2017-08-31 362 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

相關問題