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