С каждым выполняемым процессом в ОС UNIX® связываются реальный идентификатор пользователя (real user ID), действующий идентификатор пользователя (effective user ID) и сохраненный идентификатор пользователя (saved user ID). Все эти идентификаторы устанавливаются с помощью системного вызова setuid, который можно выполнять только в режиме суперпользователя. Аналогично, с каждым процессом связываются три идентификатора группы пользователей - real group ID, effective group ID и saved group ID. Эти идентификаторы устанавливаются привилегированным системным вызовом setgid.
При входе пользователя в систему программа login проверяет, что пользователь зарегистрирован в системе и знает правильный пароль (если он установлен), образует новый процесс и запускает в нем требуемый для данного пользователя shell. Но перед этим login устанавливает для вновь созданного процесса идентификаторы пользователя и группы, используя для этого информацию, хранящуюся в файлах /etc/passwd и /etc/group. После того, как с процессом связаны идентификаторы пользователя и группы, для этого процесса начинают действовать ограничения для доступа к файлам. Процесс может получить доступ к файлу или выполнить его (если файл содержит выполняемую программу) только в том случае, если хранящиеся при файле ограничения доступа позволяют это сделать. Связанные с процессом идентификаторы передаются создаваемым им процессам, распространяя на них те же ограничения. Однако в некоторых случаях процесс может изменить свои права с помощью системных вызовов setuid и setgid, а иногда система может изменить права доступа процесса автоматически.
Рассмотрим, например, следующую ситуацию. В файл /etc/passwd запрещена запись всем, кроме суперпользователя (суперпользователь может писать в любой файл). Этот файл, помимо прочего, содержит пароли пользователей и каждому пользователю разрешается изменять свой пароль. Имеется специальная программа /bin/passwd, изменяющая пароли. Однако пользователь не может сделать это даже с помощью этой программы, поскольку запись в файл /etc/passwd запрещена. В системе UNIX® эта проблема разрешается следующим образом. При выполняемом файле может быть указано, что при его запуске должны устанавливаться идентификаторы пользователя и/или группы. Если пользователь запрашивает выполнение такой программы (с помощью системного вызова exec), то для соответствующего процесса устанавливаются идентификатор пользователя, соответствующий идентификатору владельца выполняемого файла и/или идентификатор группы этого владельца. В частности, при запуске программы /bin/passwd процесс получит идентификатор суперпользователя, и программа сможет произвести запись в файл /etc/passwd.
И для идентификатора пользователя, и для идентификатора группы реальный ID является истинным идентификатором, а действующий ID - идентификатором текущего выполнения. Если текущий идентификатор пользователя соответствует суперпользователю, то этот идентификатор и идентификатор группы могут быть переустановлены в любое значение системными вызовами setuid и setgid. Если же текущий идентификатор пользователя отличается от идентификатора суперпользователя, то выполнение системных вызовов setuid и setgid приводит к замене текущего идентификатора истинным идентификатором (пользователя или группы соответственно).
PAM
Подключаемые модули аутентификации (Pluggable Authentication Modules, РАМ) были разработаны компанией Sun в качестве гибкого средства аутентификации пользователей Долгие годы под аутентификацией в среде UNIX® подразумевалось сопоставление регис- рационных данных пользователей с их записями в файле /etc/passwd. Возникшая позднее необходимость в усилении защиты и поддержке большего разнообразия средств аутентификации (например, интеллектуальных карточек) потребовала более гибкого подхода.
Механизм РАМ включен в Red Hat, SuSE и Debian и не имеет отношения к текущей реализации стандарта РАМ компании Sun. Концепция проста: программам, выполняющим аутентификацию, достаточно "знать" лишь о том, что имеется некий модуль, кото-рый проведет аутентификацию за них. Система конфигурируется таким образом, чтобы модули можно было добавлять, удалять и перенастраивать в любое время. Вовсе не обязательно, чтобы тот или иной модуль был скомпонован (или даже существовал) на этапе компиляции утилиты. Благодаря этому модули РАМ стали удобным средством системного администрирования.
Модули РАМ настраиваются посредством файлов каталога /etc/pam.d. Для каждой службы в этом каталоге содержится отдельный файл с записями следующего вида:
Поле тип_модуля может иметь значения auth, account, session или password. Модуль типа auth идентифицирует пользователя и может предоставлять ему право группового доступа. Модуль типа account выполняет действия, не связанные с аутентификацией, например предоставляет доступ в зависимости от времени суток. Действия, которые необходимо выполнить до или после того, как пользователь получит доступ к требуемой службе реализуются модулем типа session. Наконец, модуль типа password используется, когда пользователь должен ввести аутентификационную информацию (например, пароль).
Поле управляющий_флаг имеет четыре возможных значения: required, requisite sufficient и optional. Чаще всего используются флаги required и optional. Пер-вый из них указывает на то, что для успешного продолжения работы модуль должен до-биться положительного результата. Второй флаг говорит о том, что результат работы мо-дуля несущественен.
В третьем и четвертом полях указываются путь к динамически загружаемому файлу модуля и аргументы его вызова. Если первым символом третьего поля является косая черта (/), то путь считается абсолютным. В противном случае содержимое поля добавляется к стандартному имени каталога: /lib/security.
Например, чтобы позволить команде passwd осуществлять проверку паролей с использованием модуля РАМ библиотеки crack, добавьте следующие записи в файл
При наличии таких строк система будет сверять предлагаемые пользователями пароли со словарем и правилами утилиты crack (необходимо, чтобы присутствовала системная биб- лиотека libcrack и системный словарь /usr/lib/cracklib_dict). Аргумент retry=3 указывает на то, что пользователю будут даны три попытки для ввода правильного пароля. Строка с аргу- ментом use_authtok соединяет друг с другом различные уровни модуля password. Существуют десятки модулей РАМ. Различные модули и документацию к ним можно по адресу www.kernel.org/pub/linux/libs/pam