Вопрос или проблема
Я впервые изучаю пользовательские пространства имен Linux. В данный момент я пытаюсь понять преимущества создания /proc/[PID]/uid_map
и /proc/[PID]/gid_map
. Похоже, что без этих файлов пользователь в дочернем пространстве имен все еще может изменять файлы, созданные пользователем в родительском пространстве имен. И все, что делают /proc/[PID]/uid_map
и /proc/[PID]/gid_map
, это заставляет команду ls
распознавать, кто владеет какими файлами. Я уверен, что неправильно понял преимущества файлов uid_map
и gid_map
, может кто-то исправить мое понимание с помощью примера?
Позвольте мне показать простые эксперименты, которые я проводил, что привело к моим вышеуказанным утверждениям, чтобы каждый мог увидеть, в каком состоянии находится моя голова сейчас.
Я открываю один терминал с ssh-соединением к своей рабочей области. Затем я выполнил эти команды, чтобы показать свою информацию о пользователе, попытаться создать текстовый файл из различных пространств имен, а затем проверить детали разрешений на файлы:
me@localhost:~$ id
uid=1000(me) gid=1000(me) groups=1000(me),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd)
me@localhost:~$
me@localhost:~$ cat 'hello' > test.txt
me@localhost:~$ unshare -U /bin/bash
nobody@localhost:~$
nobody@localhost:~$ id
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
nobody@localhost:~$
nobody@localhost:~$ ls -lh
-rw-rw-r-- 1 nobody nogroup 12 Dec 10 18:41 test.txt
nobody@localhost:~$
nobody@localhost:~$
nobody@localhost:~$ ls -lh /
total 2.1G
lrwxrwxrwx 1 nobody nogroup 7 Aug 10 2023 bin -> usr/bin
drwxr-xr-x 4 nobody nogroup 4.0K Dec 10 14:07 boot
...и так далее...
nobody@localhost:~$ cat 'world' >> test.txt
nobody@localhost:~$ cat test.txt
hello
world
nobody@localhost:~$ cat 'hello' > /test.txt # попытка записать в директорию, которая не принадлежит nobody@localhost или me@localhost
bash: /test.txt: Permission denied
Это научило меня нескольким вещам:
nobody@localhost
использует системный стандартный перепускной uid/gid 65534nobody@localhost
МОЖЕТ редактировать файлы, созданныеme@localhost
nobody@localhost
НЕ МОЖЕТ редактировать файлы, созданные пользователем root в ubuntu (т.е. системные файлы в директории/
)nobody@localhost
видит файлы, созданныеme@localhost
, и файлы, созданные пользователем root в ubuntu, какnobody@localhost
Далее я создал второе окно терминала с ssh-соединением к той же рабочей области, что и выше. Затем я выполнил эти команды, чтобы создать uid_map
и gid_map
:
me@localhost:~$ ps l | grep /bin/bash
0 1000 1585 1263 20 0 8792 5712 do_sel S+ pts/1 0:00 /bin/bash
# затем я беру 1585 из выше и делаю это
me@localhost:~$ sudo echo "0 1000 65335" | sudo tee /proc/1585/uid_map
me@localhost:~$ sudo echo "0 1000 65335" | sudo tee /proc/1585/gid_map
Затем я возвращаюсь к первому терминалу и выполняю эти команды, чтобы наблюдать за результатами, введенными uid_map
и gid_map
:
nobody@localhost:~$ id
uid=0(root) gid=0(root) groups=0(root),65534(nogroup)
nobody@localhost:~$
nobody@localhost:~$ ls -lh
-rw-rw-r-- 1 root root 12 Dec 10 18:41 test.txt
nobody@localhost:~$
nobody@localhost:~$ ls -lh /
total 2.1G
lrwxrwxrwx 1 nobody nogroup 7 Aug 10 2023 bin -> usr/bin
drwxr-xr-x 4 nobody nogroup 4.0K Dec 10 14:07 boot
...и так далее...
Это научило меня нескольким вещам:
nobody@localhost
теперь видит файлы, созданныеme@localhost
, как созданные пользователем с именем root (не путать с пользователем root системы ubuntu в родительском пространстве имен)nobody@localhost
продолжает видеть файлы, созданные пользователем root системы ubuntu, какnobody
.
Следовательно, является ли единственным преимуществом использования /proc/[pid]/uid_map
и /proc/[pid]/gid_map
возможность дочернему пространству имен лучше различать, кто владеет каким файлом при использовании команды ls
? uid_map
и gid_map
не semblent не обеспечивают разрешения на файлы, позволяя или запрещая редактирование файлов на основе владения файлами.
Ответ или решение
Вопрос о преимуществах использования uid_map
и gid_map
в Linux-namespace’ах пользователей действительно требует тщательного рассмотрения. Давайте разберемся, какую функцию выполняют эти механизмы и как они улучшают управление правами доступа к файлам в пределах пространств имен.
1. Основы пространств имен пользователей в Linux
Пространства имен пользователей (user namespaces) позволяют изолировать идентификаторы (UID) и группы (GID), что дает возможность запускать процессы с различными уровнями привилегий. Это особенно полезно в контексте контейнеризации, где приложение может требовать ограниченных прав, не имея доступа к ресурсам или пользователям других пространств имен.
2. Что такое uid_map
и gid_map
Файлы /proc/[PID]/uid_map
и /proc/[PID]/gid_map
позволяют маппить (сопоставлять) идентификаторы пользователей одного пространства имен с идентификаторами пользователей в родительском пространстве имен. Это означает, что идентификатор пользователя (например, 1000 для вашего пользователя) может быть представлен как идентификатор 0 (root) для процессов, исполняемых в дочернем пространстве имен, созданном с использованием unshare
.
3. Преимущества использования uid_map
и gid_map
3.1 Изоляция доступа к файлам
Основное преимущество заключается в предоставлении реальной изоляции и контроле доступа:
-
Управление правами доступа: Без
uid_map
иgid_map
, процессы в дочернем пространстве могут действовать под идентификаторомnobody
, и у них будет возможность изменять файлы, созданные в родительском пространстве. После настройки маппов, они будут видеть свои файлы с правильными идентификаторами и правами, тем самым ограничивая несанкционированный доступ. -
Настройка прав доступа для контейнеров: При использовании технологий контейнеризации (например, Docker), эти маппы служат для обеспечения безопасности — контейнеры могут запускаться с минимальными необходимыми привилегиями, что затрудняет выполнение злонамеренных действий.
3.2 Виртуализация и безопасность
Использование uid_map
и gid_map
позволяет создавать более безопасные системы:
-
Разграничение ресурсов: При правильной настройке пространства имен, даже если процесс в дочернем пространстве пытается изменить файл, принадлежащий пользователю в родительском пространстве, он не сможет этого сделать, так как система считает, что доступ осуществляется под другим UID/GID.
-
Недоступность системных файлов: Ваша демонстрация показала, что
nobody
не может редактировать системные файлы. Использованиеuid_map
увеличивает уровень защиты, так как процессы в дочернем пространстве, у которых есть привилегии, могут быть безопасно изолированы от системных привилегий.
4. Примеры использования
Приведу пример, чтобы иллюстрировать преимущества:
Допустим, у вас есть веб-сервер, работающий с правами nobody
в пространстве имен, который должен обрабатывать запрашиваемые пользователем данные. После маппинга uid_map
, сервер сможет запускаться с UID, имеющим достаточные права на доступ к своим файлам, но без возможности воздействия на системные файлы или файлы других пользователей. Это позволяет минимизировать потенциальные уязвимости.
5. Заключение
Таким образом, uid_map
и gid_map
не просто позволяют лучше понимать, кто владеет конкретными файлами. Эти механизмы являются важными инструментами для обеспечения безопасности, изоляции процессов и управления доступом в Linux. Понимание и правильное использование этих файлов позволяет создавать более безопасные и изолированные вычислительные среды, особенно в контексте современных практик контейнеризации и виртуализации.