【问题标题】:Linux User NameSpacesLinux 用户命名空间
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 谢谢。这是否意味着进程不能映射到主机上存在的任意用户 ID。即进行映射的过程只能映射到拥有它的用户ID? @Rachid K
  • 用户可以将自己映射到子命名空间中的任何用户。要添加其他映射,您需要使用所谓的 setuid 助手,例如 newuidmap 和 newgidmap。
  • @MichaelMwangi:不是这个意思。您为HostID: 1000 添加了一个条目,这不是您在使用 sudo(即以 root 身份)运行时的 UID。为 HostID: 0 添加另一个条目,或者(可能更好)在运行命令之前将权限降回 1000。
  • 感谢您的建议。让我从那个角度再看一遍@RachidK。
猜你喜欢
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多