Подтвердить что ты не робот

Разница между реальным идентификатором пользователя, эффективным идентификатором пользователя и сохраненным идентификатором пользователя

Я уже знаю реальный идентификатор пользователя. Это уникальный номер для пользователя в системе. В моей системе My uid

$ echo $UID
1014
$                 

Что означают два других идентификатора. И в чем заключается использование эффективного идентификатора пользователя и сохраненного идентификатора пользователя, и где мы его используем в системе.

4b9b3361

Ответ 1

Различие между реальным и эффективным идентификатором пользователя производится потому, что вам может потребоваться временно ввести другой идентификатор пользователя (большую часть времени это будет root, но это может быть любой пользователь). Если бы у вас был только один идентификатор пользователя, после этого не было бы способа вернуться к исходному идентификатору пользователя (кроме того, что вы считаете слово само собой разумеющимся, а в случае, если вы root, используя привилегии root для изменения любого пользователь).

Итак, реальный идентификатор пользователя - это кто вы на самом деле (тот, кто владеет процессом), а эффективный идентификатор пользователя - это то, что операционная система пытается решить, разрешено ли вам что-то делать (большинство времени, есть некоторые исключения).

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

Теперь также случается, что вы выполняете программу setuid, и помимо запуска в качестве другого пользователя (например, root) программа setuid также должна делать что-то от вашего имени. Как это работает?
После выполнения программы setuid у нее будет ваш реальный идентификатор (поскольку вы являетесь владельцем процесса) и эффективный идентификатор пользователя владельца файла (например, root), поскольку он является setuid.

Программа выполняет любую магию, которая должна выполняться с привилегиями суперпользователя, а затем хочет что-то сделать от вашего имени. Это означает, что попытка сделать то, что вы не можете сделать, должна потерпеть неудачу. Как оно это делает? Ну, очевидно, изменив свой эффективный идентификатор пользователя на реальный идентификатор пользователя!

Теперь, когда программа setuid не имеет возможности переключиться, поскольку все ядро ​​знает ваш id и... ваш id. Банг, ты мертв.

Это то, для чего предназначен сохраненный идентификатор set-user.

Ответ 2

Я постараюсь объяснить шаг за шагом с некоторыми примерами.

Краткий фон

Каждый процесс имеет свои "учетные данные процесса", которые включают в себя такие атрибуты, как 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

Вы можете видеть мой логин (ротем), 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.
Что произойдет, когда setuid двоичный файл, подобный ping, выполнится, процесс изменит свой эффективный идентификатор пользователя (EUID) со стандартного RUID на владельца этого специального двоичного исполняемого файла который в этом случае - root.
Все это делается благодаря простому факту, что этот файл имеет бит setuid.

Ядро принимает решение, имеет ли этот процесс привилегию, просматривая EUID процесса. Потому что теперь EUID указывает на root - эта операция не будет отклонена ядром.

Примечание: в последних версиях Linux выходные данные команды ping будут выглядеть по-разному из-за того, что они приняли подход Linux Capabilities вместо этого подхода setuid - для тех, кто не знаком - читайте здесь.

Часть 4. Как насчет SUID и SGID?

Сохраненный идентификатор пользователя (SUID) используется, когда выполняется привилегированный процесс (например, root), и ему необходимо выполнить некоторые непривилегированные задачи.

В этом случае эффективный UID (EUID) из предыдущего будет сохранен внутри SUID, а затем изменен на непривилегированное значение. Когда непривилегированное задание выполнено EUID будет взято из значения SUID и переключено обратно на привилегированную учетную запись.


Надеюсь, это было достаточно ясно.