Журнал LinuxFormat - перейти на главную

LXF99:Аутентификация

Материал из Linuxformat
Перейти к: навигация, поиск

Эксперименты c PAM

Вы можете и не подозревать о существовании аутентификации, потому что она «просто работает». А вот как она работает? Д-р Крис Браун расскажет.

PAM (Pluggable Authentication Modules – подключаемые модули аутентификации) – один из тех темных закоулков Linux, куда большинство пользователей заглянуть не решается. Я даже готов побиться об заклад, что большинство пользователей не знают, что это такое. Однако PAM – в сердце каждой программы, так или иначе связанной с аутентификацией. Добро пожаловать на экскурсию по PAM! Заходите в нашу научную лабораторию, выполните наши экспе рименты (горелка Бунзена не потребуется!), и вы увидите, что PAM предоставляет тонкий контроль над политикой безопасности.

В LXF83 была статья Грэма Моррисона, в которой он провел обзор PAM и продемонстрировал ее гибкость, показав, как с ее помощью расширить аутентификацию пользователя в Linux, используя цифровой ключ, записанный на USB-брелок. В этом месяце мы пойдем дальше и рассмотрим более существенное повышение безопасности системы с помощью PAM. Те из вас, кто настриг LXF83 на мелкие кусочки и использовал их как подстилку в клетке своего хомячка, и те, кто просто не покупал этот номер, не переживайте: в первом разделе мы проведем небольшой обзор PAM, а в детали углубимся во втором.

Часть 1: Знакомимся с PAM

Рис. 1. Архитектура PAM и взаимосвязь ее частей.

PAM – это каркас, помогающий приложениям выполнять то, что я называю «действиями, связанными с аутентификацией». PAM состоит из библиотеки (libpam) и набора модулей PAM, которые находятся в папке /lib/security и представляют собой динамически загружаемые библиотеки (.so). Каждый модуль служит для решения определенной задачи, и приложения, связанные с PAM, обычно используют стек из нескольких модулей. Общая архитектура показана на рис. 1. PAM определяет четыре типа действий, относящихся к аутентификации:

  • auth – наиболее очевидное действие: вы удостоверяете свою личность, предоставляя некоторый набор реквизитов. Обычно это имя пользователя и пароль, но возможны и другие варианты: например, физический ключ (как в LXF83), а то и биометрические методы, вроде отпечатков пальцев или сканирования сетчатки глаза.
  • account – действия, определяющие, можно ли вам зайти в систему (теперь, когда мы уже знаем, кто вы). К этой категории можно отнести, например, модуль PAM, ограничивающий вход пользователей в систему в зависимости от времени суток.
  • session – действия по выделению ресурсов, которые могут потребоваться пользователю во время сессии, например, монтирование домашнего каталога пользователя, установка лимитов на использование ресурсов системы, вывод ежедневного сообщения и т.д.
  • password – действия по обновлению реквизитов пользователя (обычно пароля).

Для краткости в дальнейшем я буду называть эти действия «задачами PAM».

Какие программы используют PAM?

Да любые, которым нужно аутентифицировать пользователей, управлять их входом в систему, выделять им ресурсы или обновлять реквизиты: использование PAM значительно облегает им жизнь. Очевидные примеры:

  • login – программа входа в текстовый терминал.
  • gdm – вход в графический рабочий стол.
  • su – запуск оболочки от имени нового пользователя.
  • passwd – задание нового пароля.

Рис. 2: Синтаксис файла конфигурации PAM.

Преимущество PAM в том, что «действия, связанные с аутентификацией», не привязаны к приложению, которое их использует. Благодаря этому гораздо проще менять политику безопасности или добавлять новые механизмы аутентификации: достаточно просто перенастроить PAM. Раньше для этого могло потребоваться изменение исходного кода самих приложений. Стек модулей, с помощью которых каждое приложение с аутентификацией через PAM выполняет одно из четырех соответствующих действий, определяется в файле конфигурации приложения, расположенном в каталоге /etc/pam.d. Имя файла соответствует имени приложения: например, файл /etc/pam.d/sshd содержит настройки PAM для программы sshd. На рис. 2 показана одна из строк такого файла. Эта строка добавляет к стеку auth модуль pam_unix.so. При необходимости приложение может сформировать все четыре стека (по одному для каждого из типов действий PAM), однако для большинства приложений достаточно двух.

Итак, основная идея такова: когда приложению надо выполнить одно из действий PAM, оно обращается к библиотеке PAM. Затем библиотека по очереди вызывает все модули в этом стеке. Каждый модуль «делает свое дело» и возвращает библиотеке положительный или отрицательный результат. Библиотека объединяет результаты модулей в результат для стека в целом, который возвращается приложению. Способ объединения определяется управляющим флажком модуля, прописанным во втором поле строки в файле настроек. Возможные значения флажка:

  • requisite Если модуль завершается с ошибкой, PAM немедленно возвращает приложению ошибку, другие модули стека не вызываются.
  • required Если модуль завершается с ошибкой, PAM возвращает ошибку приложению, но продолжает вызывать остальные модули стека. (Кто не в силах запомнить разницу между requisite и required, вступайте в спецклуб! Я уже в нем...)
  • sufficient Если модуль завершается успешно, PAM возвращает приложению результат «выполнен», и остальные модули стека не вызываются. (Конечно, предполагается, что никакой модуль с флажком required выше в стеке не отказал.)
  • optional Результат работы модуля (выполнен/ошибка) игнорируется. Обычно это означает, что модуль вызывается для выполнения некой операции, не имеющей отношения к принятию решения «пропустить/отказать» для всего стека. Например, модуль pam_keyinit – «необязательный» модуль для sshd, он создает новый «ключ сессии» для нового пользователя.

(Последние версии PAM поддерживают получение более подробного результата выполнения модуля, чем просто «выполнен/ошибка», и более сложный синтаксис для задания способа объединения отдельных результатов. Подробности можно найти на man-странице pam.conf, если она есть. Однако и этого простейшего отчета вполне достаточно.) В качестве управляющего флажка также может использоваться ключевое слово include. Эта ситуация немного отличается от других. Она предписывает PAM подключить некоторый предопределенный стек модулей (в терминах программирования это можно назвать вызовом подпрограммы). Это позволяет «вынести за скобку» наиболее общие действия PAM (например, общие стеки модулей), в отдельный файл. Например, в RHEL5 вы заметите, что во многих файлах конфигурации PAM подключен стек, определенный в файле system-auth. В Ubuntu 7.04 имеются четыре файла для аналогичной цели: common-auth, common-account, common-session и common-passwd. В Red Hat также есть своего рода «метамодуль» pam_stack, который выполняет стек модулей, определенных в отдельном файле.

Теперь, получив представление о том, как модули PAM связаны друг с другом, вы, возможно, захотите взглянуть на большую таблицу в конце этой статьи, где описаны модули, используемые чаще всего. Учтите, что некоторых модулей может не быть в вашем дистрибутиве, и, наоборот, вам могут попасться модули, которых нет в этой таблице. Поскольку Linux – открытая система и прочее, ребята понаписали всяких-разных модулей PAM. Некоторые ссылки можно найти на странице http://www.kernel.org/pub/linux/libs/pam/modules.html.

Ниже приведены шесть экспериментов с изменением настроек PAM. Ни один из них сам по себе особенно не впечатляет, но я надеюсь, что они придадут вам достаточно уверенности в себе и понимания работы PAM, чтобы начать свои собственные эксперименты.

Персональные инструменты
купить
подписаться
Яндекс.Метрика