Попробую объяснить пошагово на нескольких примерах.
Краткая предыстория
Каждый процесс имеет свои «полномочия процесса» , который включает в себя такие атрибуты , как PID
, в PPID
, PGID
, session ID
а также реальные и эффективных идентификаторы пользователей и групп:
RUID
, EUID
, RGID
, EGID
.
Мы сосредоточимся на них.
Часть 1. Общие сведения о UID и GID
Теперь я войду в оболочку со своими учетными данными и запустил:
$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash
Вы можете увидеть мое имя журнала (rotem), UID и GID, которые равны 1000, и другие детали, такие как оболочка, в которую я вошел.
Часть 2: Общие сведения о RUID и RGID
Каждый процесс имеет владельца и принадлежит к группе .
В нашей оболочке каждый процесс, который мы сейчас запустим, унаследует привилегии моей учетной записи и будет работать с теми же UID и GID.
Давайте запустим простую команду, чтобы проверить это:
$ sleep 10 & ps aux | grep 'sleep'
И проверьте UID и GID процесса:
$ stat -c "%u %g" /proc/$pid/
1000 1000
Это реальный идентификатор пользователя ( RUID
) и реальный идентификатор группы ( RGID
) процесса .
(*) Проверьте другие параметры, чтобы просмотреть UID и GID, а также способы их получения в виде однострочного файла .
На данный момент, принять тот факт , что EUID
и EGID
атрибуты являются «лишними» и просто равно RUID
и RGID
за кулисами.
Часть 3. Общие сведения о EUID и EGID
Возьмем ping
для примера команду.
Найдите двоичное местоположение с помощью which
команды, затем запустите ls -la
:
-rwsr-xr-x 1 root root 64424 Mar 10 2017 ping
Вы можете видеть, что владелец и группа файла root
. Это связано с тем, что ping
команде необходимо открыть сокет, а ядро Linux требует root
для этого привилегий.
Но как я могу использовать, ping
если у меня нет root
привилегии?
Обратите внимание на букву «s» вместо «x» в части разрешения файла, относящейся к владельцу.
Это специальный бит разрешения для определенных двоичных исполняемых файлов (например, ping
и sudo
), который известен как setuid .
Вот где EUID
и EGID
вступает в игру.
Что произойдет, когда будет запущен такой двоичный файл, как setuidping
, процесс изменит свой эффективный идентификатор пользователя ( EUID
) со значения RUID
по умолчанию на владельца этого специального двоичного исполняемого файла, которым в данном случае является -root
.
Это все благодаря тому простому факту, что этот файл имеет setuid
бит.
Ядро принимает решение, имеет ли этот процесс привилегию, просматривая EUID
процесс. Поскольку теперь EUID
указывает на root
, операция не будет отклонена ядром.
Примечание : в последних выпусках Linux вывод ping
команды будет выглядеть иначе из-за того, что они приняли подход возможностей Linux вместо этого подхода setuid - для тех, кто не знаком - прочтите здесь .
Часть 4: А как насчет SUID и SGID?
Сохраненный идентификатор пользователя ( SUID
) используется, когда запущен привилегированный процесс ( root
например,), и ему необходимо выполнить некоторые непривилегированные задачи.
В этом случае эффективный UID ( EUID
) из предыдущего будет сохранен внутри, SUID
а затем изменен на непривилегированную задачу. Когда непривилегированная задача будет завершена, EUID
будет снято значение SUID
и переключится обратно на привилегированную учетную запись.