Мне уже известен настоящий идентификатор пользователя . Это уникальный номер пользователя в системе.
В моей системе My uid
is
$ echo $UID
1014
$
Что обозначают два других идентификатора?
И какова польза от эффективного идентификатора пользователя и сохраненного идентификатора пользователя и где мы его используем в системе?
Ответы:
Различие между реальным и эффективным идентификатором пользователя заключается в том, что вам может потребоваться временно присвоить идентификатор другого пользователя (в большинстве случаев это может быть
root
, но это может быть любой пользователь). Если бы у вас был только один идентификатор пользователя, то впоследствии не было бы возможности вернуться к исходному идентификатору пользователя (кроме как принять ваше слово как должное, а в случае, если даroot
, использоватьroot
права пользователя для изменения на любого пользователя).Итак, реальный идентификатор пользователя - это то, кем вы являетесь на самом деле (тот, кто владеет процессом), а эффективный идентификатор пользователя - это то, на что операционная система смотрит, чтобы принять решение, разрешено ли вам что-то делать (большую часть времени , есть исключения).
Когда вы входите в систему, оболочка входа устанавливает для реального и эффективного идентификатора пользователя одно и то же значение (ваш реальный идентификатор пользователя), указанное в файле паролей.
Теперь также случается, что вы выполняете программу setuid, и помимо работы от имени другого пользователя (например
root
) программа setuid также должна что-то делать от вашего имени. Как это работает?После выполнения программы setuid у нее будет ваш настоящий идентификатор (поскольку вы являетесь владельцем процесса) и эффективный идентификатор пользователя владельца файла (например
root
), поскольку он равен setuid.Программа делает все необходимое с привилегиями суперпользователя, а затем хочет что-то сделать от вашего имени. Это означает, что попытки сделать что-то, чего вы не должны делать, должны потерпеть неудачу . Как оно это делает? Ну, очевидно, изменив его эффективный идентификатор пользователя на настоящий идентификатор пользователя!
Теперь у программы setuid нет возможности переключиться обратно, поскольку ядро знает только ваш идентификатор и ... ваш идентификатор . Бах, ты мертв.
Это то, для чего нужен сохраненный идентификатор пользователя.
источник
access
. Это 99,9%. Такжеsetfsuid
(но редко требуется) и некоторые функции очень низкого уровня, и вам нужен (но не проверяется) реальный идентификатор пользователя для получения / установки приоритетов или планировщика, а также идентификаторы, переданные обработчикам сигналов или возвращенныеwait
и др. являются реальные идентификаторы.execve
не проверяет, но может не работать, если вы изменили реальный идентификатор пользователя. Такжеfork
не проверяет, но может дать сбой, если вы достигнете максимальной квоты процесса на реальном UID. Google сsite:man7.org
вашим другом здесь.ping
нужен сырой сокет. любой пользователь может (обычно) открыть сокет, и для прослушивания, выше 1024.Попробую объяснить пошагово на нескольких примерах.
Краткая предыстория
Каждый процесс имеет свои «полномочия процесса» , который включает в себя такие атрибуты , как
PID
, вPPID
,PGID
,session ID
а также реальные и эффективных идентификаторы пользователей и групп:RUID
,EUID
,RGID
,EGID
.Мы сосредоточимся на них.
Часть 1. Общие сведения о UID и GID
Теперь я войду в оболочку со своими учетными данными и запустил:
Вы можете увидеть мое имя журнала (rotem), UID и GID, которые равны 1000, и другие детали, такие как оболочка, в которую я вошел.
Часть 2: Общие сведения о RUID и RGID
Каждый процесс имеет владельца и принадлежит к группе .
В нашей оболочке каждый процесс, который мы сейчас запустим, унаследует привилегии моей учетной записи и будет работать с теми же UID и GID.
Давайте запустим простую команду, чтобы проверить это:
И проверьте UID и GID процесса:
Это реальный идентификатор пользователя (
RUID
) и реальный идентификатор группы (RGID
) процесса .(*) Проверьте другие параметры, чтобы просмотреть UID и GID, а также способы их получения в виде однострочного файла .
На данный момент, принять тот факт , что
EUID
иEGID
атрибуты являются «лишними» и просто равноRUID
иRGID
за кулисами.Часть 3. Общие сведения о EUID и EGID
Возьмем
ping
для примера команду.Найдите двоичное местоположение с помощью
which
команды, затем запуститеls -la
:Вы можете видеть, что владелец и группа файла
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 вместо этого подхода setuid - для тех, кто не знаком - прочтите здесь .Часть 4: А как насчет SUID и SGID?
Сохраненный идентификатор пользователя (
SUID
) используется, когда запущен привилегированный процесс (root
например,), и ему необходимо выполнить некоторые непривилегированные задачи.В этом случае эффективный UID (
EUID
) из предыдущего будет сохранен внутри,SUID
а затем изменен на непривилегированную задачу. Когда непривилегированная задача будет завершена,EUID
будет снято значениеSUID
и переключится обратно на привилегированную учетную запись.источник