Как проверить пространство имен пользователя с помощью системного вызова clone с флагом CLONE_NEWUSER

Тестирование образца из Containerization с помощью LXC для демонстрации пространства имен пользователя.

Предполагается печатать как выходные данные дочернего процесса в новом пространстве имен пользователя, так и выходные данные родительского процесса.

# ./user_namespace
UID outside the namespace is 0
GID outside the namespace is 0
UID inside the namespace is 65534
GID inside the namespace is 65534

Тем не менее, он показывает только родительские результаты.

UID outside the namespace is 1000
GID outside the namespace is 1000

Пожалуйста, помогите понять, почему дочерний процесс не печатает.

Код

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sched.h>
#include <signal.h>

static int childFunc(void *arg)
{
    printf("UID inside the namespace is %ld\n", (long)geteuid());
    printf("GID inside the namespace is %ld\n", (long)getegid());
}

static char child_stack[1024*1024];

int main(int argc, char *argv[])
{
    pid_t child_pid;

    /* child_pid = clone(childFunc, child_stack + (1024*1024), CLONE_NEWUSER, 0);*/

    child_pid = clone(&childFunc, child_stack + (1024*1024), CLONE_NEWUSER, 0);

    printf("UID outside the namespace is %ld\n", (long)geteuid());
    printf("GID outside the namespace is %ld\n", (long)getegid());
    waitpid(child_pid, NULL, 0);
    exit(EXIT_SUCCESS);
}

Среда

$ uname -r
3.10.0-693.21.1.el7.x86_64

$ cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
CPE_NAME="cpe:/o:centos:centos:7"

Рекомендации


Обновить

Согласно ответу от thejonny, он должен был включить пространство имен пользователя. Для RHEL/CentOS 7 Безопасно ли включать пространства имен пользователей в CentOS 7.4 и как это сделать?

По умолчанию новое ядро ​​7.4 ограничивает количество пространств имен пользователя до 0. Чтобы обойти это, увеличьте ограничение пространства имен пользователя:
echo 15000> / proc / sys / user / max_user_namespaces

1 ответ

Решение

Пространства имен непривилегированного пользователя, вероятно, отключены. Поскольку вы не проверяете возвращаемое значение cloneне заметишь Запуск через strace на моей системе печатает:

.... startup stuff ...
clone(child_stack=0x55b41f2a4070, flags=CLONE_NEWUSER) = -1 EPERM (Operation not permitted)
geteuid()                               = 1000
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0
brk(NULL)                               = 0x55b4200b8000
brk(0x55b4200d9000)                     = 0x55b4200d9000
write(1, "UID outside the namespace is 100"..., 34UID outside the namespace is 1000
) = 34
getegid()                               = 1000
write(1, "GID outside the namespace is 100"..., 34GID outside the namespace is 1000
) = 34
wait4(-1, NULL, 0, NULL)                = -1 ECHILD (No child processes)
exit_group(0)   = ?

Таким образом, клон и, следовательно, waitpid не работают, дочерний процесс отсутствует.

Смотрите здесь, чтобы включить привилегии пользователя: https://superuser.com/questions/1094597/enable-user-namespaces-in-debian-kernel

Другие вопросы по тегам