Linux用户命名空间

问题描述

我正在Linux上使用Go尝试用户名称空间。我不知道的事情是,尽管在创建名称空间时设置了uid和gid映射,但是当我使用 sudo 启动二进制文件时,它仍然标识为 nobody 用户,但是当我使用普通用户启动它时,一切正常。供参考,请参见下面的代码

...
cmd := exec.Command("/bin/sh")
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin
    cmd.Stderr = os.Stderr
    cmd.SysProcAttr = &syscall.SysProcAttr{
        Cloneflags: syscall.CLONE_NEWUSER,UidMappings: []syscall.SysProcIDMap{
            {
                ContainerID: 0,HostID:      1000,Size:        1,},GidMappings: []syscall.SysProcIDMap{
            {
                ContainerID: 0,}
    cmd.Run()

....
...

从主机上,我可以确认用户和组映射确实成功。当前的pid是 87751

sudo cat /proc/87751/uid_map
         0       1000          1
sudo cat /proc/87751/gid_map
         0       1000          1

但是当我在构建后运行二进制文件

go build -o user_n
sudo ./user_n
sh-5.0$ whoami 
nobody
sh-5.0$ id
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

但是当我使用普通用户运行二进制文件时,它可以按预期运行

./user_n
sh-5.0# whoami
root
sh-5.0# id
uid=0(root) gid=0(root) groups=0(root),65534(nobody) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

使用普通用户运行二进制文件是一种选择,我想知道为什么使用 sudo 运行不能给出预期的结果。任何指针将不胜感激。

更多信息

Fedora 31
Kernel 5.3.11-100.fc29.x86_64
go version go1.14.3 linux/amd64

解决方法

在第一种情况下,您以root用户(通过sudo)身份运行,该用户在子用户名称空间中未指定映射。因此,生成的“ nobody” ID。

在第二种情况下,您以用户ID 1000运行该程序,其映射为:1000成为子用户名称空间中的root。因此,生成的“根” ID。