setresuid, setresgid -
устанавливает
реальный,
эффективный
и
сохранённый
пользовательский
идентификатор
или
идентификатор
группы
Standard C library (
libc,
-lc)
#define _GNU_SOURCE /* см. feature_test_macros(7) */
#include <unistd.h>
int setresuid(uid_t ruid, uid_t euid, uid_t suid);
int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
Вызов
setresuid()
устанавливает
реальный
идентификатор
пользователя,
эффективный
идентификатор
пользователя
и
сохранённый
идентификатор
пользователя
вызывающего
процесса.
Непривилегированный
процесс
может
изменять
реальный UID,
эффективный
UID и
сохранённый
set-user-ID на
соответственно
текущий
реальный UID,
текущий UID и
текущий
сохранённый
set-user-ID.
Привилегированный
процесс (в Linux:
имеющие
мандат
CAP_SETUID)
могут
устанавливать
произвольные
значения
для
реального,
эффективного
UID и
сохранённого
set-user-UID .
Если один
из
параметров
равен -1, то
соответствующее
ему
значение
не
изменяется.
Независимо
от того, как
изменились
реальный UID,
эффективный
UID и
сохранённый
UID
идентификатор
в файловой
системе
всегда
устанавливается
равным
значению
(возможно
новому)
эффективного
UID.
Аналогично,
setresgid()
устанавливает
реальный GID,
эффективный
GID, и
сохранённый
GID
вызывающего
процесса (и
всегда
изменяет GID в
файловой
системе на
значение
эффективного
GID) с теми же
ограничениями
для
непривилегированных
процессов.
On success, zero is returned. On error, -1 is returned, and
errno is set
to indicate the error.
Замечание:
есть
случаи,
когда
setresuid()
может
завершиться
с ошибкой
даже когда UID
вызывающего
равен 0; это
серьёзная
ошибка
безопасности
— не
проверять
возвращаемое
значение
setresuid().
- EAGAIN
- Вызов
изменил бы
настоящего
реальный UID
вызывающего
(т. е. ruid не
совпадает
с реальным
UID
вызывающего),
но
возникла
временная
ошибка при
выделении
памяти под
необходимые
структуры
ядра.
- EAGAIN
- Значение
ruid не
совпадает
с реальным
UID
вызывающего
и этот
вызов
создал был
превышение
количества
процессов,
принадлежащих
пользователю
с реальным
ID ruid сверх
ограничителя
ресурсы
RLIMIT_NPROC
вызывающего.
Начиная с Linux
3.1 эта
ошибка
больше не
возникает
(но
корректное
приложение
должно
проверять
эту
ошибку);
смотрите
описание
EAGAIN в execve(2).
- EINVAL
- Один или
более
целевых
идентификаторов
пользователя
или группы
некорректны
в этом
пользовательском
пространстве
имён.
- EPERM
- Вызывающий
процесс не
является
привилегированным
(не имеет
необходимого
мандата в
своём
пространстве
имён
пользователя)
и пытается
изменить
значения
идентификаторов,
что
запрещено.
Для setresuid()
необходим
мандат CAP_SETUID;
для setresgid() —
CAP_SETGID.
Данные
вызовы
доступны в
Linux начиная с
версии 2.1.44.
Это
нестандартные
вызовы;
также они
есть в HP-UX и
некоторых BSD.
Under HP-UX and FreeBSD, the prototype is found in
<unistd.h>.
Under Linux, the prototype is provided since glibc 2.3.2.
Первоначальные
версии
системных
вызовов
setresuid()
и
setresgid() в Linux
поддерживали
только
16-битные
идентификаторы
пользователей
и групп.
Позднее в Linux 2.4
были
добавлены
вызовы
setresuid32() и
setresgid32(),
поддерживающие
32-битные
идентификаторы.
В glibc
обёрточные
функции
setresuid()
и
setresgid()
работают
одинаково
вне
зависимости
от версий
ядра.
На уровне
ядра ID
пользователя
и группы
являются
атрибутами
нити.
Однако в POSIX
требуется,
чтобы все
нити в
процессе
имели
одинаковые
права. В
реализации
нитей NPTL
требования
POSIX
реализованы
через
обёрточные
функции
для
различных
системных
вызовов,
которые
изменяют UID и
GID процесса. В
этих
функциях
(включая и
setresuid() and
setresgid())
используется
алгоритмы
на основе
сигналов,
которые
следят за
тем, что
когда у
одной нити
изменяются
права, эти
изменения
выполняются
и для
остальных
нитей
процесса.
Подробное
описание
смотрите в
nptl(7).
getresuid(2),
getuid(2),
setfsgid(2),
setfsuid(2),
setreuid(2),
setuid(2),
capabilities(7),
credentials(7),
user_namespaces(7)
Русский
перевод
этой
страницы
руководства
был сделан
Alexander Golubev <
[email protected]>, Azamat Hackimov
<
[email protected]>, Hotellook, Nikita
<
[email protected]>, Spiros Georgaras <
[email protected]>, Vladislav
<
[email protected]>, Yuri Kozlov <
[email protected]>
и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]