IT序号网

Linux 用户命名空间

jirigala 2025年05月04日 编程语言 269 0

我正在 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, 
                HostID:      1000, 
                Size:        1, 
            }, 
        }, 
    } 
    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),在子用户命名空间中没有为其指定映射。因此,产生的“无人”ID。
在第二种情况下,您以用户 ID 1000 运行程序,映射表示:1000 成为子用户命名空间中的根用户。因此,产生的“根”ID。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!