конечном итоге, пользователь получал владение процессом NFS-сервера. Чтобы предотвратить проблемы подобного рода, Linux использует uid файловой системы (fsuid) для контроля доступа к файловой системе.
Всякий раз когда изменяется эффективный uid процесса, его fsuid устанавливается равным новому эффективному идентификатору пользователя, что делает fsuid прозрачным для большинства приложений. Те приложения, которые нуждаются в дополнительных возможностях, предоставляемых отличающимся значением fsuid, должны применять вызов setfsuid()
для явной установки fsuid.
int setfsuid(uid_t uid);
Значение fsuid может быть установлено равным текущим эффективному, сохраненному или действительному идентификаторам пользователя. В дополнение следует сказать, что setfsuid()
выполняется успешно, если fsuid остается неизменным или эффективный uid процесса равен 0.
10.2.4. Резюме по идентификаторам пользователей и групп
Подведем итоги обо всех системных вызовах, которые модифицируют права доступа выполняющегося процесса. Большинство перечисленных здесь функций, имеющих отношение к идентификаторам пользователей, уже детально рассматривались в настоящей главе, но те, что относятся к группам — еще нет. Поскольку эти функции отражают соответствующие функции, модифицирующие идентификаторы пользователя, их поведение должно быть понятно.
Все эти функции возвращают -1
в случае ошибки и 0
— в случае успеха, если только не указано иначе. Большинство их прототипов находятся в <unistd.h>
. Те, что расположены где-то еще, отмечены ниже.
int setreuid(uid_t ruid, uid_t euid); | Устанавливает действительный uid текущего процесса в ruid и эффективный uid процесса в euid . Если оба параметра равны - 1 , то uid остаются неизменными. |
int setregid(gid_t rgid, gid_t egid); | Устанавливает действительный gid текущего процесса в rgid и эффективный gid процесса в egid. Если оба параметра равны - 1 , то gid остаются неизменными. |
int setuid(uid t uid); | Если применяется обычным пользователем, то устанавливает эффективный uid текущего процесса в значение параметра uid . Если используется процессом с эффективным uid, равным 0, то устанавливает действительный, эффективный и сохраненный uid в значение параметра uid . |
int setgid(gid_t gid); | Если применяется обычным пользователем, то устанавливает эффективный gid текущего процесса в значение параметра gid . Если используется процессом с эффективным gid, равным 0, то устанавливает действительный, эффективный и сохраненный gid в значение параметра gid . |
int seteuid(uid_t uid); | Эквивалент setreuid(-1, uid) . |
int setegid(gid_t gid); | Эквивалент setregid(-1, gid) . |
int setfsuid(uid_t fsuid); | Устанавливает fsuid текущего процесса в значение параметра fsuid . Прототип находится в <sys/fsuid.h> . Возвращает предшествующий fsuid. |
int setfsgid(gid_t fsgid); | Устанавливает fsgid текущего процесса в значение параметра fsgid . Прототип находится в <sys/fsuid.h> . Возвращает предшествующий fsgid. |
int setgroups(size_t num, const gid_t * list); | Устанавливает дополнительные группы текущего процесса из списка, переданного в массиве list , который должен содержать num элементов. Макрос SC_NGROUPS_MAX указывает, сколько групп может быть в списке (от 32 до 65536, в зависимости от работающей у вас версии Linux). |
uid_t getuid(); | Возвращает действительный uid процесса. |
uid_t geteuid(); | Возвращает эффективный uid процесса. |
gid_t getgid(); | Возвращает действительный gid процесса. |
gid_t getegid(); | Возвращает эффективный gid процесса. |
size_t getgroups (size_t size, gid_t list[]); | Возвращает текущий набор дополнительных групп процесса в массиве list . Параметр size сообщает, сколько элементов типа gid_t |