Ты пришли ко мне утром, ты cела на кровать Ты спросила, есть ли у меня разрешение дышать И действителен ли мой пропуск Чтобы выйти в кино Б. Гребенщиков |
В чистом виде модель авторизации на основе полномочий
реализована в системах Burroughs и Intel 432, которые подробнее рассматриваются
в разд. Сегменты, страницы и системные
вызовы и Взаимно недоверяющие подсистемы.
Полномочия доступа к сегментам единого адресного пространства в этих системах
реализованы в виде полей селектора сегмента или мандатов, а невозможность
Рис. 12.18. Хранение полномочий в системном адресном пространстве
Включение средств аутентификации в ядро кажется весьма
привлекательным: мы можем быть уверены, что никто не получит чужие полномочия,
иначе как пройдя штатную процедуру проверки идентичности. С другой стороны,
каждый процесс, считающий, что ему следует произвести смену идентичности
(например, сервер, исполняющий запрос от имени конкретного пользователя)
может запросить у пользователя имя и пароль и переау-тентифицироваться
без каких-либо трудностей.
Проблема при таком подходе состоит в том, что мц ограничиваем используемые
в системе способы аутентификации и форматы пользовательской базы данных.
Разработка модулей, реализующих альтернативные способы аутентификации
(например, применяющих папиллярный детектор или сканер глазного дна вместо
запроса пароля) или нестандартные способы хранения списков пользователей
резко усложняются — теперь это должны быть не простые разделяемые библиотеки,
а модули ядра.
Осуществление аутентификации в пользовательском режиме требует введения
специального [псевдо]пользователя, которому разрешено становиться другими
пользователями (или, говоря точнее, приобретать их идентичность) или специального
типа процессов, которые могут делать это. Привилегия входить в систему
и запускать процессы с таким идентификатором должна жестко контролироваться:
ведь обладатель таких полномочий может стать кем угодно и, таким образом,
выполнять любое действие, которое кому-либо разрешено.
Аутентификация в Unix
В системах семейства Unix процессы с эффективным пользовательским идентификатором,
равным 0, имеют право исполнять системные вызовы setuid и setgid и, таким
образом, становиться другими пользователями. Другие пользователи не имеют
такой возможности, поэтому все процессы, в той или иной форме, осуществляющие
аутентификацию и смену идентичности, как с применением стандартных системных
средств (файлов /etc/passwd и /etc/shadow в старых системах и разделяемых
библиотек РАМ в современных), так и самостоятельно, обязаны исполняться
от имени этого пользователя.
Поскольку пользователь с идентификатором 0 (root) может приобретать идентичность
других пользователей, он, как уже говорилось, фактически обладает всеми
правами, которые есть у кого бы то ни было другого в системе. Признав
этот факт, разработчики Unix явным образом дали пользователю root вообще
все права, в том числе и такие, которых не имеет никто другой.
Мы уже отмечали в разд.