stringtranslate.com

Пространства имен Linux

Пространства имен — это функция ядра Linux , которая разделяет ресурсы ядра таким образом, что один набор процессов видит один набор ресурсов, в то время как другой набор процессов видит другой набор ресурсов. Функция работает, имея одно и то же пространство имен для набора ресурсов и процессов, но эти пространства имен ссылаются на разные ресурсы. Ресурсы могут существовать в нескольких пространствах имен. Примерами таких ресурсов являются идентификаторы процессов, имена хостов, идентификаторы пользователей, имена файлов, некоторые имена, связанные с сетевым доступом, и межпроцессное взаимодействие .

Пространства имен являются обязательным аспектом функционирования контейнеров в Linux. Термин «пространство имен» часто используется для обозначения определенного типа пространства имен (например, идентификатора процесса), а также для определенного пространства имен. [1]

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

История

Пространства имен Linux были вдохновлены более широкой функциональностью пространств имен, широко используемой в Plan 9 от Bell Labs . [2] Пространства имен Linux возникли в 2002 году в ядре 2.4.19 с работой над типом пространства имен mount. Дополнительные пространства имен были добавлены, начиная с 2006 года [3] и продолжались в будущем.

Адекватная функциональность поддержки контейнеров была завершена в версии ядра 3.8 [4] [5] с введением пространств имен пользователя. [6]

Виды пространств имен

Начиная с версии ядра 5.6, существует 8 видов пространств имен. Функциональность пространств имен одинакова для всех видов: каждый процесс связан с пространством имен и может видеть или использовать только ресурсы, связанные с этим пространством имен, и дочерние пространства имен, где это применимо. Таким образом, каждый процесс (или его группа процессов) может иметь уникальный вид на ресурсы. Какой ресурс изолирован, зависит от вида пространства имен, созданного для данной группы процессов.

Гора (mnt)

Пространства имен монтирования управляют точками монтирования . После создания монтирования из текущего пространства имен монтирования копируются в новое пространство имен, но созданные впоследствии точки монтирования не распространяются между пространствами имен (используя общие поддеревья, можно распространять точки монтирования между пространствами имен [7] ).

Флаг клонирования, используемый для создания нового пространства имен этого типа, — CLONE_NEWNS — сокращение от "NEW NameSpace". Этот термин не является описательным (он не говорит, какой тип пространства имен должен быть создан), поскольку пространства имен монтирования были первым типом пространства имен, и проектировщики не предполагали, что будут какие-либо другие.

Идентификатор процесса (pid)

Пространство имен PID предоставляет процессам независимый набор идентификаторов процессов (PID) из других пространств имен. Пространства имен PID являются вложенными, то есть при создании нового процесса у него будет PID для каждого пространства имен от текущего пространства имен до начального пространства имен PID. Следовательно, начальное пространство имен PID может видеть все процессы, хотя и с другими PID, чем те, с которыми будут видеть процессы другие пространства имен.

Первому процессу, созданному в пространстве имен PID, назначается номер идентификатора процесса 1, и он получает большую часть той же специальной обработки, что и обычный процесс init , в частности, к нему присоединяются осиротевшие процессы в пространстве имен. Это также означает, что завершение этого процесса PID 1 немедленно завершит все процессы в его пространстве имен PID и любых потомков. [8]

Сеть (нетто)

Сетевые пространства имен виртуализируют сетевой стек . При создании сетевое пространство имен содержит только интерфейс обратной связи . Каждый сетевой интерфейс (физический или виртуальный) присутствует ровно в 1 пространстве имен и может перемещаться между пространствами имен.

Каждое пространство имен будет иметь частный набор IP-адресов , собственную таблицу маршрутизации , список сокетов , таблицу отслеживания соединений, брандмауэр и другие сетевые ресурсы.

Уничтожение сетевого пространства имен уничтожает все виртуальные интерфейсы внутри него и перемещает все физические интерфейсы внутри него обратно в исходное сетевое пространство имен.

Межпроцессное взаимодействие (ipc)

Пространства имен IPC изолируют процессы от межпроцессного взаимодействия в стиле SysV . Это не позволяет процессам в разных пространствах имен IPC использовать, например, семейство функций SHM для установления диапазона общей памяти между двумя процессами. Вместо этого каждый процесс сможет использовать одни и те же идентификаторы для области общей памяти и создавать две такие различные области.

ОТС

Пространства имен UTS (UNIX Time-Sharing ) позволяют одной системе иметь разные имена хостов и доменов для разных процессов. Когда процесс создает новое пространство имен UTS, имя хоста и домен нового пространства имен UTS копируются из соответствующих значений в пространстве имен UTS вызывающего. [9]

Идентификатор пользователя (пользователь)

Пространства имен пользователей — это функция, которая обеспечивает как изоляцию привилегий, так и сегрегацию идентификации пользователей по нескольким наборам процессов, доступная с версии ядра 3.8. [10] С помощью администратора можно создать контейнер с кажущимися административными правами, фактически не предоставляя повышенных привилегий пользовательским процессам. Как и пространство имен PID, пространства имен пользователей являются вложенными, и каждое новое пространство имен пользователей считается дочерним элементом пространства имен пользователей, которое его создало.

Пространство имен пользователя содержит таблицу сопоставления, преобразующую идентификаторы пользователей с точки зрения контейнера в точку зрения системы. Это позволяет, например, пользователю root иметь идентификатор пользователя 0 в контейнере, но фактически рассматривается системой как идентификатор пользователя 1 400 000 для проверки права собственности. Похожая таблица используется для сопоставления идентификаторов групп и проверки права собственности.

