■ переставлять местами значения реального и эффективного идентификаторов.
Первый вариант будет использован серверным процессом, когда он закончит работать от имени пользователя mitchell
root. Второй вариант используется программой аутентификации после того, как она сделала эффективный идентификатор равным пользовательскому. Изменение реального идентификатора необходимо для того, чтобы пользователь не смог стать обратно пользователем root. Последний, третий, вариант в современных программах не встречается.В качестве любого из аргументов функции setreuid()
seteuid(), которая меняет эффективный идентификатор, но не трогает реальный. Например, следующие две строки эквивалентны:seteuid(id);
setreuid(-1, id);
10.4.1. Программы с установленным битом SUID
Выше было показано, как процесс пользователя root
% whoami
mitchell
% su
Password: ...
% whoami
root
Команда whoami
id, но отображает только эффективный идентификатор пользователя. Команда su позволяет вызвавшему ее пользователю стать суперпользователем, если введен правильный пароль.Как же работает команда su
mitchell. Функция setreuid() не позволит ему поменять ни один из них.Дело в том, что у программы su
chmod +s и флаг S_SUID функции chmod().[34]В качестве примера рассмотрим программу, показанную в листинге 10.3.
#include
#include
int main() {
printf("uid=%d euid=%d\n", (int)getuid(), (int)geteuid());
return 0;
}
Теперь предположим, что у программы установлен бит SUID и она принадлежит пользователю root
ls будет примерно таким:-rwsrws--x 1 root root 11931 Jan 24 18:25 setuid-test
Буквы s в строке режима означают, что этот файл не только является исполняемым, но для него установлены также биты SUID и SGID. Результат работы программы будет таким:
% whoami
mitchell
% ./setuid-test
uid=501 euid=0
Обратите внимание на то, что эффективный идентификатор стал равным нулю. Устанавливать биты SUID и SGID позволяют команда chmod u+s
chmod g+s соответственно. Приведем пример:% ls -l program
-rwxr-xr-x 1 samuel csl 0 Jan 30 23:38 program
% chmod g+s program
% ls -l program
-rwxr-sr-x 1 samuel csl 0 Jan 30 23:38 program
% chmod u+s program
% ls -l program
-rwsr-sr-x 1 samuel csl 0 Jan 30 23:38 program
Аналогичным целям служат флаги S_ISUID
S_ISGID функции chmod().Именно так работает команда su
Рассмотрим атрибуты программы su
% ls -l /bin/su
-rwsr-xr-x 1 root root 14188 Mar 7 2000 /bin/su
Как видите, она принадлежит пользователю root
su не меняет идентификатор интерпретатора команд, в котором она была вызвана, а запускает новый интерпретатор с измененным идентификатором. Первоначальный интерпретатор будет заблокирован до тех пор, пока пользователь не введет exit.10.5. Аутентификация пользователей