Демонстрация преимуществ uid_map для пользовательских пространств имен Linux?

Вопрос или проблема

Я впервые изучаю пользовательские пространства имен 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 65534
  • nobody@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. Понимание и правильное использование этих файлов позволяет создавать более безопасные и изолированные вычислительные среды, особенно в контексте современных практик контейнеризации и виртуализации.

Оцените материал
Добавить комментарий

Капча загружается...