используя бит SUID для сброса привилегий

Итак, это описание системы, над которой я работаю:

  • «менеджер» запускает все остальные приложения.
  • Приложение-менеджер запускается как пользователь root .
  • поэтому теперь любой процесс, который он порождает, также наследует привилегии пользователя root .

Третий момент явно делает мое приложение (назовем его «игроком») угрозой безопасности, поэтому одним из решений было бы создание отдельного пользователя и группы, например «рабочий», а затем порождать процесс «игрока» в качестве этого пользователя.

Конкретная реализация заключается в следующем:

  • chown the binary (player.out) worker пользователю и группе chown worker:worker player.out
  • установите бит SUID на нем с помощью chmod a+s player.out .
    • это гарантирует, что процесс начинается с (по крайней мере), его EUID устанавливается на «рабочий».
  • внутри основного использования приложения setregid() и setreuid установить RUID на то же значение, что и EUID:

     if(setregid(getegid(), getegid()) != 0) {} if(setreuid(geteuid(), geteuid()) != 0) {} 

Мой вопрос состоит из двух частей:

  1. Процессы с набором бит SUID обычно принадлежат root и называются setuid-приложениями для обозначения (возможно) того, что их разрешения повышаются до пользователя root независимо от того, какой пользователь вызывается программой.
    • есть ли какое-либо специальное имя для двоичных файлов, которые используют бит SUID для автоматического удаления привилегий?
  2. Есть ли другой, лучший способ гарантировать, что приложение «игрока» опустится?

Изменить : я должен уточнить, что у меня нет контроля над процессом «manager», который порождает другие процессы. У меня есть только контроль над моим player приложением.

  • Разрешения SUID - что правильно?
  • установите umask (разрешения) аналогично setgid в каталоге
  • Как PAM проверяет пароль пользователя в непривилегированных процессах?
  • используя Set uid для запуска корневой команды от пользователя без полномочий root
  • Set-uid исполняемый и результирующий пользователь процесса
  • Как работает sudo (помимо setuid)?
  • корневая программа с битом setuid
  • Как заставить пользователей устанавливать списки управления доступом в каталогах, которыми они не владеют?
  • 2 Solutions collect form web for “используя бит SUID для сброса привилегий”

    1. Когда вы правильно указываете бит SUID, устанавливает действительный идентификатор пользователя нового процесса владельцу исполняемого файла программы. Нет концепции повышения или понижения привилегий. Часто пользователь, которому «доверяет», является root, но он может так же законно быть любым другим и на самом деле не изменяет концепцию SUID, когда вы выбираете другой, за исключением того, что некоторые пользователи имеют доступ к определенным ресурсам. Однако пользователь root немного особенный, а справочная страница для setuid, объясняет тонкие различия. Я не думаю, что есть специальное имя для перехода на пользователя, не являющегося пользователем root, и я никогда не ассоциировал значение suid в привилегиях, просто меняя пользователя.

    2. Поскольку вы сами разрабатываете мастер, который работает от имени пользователя root, он может быть настроен для любого пользователя после форкирования, но перед тем, как выполнить новый процесс, я не вижу, что этот suid бит должен использоваться для исполняемого файла вообще, и, если это не так, , тогда, если какой-либо старый пользователь запустил плеер, поскольку исполняемый файл не является suid, они не смогут запустить его правильно, поскольку setuid завершится с ошибкой, если они не были root. Для меня это кажется лучшей защитой, чем использование битов suid в исполняемых файлах.

    — edit 1

    Таким образом, ваш менеджер (работает как реальный и эффективный uid = 0) запускает игрока, а ваш код / ​​управляющий игрок (не менеджер). Если вы ничего не делаете, то игрок будет работать с реальным + эффективным uid = 0, и вы хотите предотвратить это.

    Вы могли бы просто переключить uid в плеер, никаких бит SUID на проигрывателе, не нужно.

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

    Linux и Unix - лучшая ОС в мире.