Если вы посмотрите на исполняемый файл sudo
:
$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun 3 2011 /usr/bin/sudo
Вы заметите, что он несет биты разрешения ---s--x--x
. Они могут быть разбиты следующим образом:
-|--s|--x|--x
- - first dash denotes if a directory or a file ("d" = dir, "-" = file)
--s - only the setuid bit is enabled for user who owns file
--x - only the group execute bit is enabled
--x - only the other execute bit is enabled
Поэтому, когда в программе активирован бит setuid (также называемый SUID), это означает, что когда кто-то запускает эту программу, она запускается с учетными данными пользователя, которому принадлежит файл, иначе. корень в этом случае.
пример
Если я запускаю следующую команду от имени пользователя saml:
$ whoami
saml
$ sudo su -
[sudo] password for saml:
Вы заметите, что выполнение sudo
фактически выполняется от имени пользователя root:
$ ps -eaf|grep sudo
root 20399 2353 0 05:07 pts/13 00:00:00 sudo su -
механизм setuid
Если вам интересно, как работает SUID, взгляните на man setuid
. Вот выдержка из справочной страницы, которая объясняет это лучше, чем я мог:
setuid () устанавливает эффективный идентификатор пользователя вызывающего процесса. Если эффективный UID вызывающего абонента является пользователем root, также устанавливаются реальный UID и сохраненный set-user-ID. В Linux setuid () реализован как версия POSIX с функцией _POSIX_SAVED_IDS. Это позволяет программе set-user-ID (кроме root) отбросить все свои пользовательские привилегии, выполнить некоторую непривилегированную работу и затем повторно безопасно включить исходный эффективный ID пользователя.
Если пользователь является пользователем root или программа настроена как user-ID-root, необходимо соблюдать особую осторожность. Функция setuid () проверяет эффективный идентификатор пользователя вызывающей стороны, и, если это суперпользователь, все идентификаторы пользователя, связанные с процессом, устанавливаются в uid. После того, как это произошло, программа не может восстановить привилегии root.
Ключевой концепцией здесь является то, что программы имеют реальный идентификатор пользователя (UID) и эффективный (EUID). Setuid устанавливает эффективный идентификатор пользователя (EUID), когда этот бит включен.
Таким образом, с точки зрения ядра известно, что в нашем примере saml
он все еще является первоначальным владельцем (UID), но EUID был установлен с тем, кто является владельцем исполняемого файла.
setgid
Я должен также упомянуть, что когда мы разбиваем разрешения для команды sudo, вторая группа битов предназначена для групповых разрешений. Групповые биты также имеют нечто похожее на setuid, называемое set group id (aka. Setgid, SGID). Это делает то же самое, что и SUID, за исключением того, что он запускает процесс с учетными данными группы вместо учетных данных владельца.
Рекомендации
sudo -s
вместо,sudo su
потому что это бесполезное использованиеsu
. :)Настоящий
sudo
бинарный файл - это setuid root , и вы не можете просто создать файлы, которые установлены таким образом.источник
Чтобы ответить на часть о системных вызовах, которых, кажется, никто не трогал, одним из важных системных вызовов является либо setresuid (), либо setresgid (). Я уверен, что есть и другие, но эти 2 кажутся довольно специфичными для setuid / sudo.
источник