Что такое пространства имен Linux и для чего они используются? — CloudSavvy ИТ

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

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

Что такое пространства имен?

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

Один контейнер не должен иметь возможность получить контроль над ресурсами другого, потому что, если этот контейнер затем скомпрометирован, это может поставить под угрозу всю систему. Этот метод атаки похож на то, как ошибка CPU Meltdown работает; разные потоки процессора должны быть изолированы друг от друга. Точно так же процессы, запущенные в разных виртуальных системах (контейнерах), должны быть изолированы от других контейнеров.

Пространства имен достигают этой изоляции на уровне ядра. Подобно тому, как работает приложение chroot, которое блокирует процесс в другом корневом каталоге, пространства имен разделяют другие аспекты системы. Доступно семь пространств имен:

  • Mount, или mnt. Очень похоже на chroot, пространство имен Mount виртуально разделяет файловую систему. Процессы, работающие в отдельных пространствах имен монтирования, не могут получить доступ к файлам за пределами своей точки монтирования. Поскольку это делается на уровне ядра, это намного безопаснее, чем изменение корневого каталога с помощью chroot.
  • Обработать, или pid. В Linux первые процессы появляются как потомки PID 1, который формирует корень дерева процессов. Пространство имен процесса отсекает ветвь дерева PID и не разрешает доступ дальше по ветке. Процессы в дочерних пространствах имен на самом деле будут иметь несколько PID — первый представляет глобальный PID, используемый основной системой, а второй PID представляет PID в дереве дочерних процессов, которое будет перезапущено с 1.
  • Межпроцессного взаимодействия, или ipc. Это пространство имен контролирует, могут ли процессы напрямую общаться друг с другом.
  • Сеть, или net. Это пространство имен управляет тем, какие сетевые устройства может видеть процесс. Однако при этом ничего не настраивается автоматически — вам все равно придется создавать виртуальные сетевые устройства и управлять соединением между глобальными сетевыми интерфейсами и дочерними сетевыми интерфейсами. Программное обеспечение для контейнеризации, такое как Docker, уже осознало это и может управлять сетью за вас.
  • Пользователь. Это пространство имен позволяет процессу иметь «виртуальный корень» внутри своего собственного пространства имен, не имея фактического корневого доступа к родительской системе. Он также разделяет информацию UID и GID, поэтому дочерние пространства имен могут иметь свои собственные пользовательские конфигурации.
  • UTS. Это пространство имен контролирует информацию об имени хоста и домене и позволяет процессам думать, что они работают на серверах с разными именами.
  • Cgroup — еще одна функция ядра, очень похожая на пространства имен. Cgroups позволяют системе определять ограничения ресурсов (ЦП, память, дисковое пространство, сетевой трафик и т. Д.) Для группы процессов. Это полезная функция для контейнерных приложений, но она не выполняет никакой «изоляции информации», как это сделали бы пространства имен. В пространство имен cgroup это отдельная вещь, и она только контролирует, какие контрольные группы может видеть процесс, и не назначает его определенной контрольной группе.

По умолчанию любой процесс, который вы запускаете, использует глобальные пространства имен, и большинство процессов в вашей системе тоже, если не указано иное.

Работа с пространствами имен

Вы можете использовать lsns command (ls-namespaces) для просмотра текущих пространств имен, которые активны в вашей системе. Эту команду нужно запускать от имени пользователя root, иначе список может быть неполным.

Используйте команду lsns (ls-namespaces) для просмотра текущих пространств имен

Выше lsns вывод из новой установки Ubuntu. Каждое пространство имен указано вместе с идентификатором процесса, пользователем и командой, создавшей его. Семь пространств имен порождены /sbin/init с PID 1 — это семь глобальных пространств имен. Единственные другие пространства имен mnt пространства имен для системных демонов, а также Canonical Livepatch служба.

Если бы вы работали с контейнерами, этот список был бы намного длиннее. Вы можете вывести этот список в формате JSON с помощью -J flag, который гораздо проще использовать с языком сценариев.

Вы можете изменить свое текущее пространство имен с помощью nsenter утилита. Эта команда позволяет вам «войти» в пространство имен другого процесса, обычно в целях отладки. Фактически он может запускать любую команду в этом пространстве имен, но по умолчанию он просто пытается загрузить оболочку (/bin/bash обычно).

Вы указываете идентификатор процесса, а затем каждое пространство имен, которое хотите ввести:

sudo nsenter -t PID --mount --net --pid  //etc.

Например, при попытке ввести пространство имен монтирования для kdevtmpfs загрузит вас в это пространство имен, но впоследствии потерпит неудачу, потому что не может найти /bin/bash, что на самом деле означает, что он сработал, потому что видимый корневой каталог был изменен.

Попытка ввести пространство имен монтирования для kdevtmpfs загружает вас в это пространство имен, но впоследствии терпит неудачу, потому что не может найти / bin / bash

Если ваш ребенок mnt пространство имен включено /bin/bash, вы можете войти в него и загрузить оболочку. Это можно сделать вручную, но через привязать крепления, который может управлять деревом каталогов и связывать файлы между mnt пространства имен. Это может привести к некоторым интересным вариантам использования, например к созданию двух процессов читать разное содержимое из одного файла.

Чтобы создать новые пространства имен, вам необходимо выполнить ответвление от существующего (обычно глобального) и указать, какие пространства имен вы хотите изменить. Это делается с помощью unshare command, которая запускает команду с новым пространством имен, «не имеющим общего доступа» от мастера.

Чтобы отменить совместное использование пространства имен хоста, используйте:

sudo unshare -u command

Если команда оставлена ​​пустой, unshare по умолчанию запускает bash. Это создает новое пространство имен, которое будет отображаться в lsnsвывод:

Если команда пуста, по умолчанию unshare запускает bash.

Терминальный мультиплексор screen здесь используется для того, чтобы bash работал в фоновом режиме, иначе пространство имен исчезнет при закрытии процесса.

Если вы не занимаетесь программированием на очень низком уровне, вам, вероятно, не придется самостоятельно трогать пространства имен. Программы контейнеризации, такие как Docker, будут управлять деталями за вас, и в большинстве случаев, когда вам нужна изоляция процесса, вы должны просто использовать существующий инструмент. Тем не менее, важно понимать, как пространства имен работают в контексте контейнеризации, особенно если вы выполняете низкоуровневую настройку своих контейнеров Docker или выполняете отладку вручную.

Похожие записи

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

Ваш адрес email не будет опубликован.