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, и будьте готовы выполнить экстренную загрузку, если понадобится их восстановить.

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

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

Как узнать, использует ли PAM та или иная программа? Ну, первый способ – посмотреть на файлы конфигурации в /etc/pam.d. Теоретически это подскажет нам ответ. Способ похитрее – посмотреть, скомпонована ли программа с библиотекой PAM. Это можно сделать с помощью следующей команды:

$ ldd /bin/login | grep libpam 
libpam.so.0 => /lib/libpam.so.0
(0xb7f47000)
libpam_misc.so.0 => /lib/libpam_misc.so.0
(0xb7f43000)

если вывод похож на этот, программа использует PAM. Если вывод отсутствует – нет.

(Последние версии 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, чтобы начать свои собственные эксперименты.

Документация PAM

Возможно, вам придется немного покопаться, чтобы найти документацию на PAM, потому что в разных дистрибутивах она хранится в разных местах. Например, в RHEL5 man-страницы для модулей PAM входят в основной пакет PAM; в Ubuntu документация находится в каталоге /usr/share/doc/libpam-doc и является частью пакета libpam-doc, который нужно устанавливать отдельно. Если вы найдете файл под названием Linux-PAM System Administrators' Guide, это отличное начало. Если локальной копии нет, ее можно скачать на странице http://kernel.org/pub/linux/libs/pam/Linux-PAM-html/Linux-PAM_SAG.html.

Часть 2: Экспериментируем с PAM

Позволим всем пользователям переключаться в root без пароля через su.

Что делать: Замените все строки файла /etc/pam.d/su, относящиеся к стеку auth, единственной строкой:

auth sufficient pam_permit.so

Как проверить: Зайдите в систему как обычный пользователь и проверьте, что можете переключиться в root с помощью su без ввода пароля. Это может показаться рисковым, но все же менее опасно, чем разрешить пользователям сразу заходить в систему с привилегиями администратора. Например, вы можете зайти в систему как обычный пользователь, а затем выполнить команду

$ su -c "date 09201155"

чтобы установить системное время (действие, требующее привилегий администратора).

Запретим всем пользователям использовать su

Что делать: Оставьте в файле /etc/pam.d/su только одну строку, относящуюся к стеку auth:

auth requisite pam_deny.so

Как проверить: Зайдите в систему как обычный пользователь и убедитесь, что переключения в режим администратора не происходит: у вас даже не спрашивают пароль. Конечно, можно запретить su, и сняв права на выполнение файла самой программы. Хотя отключение su на первый взгляд повышает безопасность системы, на деле вы вынуждаете администратора всегда заходить в систему как root, вместо кратковременного переключения в root для действий с высшими привилегиями.

Разрешим su только пользователям из некоторой группы

Что делать: Для начала нам нужен хотя бы один пользователь в этой группе — назовем ее, например, wheel. Чтобы добавить пользователя chris в группу wheel, выполните следующую команду от имени администратора:

# usermod -G wheel chris

Теперь отредактируйте файл /etc/pam.d/su, чтобы стек auth выглядел следующим образом:

auth sufficient pam_rootok.so
auth required pam_wheel use_uid
auth include system-auth

Как проверить: Зайдите в систему как chris (или как любой другой пользователь из группы wheel) и попробуйте использовать su. Будет запрошен пароль администратора, после чего должен открыться сеанс администратора. Теперь попробуйте зайти в систему под другим пользователем — не членом группы wheel, и сделать то же самое. Снова будет запрошен пароль администратора, но переключиться в сеанс root не удастся. Можете попробовать изменить управляющий флажок для модуля pam_wheel в requisite — для этого измените строку в файле /etc/pam.d/su:

auth requisite pam_wheel use_uid

Вопрос на засыпку: какое произойдет изменение? Проверьте себя. Ну что, начали понимать, как настройки PAM формируют политику безопасности?

Запретим вход в систему как root

Идея здесь в том, чтобы пользователи не могли войти в систему как администраторы: то есть зайти в систему придется как обычному пользователю, а затем переключиться в режим root с помощью su. (Предварительно убедитесь, что есть хотя бы один пользователь, имеющий на это право, не то вы заблокируете компьютер.) Нам нужно запретить вход как на виртуальные терминалы, так и на графический рабочий стол.

Что делать: Чтобы запретить вход на виртуальные терминалы, добавьте в файл /etc/pam/d/login строку

auth required pam_securetty.so

на верхушку стека auth (может быть, она уже есть там). Как мы уже видели, этот модуль запрещает вход в систему от имени root на терминалах, которых нет в списке /etc/securetty. Теперь мы можем очистить этот список с помощью пары команд:

# cp /etc/securetty /etc/securetty.saved
# echo "" > /etc/securetty

(Обратите внимание, что пустой файл /etc/securetty и отсутствие этого файла — совсем не одно и то же. В первом случае запрещается вход под root на все терминалы, а во втором, наоборот, разрешается.) Далее, чтобы запретить вход от имени root в графический рабочий стол, добавьте ту же самую строку в стек auth в файле /etc/pam.d/gdm.

Как проверить: Попытайтесь зайти в систему как root (с правильным паролем) — и через виртуальный терминал, и через графический рабочий стол. Обе попытки должны потерпеть неудачу. Убедитесь, что вы можете зайти в систему как обычный пользователь. Обратите внимание, что если прибавить к этому Эксперимент 3, безопасность системы существенно повысится, потому что для получения доступа администратора придется сначала зайти в систему как пользователь из группы wheel, а затем открыть сеанс администратора через su. Даже пронюхав пароль администратора, взломщик не получит его привилегий.

Используем сложные пароли

В этом эксперименте мы используем модуль pam_passwdqc стека password, чтобы заставить пользователей назначать сложные пароли. (Это сработает только в том случае, когда пользователь задает или изменяет свой пароль, и не позволит выявить «слабости» уже действующих паролей.)

Рис. 3: Параметры модуля pam_passwdqc.

Приемлем ли пароль?

Пароль Длина Tипов символов ОК?
monpiastoria 12 1 Да
LinuxFormat 11 2 Да
beld*Grob 9 3 Да
4Me+You 7 4 Да
splodgerat 10 1 Нет
Four+five 9 2 Нет †
gosH!!2 7 3 Нет *
x4Z! 4 4 Нет

Что делать: В Red Hat для проверки длины паролей уже используется модуль pam_cracklib, вызываемый из файла system-auth. Нам просто нужно заменить строку pam_cracklib следующей строкой:

password requisite pam_passwdqc.so min=12,10,10,8,6
retry=3

Рис. 3 иллюстрирует параметры модуля pam_passwdqc. Качество пароля определяется его длиной, и в зависимости от количества типов символов, используемых в пароле, можно задать разные значения минимальной длину пароля. Существуют четыре типа символов: буквы нижнего и верхнего регистров, цифры и остальные символы. Заглавная буква в первом символе и цифра в последнем символе не в счет.

Как проверить: Попробуйте изменить свой пароль. Задавайте разные строки и в каждом случае подсчитывайте общее число символов и число типов символов, предполагая, что пароль должен быть приемлемым. Несколько примеров приведены во врезке «Допустим ли пароль?».

Запретим обычным пользователям выключать систему

Во многих системах обычным пользователям (не администраторам) дозволено выключать или перезагружать систему с помощью команд halt, shutdown и reboot — для рабочей машины предприятия, пожалуй, не лучшая идея. В данном эксперименте мы изменим конфигурацию PAM для этих команд, чтобы один лишь root мог выключать компьютер.

Что делать: Откройте файл настроек PAM для команды halt (/etc/pam.d/halt). В моем Red Hat стек auth для команды halt выглядит так:

 auth sufficient pam_rootok.so
 auth required pam_console.so

Измените его следующим образом:

auth sufficient pam_rootok.so
auth required pam_deny.so

Как проверить: Зайдите в систему как обычный пользователь и попробуйте остановить систему командой halt. У вас больше не должно этого получаться. Для полноты решения внесите те же изменения в файлы настроек для команд shutdown и reboot.

'Д-р Крис Браун — автор книги SUSE  Linux:  A  Complete  Guide to  Novell’s  Community  Distribution (Издательство «O’Reilly», 2006). Некоторые главы можно найти на странице http://www.oreilly.com/catalog/suselinux/. LXF

Часто используемые модули РАМ

Модуль Действие Описание
pam_unix auth, session, password Выполняет аутентификацию в традиционном стиле Unix, используя хэши паролей, которые хранятся в /etc/shadow. Включен в файлы настроек PAM многих приложений, непосредственно или с помощью директивы include.
pam_limits session Устанавливает ограничения на системные ресурсы, отпускаемые на время пользовательского сеанса. По умолчанию эти ограничения берутся из файла /etc/security/limits.conf; здесь можно задать «жесткие» и «мягкие» границы для таких параметров, как максимальное число процессов, максимальный размер файла, процессорное время и т. д.)
pam_rootok auth Завершается успешно, если вы — администратор системы, и возвращает ошибку в противном случае. Обычно используется в сочетании с другими модулями аутентификации для реализации правила «Если вы администратор, можете продолжить и выполнить действие, если нет — необходима авторизация». Стек для этой политики может выглядеть так:

 auth sufficient pam_rootok.so
 auth required pam_unix.so