Для облегчения изоляции привилегий административных действий каждый тип пространства имен считается принадлежащим пользовательскому пространству имен на основе активного пользовательского пространства имен на момент создания. Пользователю с административными привилегиями в соответствующем пользовательском пространстве имен будет разрешено выполнять административные действия в пределах этого другого типа пространства имен. Например, если у процесса есть административное разрешение на изменение IP-адреса сетевого интерфейса, он может это сделать, пока его собственное пользовательское пространство имен совпадает с (или является предком) пользовательского пространства имен, которому принадлежит сетевое пространство имен. Следовательно, исходное пользовательское пространство имен имеет административный контроль над всеми типами пространств имен в системе. [11]

Пространство имен контрольной группы (cgroup)

Тип пространства имен cgroup скрывает идентификацию контрольной группы , членом которой является процесс. Процесс в таком пространстве имен, проверяющий, к какой контрольной группе относится любой процесс, увидит путь, который на самом деле относится к контрольной группе, установленной во время создания, скрывая его истинную позицию и идентификацию контрольной группы. Этот тип пространства имен существует с марта 2016 года в Linux 4.6. [12] [13]

Пространство имен времени

Пространство имен time позволяет процессам видеть различные системные времена аналогично пространству имен UTS. Оно было предложено в 2018 году и выпущено в Linux 5.6, который был выпущен в марте 2020 года. [14]

Предлагаемые пространства имен

пространство имен syslog

Пространство имен syslog было предложено Руи Сяном, инженером Huawei , но не было объединено с ядром Linux. [15] systemd реализовал похожую функцию под названием «пространство имен журнала» в феврале 2020 года. [16]

Подробности реализации

Ядро назначает каждому процессу символическую ссылку на тип пространства имен в /proc/<pid>/ns/. Номер инода, на который указывает эта символическая ссылка, одинаков для каждого процесса в этом пространстве имен. Это уникально идентифицирует каждое пространство имен по номеру инода, на который указывает одна из его символических ссылок.

Чтение символической ссылки через readlink возвращает строку, содержащую имя типа пространства имен и номер инода пространства имен.

Системные вызовы

Три системных вызова могут напрямую манипулировать пространствами имен:

Разрушение

Если на пространство имен больше нет ссылок, оно будет удалено, обработка содержащегося ресурса зависит от типа пространства имен. На пространства имен можно ссылаться тремя способами:

  1. Процессом, принадлежащим пространству имен
  2. С помощью открытого файлового дескриптора к файлу пространства имен ( /proc/<pid>/ns/<ns-kind>)
  3. Связанное монтирование файла пространства имен ( /proc/<pid>/ns/<ns-kind>)

Принятие

Различные контейнерные программы используют пространства имен Linux в сочетании с контрольными группами для изоляции своих процессов, включая Docker [17] и LXC .

Другие приложения, такие как Google Chrome, используют пространства имен для изоляции собственных процессов, которые подвергаются риску атак в Интернете. [18]

Также есть unshare wrapper в util-linux . Пример его использования:

ОБОЛОЧКА = /bin/sh  unshare  --map-root-user  --fork  --pid  chroot " ${ chrootdir } " " $@ "  

Ссылки

  1. ^ Хеддингс, Энтони (2020-09-02). «Что такое пространства имен Linux и для чего они используются?». How-To Geek . Получено 2024-08-22 .
  2. ^ "Использование пространств имен в Plan 9". 1992. Архивировано из оригинала 2014-09-06 . Получено 2016-03-24 .
  3. ^ "Исходное дерево ядра Linux". kernel.org. 2016-10-02.
  4. ^ "LKML: Линус Торвальдс: Linux 3.8". lkml.org . Получено 2024-03-22 .
  5. ^ "Linux_3.8 - Linux Kernel Newbies". kernelnewbies.org . Получено 2024-03-22 .
  6. ^ «Пространства имен в действии, часть 5: Пользовательские пространства имен [LWN.net]».
  7. ^ "Documentation/filesystems/sharedsubtree.txt". 2016-02-25 . Получено 2017-03-06 .
  8. ^ "Пространства имен в действии, часть 3: Пространства имен PID". lwn.net. 2013-01-16.
  9. ^ "uts_namespaces(7) - Страница руководства Linux". www.man7.org . Получено 2021-02-16 .
  10. ^ «Пространства имен в действии, часть 5: Пользовательские пространства имен [LWN.net]».
  11. ^ "Пространства имен в действии, часть 5: Пользовательские пространства имен". lwn.net. 2013-02-27.
  12. ^ Хео, Теджун (18.03.2016). "[GIT PULL] Поддержка пространства имен cgroup для v4.6-rc1". lkml (Список рассылки).
  13. ^ Торвальдс, Линус (2016-03-26). "Linux 4.6-rc1". lkml (Список рассылки).
  14. ^ «Наконец-то пришло время: поддержка пространства имен Time добавлена ​​в ядро ​​Linux 5.6 — Phoronix». www.phoronix.com . Получено 30.03.2020 .
  15. ^ "Добавить поддержку пространства имен для syslog [LWN.net]". lwn.net . Получено 2022-07-11 .
  16. ^ "журнал: добавление концепции "пространств имен журнала" от poettering · Запрос на извлечение № 14178 · systemd/systemd". GitHub . Получено 11 июля 2022 г.
  17. ^ "Docker security". docker.com . Получено 2016-03-24 .
  18. ^ "Chromium Linux Sandboxing" . Получено 2019-12-19 .

Внешние ссылки