Как получить разрешение sudo при использовании команды unshare

Что такое команда unshare и как она работает?

Команда unshare в Linux используется для создания новых пространств имен, что позволяет изолировать ресурсы, такие как пользовательские идентификаторы (UID) и группы (GID). Это полезно в различных сценариях, таких как контейнеризация, где необходимо контролировать доступ к ресурсам и изолировать процессы друг от друга.

Ошибки и неправильные ожидания при использовании sudo

Недавно я столкнулся с проблемой, когда, используя команду sudo unshare -Ur <dir>, которая выполнялась в каталоге, принадлежащем другому пользователю с разрешениями 700, возникала ошибка Permission denied. Это поставило под сомнение моё понимание работы sudo, так как до этого я думал, что оно предоставляет полные root-привилегии.

Фактически, несмотря на наличие привилегий root, попытка создать новое пространство имен UID приводит к изменениям в разрешениях доступа, что и является причиной ошибки. Если изменять разрешения каталога на 755, команда успешно выполняется.

Изоляция прав доступа в пространстве имен

Когда команда unshare вызывается с флагом -U, она создает новое пространство имен пользователя. Важно отметить, что корневой идентификатор внутри этого пространства имен уже не является тем же, что и корневой идентификатор в исходном пространстве имен. Механизм пространств имен подразумевает, что каждое пространство имеет свои собственные права доступа и привилегии.

Это значит, что даже если для нового пространства имен настроено соответствие UID 0 ⇒ UID 0, это не дает полного доступа к ресурсам, если права доступа к объектам не настроены соответствующим образом. Такие права, как CAP_DAC_OVERRIDE, которые позволяют обходить права на доступ к файлам, применяются в контексте того, как настроено пространство имен.

Усложнение управления правами доступа с пространствами имен

При наличии каталога с разрешением 0700 доступ к нему будет возможен только с использованием привилегий CAP_DAC_OVERRIDE. Поскольку владелец каталога не сопоставлен с новым пространством имен UID, эти привилегии становятся неэффективными. Чтобы решить проблему, необходимо правильно настроить соответствие UID и GID при запуске команды unshare.

Примерно так может выглядеть корректная команда для успешного маппинга:

sudo unshare -U -r --map-users=1000:2001:1 --map-groups=100:100:1 -R ~/foo

Этот подход гарантирует, что нужные UID и GID будут сопоставлены с текущим пространством имен, что позволит обойти ограничения.

Примеры вывода и их анализ

В ходе экспериментов с unshare натыкаюсь на ситуации, где доступны различные привилегии в зависимости от контекста выполнения команды. Например:

$ ls -l /root
ls: cannot open directory '/root': Permission denied
$ sudo ls -l /root
total 4
drwx------ 3 root root 4096 Dec 10 13:48 snap

Здесь, даже используя sudo, я не получаю доступ к содержимому каталога /root, что иллюстрирует, как изоляция прав доступа может создавать неожиданные сложности.

Заключение

Понимание работы с командами, такими как unshare, и взаимодействие с правами доступа в Linux — непростая задача. Важность точной настройки UID и GID в контексте пространств имен нельзя переоценить. Этот опыт научил меня, что привилегии root не всегда означают полный доступ к ресурсам системы и что работа с пространствами имен требует тщательного подхода к правам доступа и разрешениям.

Источник

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *