seteuid, setegid - устанавливает эффективный идентификатор пользователя или группы
Standard C library (libc, -lc)
#include <unistd.h>
int seteuid(uid_t euid);
int setegid(gid_t egid);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
seteuid(), setegid():
_POSIX_C_SOURCE >= 200112L
|| /* glibc <= 2.19: */ _BSD_SOURCE
Вызов seteuid() устанавливает эффективный идентификатор пользователя вызывающего процесса. Непривилегированные процессы могут менять эффективный идентификатор пользователя только на действительный, эффективный или сохранённый идентификатор пользователя.
Тоже самое справедливо при работе setegid() с «групповым» идентификатором, а не «пользовательским».
On success, zero is returned. On error, -1 is returned, and errno is set to indicate the error.
Замечание: есть случаи, когда seteuid() может завершиться с ошибкой даже когда UID вызывающего равен 0; это серьёзная ошибка безопасности — не проверять возвращаемое значение seteuid().
EINVAL |
Целевой идентификатор пользователя или группы некорректен в этом пользовательском пространстве имён. |
||
EPERM |
Для seteuid(): вызывающий процесс не имеет прав (не имеет мандата CAP_SETUID в своём пространстве имён пользователя) и euid не совпадает с текущим действительным, эффективным или сохранённым идентификатором пользователя. |
Для setegid(): вызывающий процесс не имеет прав (не имеет мандата CAP_SETGID в своём пространстве имён пользователя) и egid не совпадает с текущим действительным, эффективным или сохранённым идентификатором группы.
POSIX.1-2001, POSIX.1-2008, 4.3BSD.
Установка эффективного идентификатора пользователя (группы) в сохранённый идентификатор пользователя (группы) возможна с версии Linux 1.1.37 (1.1.38). В других системах надо проверять _POSIX_SAVED_IDS.
В glibc 2.0 вызов seteuid(euid)эквивалентен setreuid(-1, euid), и поэтому может изменить сохранённый идентификатор пользователя. В glibc 2.1 и новее он эквивалентен setresuid(-1, euid, -1) и поэтому не изменяет сохранённый идентификатор пользователя. Аналогичные замечания относятся и к setegid(), с той разницей, что изменение в реализации из setregid(-1, egid) в setresgid(-1, egid, -1) произошло в glibc 2.2 или 2.3 (зависит от аппаратной архитектуры).
Согласно POSIX.1, seteuid() (setegid()) необходимо запрещать euid (egid) равный текущему эффективному идентификатору пользователя (группе), и некоторые реализации не позволяют этого.
Отличия между библиотекой C и ядром
В Linux, seteuid() и setegid() реализованы в виде библиотечных функций, которые вызывают setreuid(2) и setregid(2), соответственно.
geteuid(2), setresuid(2), setreuid(2), setuid(2), capabilities(7), credentials(7), user_namespaces(7)
Русский перевод этой страницы руководства был сделан Alexander Golubev <fatzer2 AT gmail DOT com>, Azamat Hackimov <azamat DOT hackimov AT gmail DOT com>, Hotellook, Nikita <zxcvbnm3230 AT mail DOT ru>, Spiros Georgaras <sng AT hellug DOT gr>, Vladislav <ivladislavefimov AT gmail DOT com>, Yuri Kozlov <yuray AT komyakino DOT ru> и Иван Павлов <pavia00 AT gmail DOT com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks.