[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Бит установки идентификатора пользователя и setuid(2)
При входе в систему идентификаторы пользователя и группы
устанавливается из файла /etc/passwd. Реальные и эффективные
идентификаторы для процесса первоначально совпадают. Эффективный
идентификатор пользователя и список групп доступа (показываемый
getgroups(2)) используются для определения прав доступа к файлам.
Владелец любого файла, созданного процессом, определяется эффективным
идентификатором пользователя, а группа файла - эффективным
идентификатором группы.
Единственный способ выполнения программы - не ее владельцем - это
запустить программу (a.out) с установленным битом установки
идентификатора пользователя или группы. Если бит установлен, тогда
эффективный идентификатор пользователя и/или группы становится таким
же, как и у владельца и/или группы данной программы. Благодаря этому
механизму можно стать "заместителем" или "представителем"
привилегированной группы. Бит установки идентификатора пользователя
или группы устанавливается с помощью chmod(1) или chmod(2).
Используя программы с битом установки идентификатора пользователя,
можно получить доступ к файлам и устройствам, которые обычным образом
недостижимы. Например, если файл доступен по чтению и записи только
для владельца, другие пользователи не могут получить доступ к этому
файлу. Если же владелец данного файла (с ограниченными правами
доступа) напишет программу доступа к этому файлу и установит бит
установки идентификатора пользователя, тогда все пользователи данной
программы смогут получить доступ к файлу, ранее недостижимому. Патент
на механизм установки идентификатора пользователя принадлежит Дэннису
Ричи.
Биты установки идентификатора пользователя и группы показываются
командой ls -l буквой 's' на месте обычного расположения 'x'.
Некоторые команды ОС UNIX имеют бит установки идентификатора
пользователя. Например, информация о паролях находится в файле
/etc/shadow. Этот файл может читать только владелец -
привилегированный пользователь (root). Тем не менее каждый
пользователь может изменить свой пароль. Это возможно, несмотря на то,
что владельцем программы изменения пароля /bin/passwd является root,
потому что у этой программы установлен бит установки идентификатора
пользователя. Другой пример - /bin/ps. Благодаря этой программе
пользователь может читать файл /dev/kmem, обычно недоступный по
чтению.
Программа с битом установки идентификатора пользователя или группы
будет иметь эффективный идентификатор отличный от реального либо до
конца времени выполнения процесса, либо до применения setuid(2) или
setgid(2). С помощью этих системных вызовов эффективный идентификатор
вновь становится равным реальному. Эффективный идентификатор
пользователя может снова стать равным идентификатору владельца
программы с помощью вызова setuid(2). setuid(2) или setgid(2)
используются в программе, если владелец программы хочет предоставить
пользователю возможность быть его "представителем", но в программе
есть часть, где нет необходимости в специальных привилегиях.
Суперпользователь может применять setuid(2) для установки
идентификатора, равному идентификатору любого пользователя в системе.
Другие пользователи могут использовать только свои идентификаторы.
Программа /bin/login, с владельцем bin, использует числовые
идентификаторы пользователя и группы, обнаруженные в файле
/etc/passwd, как аргументы setuid(2) и setgid(2) для установки
реального идентификатора пользователей, входящих в систему.
Системная команда su является единственным способом модификации
реальных идентификаторов.
БИТ УСТАНОВКИ ИДЕНТИФИКАТОРА ПОЛЬЗОВАТЕЛЯ И setuid(2)
. доступ к ресурсам основывается на эффективном идентификаторе
пользователя и группы.
. с помощью механизма установки идентификатора пользователь может
быть чьим-то "представителем".
. бит установки идентификатора для a.out устанавливается с помощью
chmod(1), chmod(2) и open(2)
установка идентификатора пользователя
04711 восьмеричное число
u+s символьная запись для chmod(1)
rws--x--x выводит ls -l
установка идентификатора группы
02711 восьмеричное число
g+s символьная запись для chmod(1)
rws--s--x выводит ls -l
. Действует от начала исполнения процесса до конца или до
использования setuid(2).
setuid(2)
ИМЯ
setuid, setgid - установка идентификаторов пользователя и группы
ИСПОЛЬЗОВАНИЕ
#include <sys/types.h>
#include <unistd.h>
int setuid (uid_t uid);
int setgid (gid_t gid);
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
успех - 0
неуспех - -1 и errno установлена