pam_cracklib password Проверяет качество пароля, затем еще раз проверяет пароль по системному словарю и ряду правил «плохого подбора пароля». Этот модуль обычно используется в стеке password, чтобы проверить качество пароля перед передачей его следующему модулю стека (обычно pam_unix), который обновляет пароль.
pam_passwdqc password Альтернативный модуль для проверки качества пароля, который поддерживает словосочетания (pass phrases) и может генерировать случайные пароли. Как и pam_cracklib, этот модуль обычно используется в стеке password для проверки качества пароля перед его обновлением. Подробный пример приведен в эксперименте 5.
pam_permit auth, account, session, password Всегда говорит «да» и возвращает успешный результат выполнения.
pam_deny auth, account, session, password Всегда говорит «нет» и возвращает ошибку. Обычно он используется только в самом низу стека для гарантированного статуса «ошибка».
pam_warn auth, account, session, password Просто отправляет сообщение (включая имя сервиса, терминал, имя пользователя и удаленный хост) службе журнала syslogd. Может быть использован, например, ближе к нижней части стека PAM для записи в журнал информации о неудавшихся попытках аутентификации как раз перед тем, как модуль pam_deny отклонит их.
pam_motd session Выводит «приветствие дня» (по умолчанию это файл /etc/motd), обычно после успешного входа в систему.
pam_securetty aurg Нет, это не опечатка в слове «security». Модуль pam_securetty разрешает вход в систему от имени root только с «безопасных терминалов» («secure terminals»), перечисленных в файле /etc/securetty. (Запомните, tty на языке Linux означает «терминальное устройство»). Модуль никак не влияет на вход в систему для остальных пользователей. Этот способ управления доступом имел больше смысла в те дни, когда Unix работал на многопользовательских мини-компьютерах с 20 терминалами, включенными в порты RS-232; файл securetty мог использоваться для ограничения входа от имени root терминалом, запертым в офисе системного администратора. Однако он способен послужить и для полного запрета входа в систему под пользователем root… К этой идее мы еще вернемся в тексте.
pam_wheel auth, account Используется программами типа su. Этот модуль разрешает администраторский доступ только пользователям, включенным в группу wheel. (Историческая справка: Использование названия «wheel» для группы привилегированных пользователей уходит корнями в давние времена. Оно точно было в ранних версиях Unix, и пришло, если верить файлу жаргона (http://www.catb.org/jargon/index.html, из ОС Twenex, распространенной в шестидесятых годах. Но я понятия не имею, почему ее называют «wheel».)
pam_winbind auth Аутентифицирует пользователей в соответствии с учетными данными домена Windows путем взаимодействия с демоном winbind (который, в свою очередь, взаимодействует с контроллером домена Windows). Это важный компонент для ситуаций, когда вы добавляете Linux в существующую инфраструктуру на базе Windows и хотите поддерживать между этими системами общую базу данных учетных записей пользователей.
pam_nologin auth, account Запрещает пользователям (кроме root) вход в систему, если существует файл /etc/nologin. В некоторых дистрибутивах этот файл создается программой shutdown, чтобы запретить вход в систему во время ее остановки.
Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию