【发布时间】:2021-02-01 06:33:16
【问题描述】:
我正在 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) 身份运行,在子用户命名空间中没有映射。因此,“nobody” id。在第二种情况下,您以 id 1000 运行程序,映射显示:1000 成为子用户命名空间中的根。
-
@RachidK.:可以作为答案发布吗?在我看来,它已经足够完整了。
-
@Ry-:我很好。我应该成功吗? (我在 StackOverflow 才 1 周大,我不知道所有规则)
-
@RachidK.:你不必这样做,但我不明白为什么不这样做!我会投票给它。 :)
标签: linux go linux-namespaces