我期望
uid=0(root) gid=0(root) groups=0(root)
是两者的输出
$ rootlesskit id
$ unshare -U bash -c 'newuidmap $$ 0 '"$(id -u)"' 1; id'
然而有点更详细的-x
命令
$ unshare -U bash -xc 'newuidmap $$ 0 '"$(id -u)"' 1; id'
产量不变
+ newuidmap 41372 0 1000 1
newuidmap: uid range [0-1) -> [1000-1001) not allowed
+ id
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
为什么认为newuidmap
将用户映射uid
到0
新的用户命名空间是不允许的?
我对其中包含的信息的理解男人 7 用户命名空间是任何用户(假设CONFIG_USER_NS_UNPRIVILEGED
已配置)都可以执行unshare
orclone
来创建新的用户命名空间(设置标志CLONE_NEWUSER
)。
现在我现在的主要“附加值”newuidmap
是映射指定的范围,/etc/subuid
但是,我的strace
工作rootlesskit
显示:
[pid 35921] execve("/usr/bin/newuidmap", ["newuidmap", "35909", "0", "1000", "1", "1", "200000", "65536"], 0xc000002480 /* 44 vars */ <unfinished ...>
[....]
[pid 35921] openat(3, "uid_map", O_WRONLY) = 5
[pid 35921] write(5, "0 1000 1\n1 200000 65536\n", 24) = 24
最终
当然,即使没有,也完全可以进行映射newuidmap
[user1@host tmp]$ cat > unshare.c << EOF
> #define _GNU_SOURCE
#include <sched.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int fd_uidmap;
char mapping[255];
sprintf(mapping,"0 %ld 1\n",(unsigned int) geteuid());
if (unshare(CLONE_NEWUSER) == -1)
{
puts("error\n");
exit(1);
}
fd_uidmap = open("/proc/self/uid_map",O_RDWR,NULL);
write(fd_uidmap,mapping,strlen(mapping));
close(fd_uidmap);
execvp(argv[1], argv+1);
return 0;
}
EOF
[user1@host tmp]$ gcc unshare.c -o unshare
[user1@host tmp]$ ./unshare id
uid=0(root) gid=65534(nobody) groups=65534(nobody)