
Я пытаюсь найти правильную причину поставленного вопроса. Я понимаю, что:
sudo
необходимо прочитать/etc/sudoers
файл, который доступен для чтения только пользователю root, поэтому ему необходимо задать UID rootsu
собирается создать новую оболочку с другим реальным и эффективным UID и должен проверить пароль. Чтобы проверить пароль, ему нужно прочитать/etc/shadow
, поэтому ему нужно установить UID root. После проверки пароля ему нужно будет вызватьsetuid()
разветвленный процесс, и чтобы использовать произвольный аргумент UID, его родительский процесс должен иметь root в качестве эффективного UID, так что это также является еще одной причиной.
Верны ли вышеуказанные причины?
решение1
Ваши доводы в основном верны, но в обоих случаях ( su
и sudo
), основная причина, по которой им нужно работать как root, заключается в том, что им нужно иметь возможность изменять различные идентификаторы пользователей и групп текущего процесса. Это включает вызов таких функций, какsetreuid
, которые работают только для произвольных пользователей и групп, если вызывающий процесс запущен от имени пользователя root.
У обеих программ su
и sudo
есть другие функции, которые также требуют запуска от имени root, но они фактически являются второстепенными деталями по сравнению с вышеизложенным. Как вы упомянули, sudo
необходимо прочитать /etc/sudoers
; но тот факт, что последний доступен для чтения только root, не является жестким требованием. Обе программы могут использовать PAM для выполнения аутентификации, но они обычно также включают резервные варианты, которые требуют возможности прочитать /etc/shadow
, что также доступно для чтения только root. Список можно продолжать; но это не имеет особого значения, поскольку неизбежным фактом является то, что возможность изменять пользователей и/или группы предоставляется только root, поэтому su
и sudo
имеют setuid root.
Как работает внутренняя часть sudo?и связанные с этим вопросы дают дополнительную информацию.