Пространства имен пользователей Linux

Я экспериментирую с пространствами имен пользователей, используя Go в Linux. Я не могу понять, что, хотя я устанавливаю сопоставления uid и gid при создании пространства имен, оно все равно идентифицируется как пользователь nobody, когда я запускаю двоичный файл с помощью sudo, но когда я запускаю его под обычным пользователем, все работает нормально. Для справки см. мой код ниже

...
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()

....
...

От хоста я могу подтвердить, что сопоставление пользователей и групп действительно прошло успешно. Текущий идентификатор процесса: 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

person Michael Mwangi    schedule 18.10.2020    source источник
comment
В первом случае вы работаете как пользователь root (sudo), для которого нет сопоставления в пространстве имен дочернего пользователя. Следовательно, никто не идентифицировал. Во втором случае вы запускаете программу с идентификатором 1000, для которого сопоставление говорит: 1000 становится корнем в пространстве имен дочернего пользователя.   -  person Rachid K.    schedule 18.10.2020
comment
@RachidK.: Можно ли публиковать в качестве ответа? Он выглядит достаточно полным для меня.   -  person Ry-♦    schedule 19.10.2020
comment
@Ry-: я в порядке. Я должен успеть? (мне всего 1 неделя в StackOverflow, я не знаю всех правил)   -  person Rachid K.    schedule 19.10.2020
comment
@RachidK.: Не обязательно, но почему бы и нет! Я бы проголосовал за это. :)   -  person Ry-♦    schedule 19.10.2020


Ответы (1)


В первом случае вы работаете как пользователь root (через sudo), для которого не указано сопоставление в пространстве имен дочернего пользователя. Следовательно, полученный никто не идентифицировал.

Во втором случае вы запускаете программу как пользователь с идентификатором 1000, для которого сопоставление говорит: 1000 становится root в пространстве имен дочернего пользователя. Следовательно, полученный корневой идентификатор.

person Rachid K.    schedule 19.10.2020
comment
Спасибо . Значит ли это, что процесс не может выполнять сопоставление с любым произвольным идентификатором пользователя, существующим на хосте? то есть процесс, выполняющий сопоставление, может сопоставляться только с идентификатором пользователя, которому он принадлежит? @Рашид К. - person Michael Mwangi; 19.10.2020
comment
Пользователь может сопоставить себя с любым пользователем в дочернем пространстве имен. Чтобы добавить другие сопоставления, вам нужно использовать так называемые помощники setuid, такие как newuidmap и newgidmap. - person Rachid K.; 19.10.2020
comment
@MichaelMwangi: Это не то, что это значит. Вы добавили запись для HostID: 1000, которая не является вашим UID при работе с sudo (то есть как root). Добавьте еще одну запись для HostID: 0 или (вероятно, лучше) уменьшите привилегии до 1000 перед запуском команды. - person Ry-♦; 19.10.2020
comment
Спасибо за предложения. Позвольте мне еще раз взглянуть на это под этим углом @RachidK. - person Michael Mwangi; 20.10.2020