Лабораторная работа "Изучение PAM" - efanov/mephi GitHub Wiki
Цель
Изучить систему подгружаемых модулей аутентификации PAM (Pluggable Authentication Modules).
Задачи
- Изучить назначение, состав и возможности PAM.
- Изучить API, научиться писать программы, использующие PAM.
- Научиться создавать собственные модули (в будущем).
Обзор
Расположение файлов:
- Конфигурационные файлы:
/etc/pam.conf
,/etc/pam.d/
. - Расположение модулей:
/lib64/security/
.
Управляющие группы:
- auth - подтверждение личности пользователя. Обычно это имя пользователя и пароль, но возможны и другие варианты: смарт-карта, биометрические методы (отпечатки пальцев или сканирование сетчатки глаза).
- account - действия, определяющие, можно ли пользователю зайти в систему. Например ограничение входа пользователя в систему в зависимости от времени суток.
- session - действия по выделению ресурсов, которые могут потребоваться пользователю во время сессии, например, монтирование домашнего каталога пользователя, установка лимитов на использование ресурсов системы, вывод ежедневного сообщения и т. д.
- password - действия по обновлению "секрета" пользователя (обычно пароля).
Управляющие флаги:
- requisite - если модуль завершается с ошибкой, PAM немедленно возвращает приложению ошибку, другие модули стека не вызываются.
- required - если модуль завершается с ошибкой, PAM возвращает ошибку приложению, но продолжает вызывать остальные модули стека.
- sufficient - если модуль завершается успешно, PAM возвращает приложению результат «выполнен», и остальные модули стека не вызываются. (Предполагается, что никакой модуль с required выше в стеке не отказал.)
- optional - результат работы модуля (выполнен/ошибка) игнорируется. Обычно это означает, что модуль вызывается для выполнения некой операции, не имеющей отношения к принятию решения «пропустить/отказать» для всего стека.
- include - включает все строки данного типа из конфигурационного файла, переданного в качестве аргумента.
- substack - включает все строки данного типа из конфигурационного файла, переданного в качестве аргумента.
Задание
Совет: создавайте резервные копии системных файлов, которые вы меняете.
Использование PAM
-
Определите, использует ли данная программа систему PAM, или нет. Например:
$ ldd /bin/login | grep pam libpam.so.0 => /lib64/libpam.so.0 (0x00007fe3a8428000) libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007fe3a8223000)
Расположение в файловой системе
-
Изучите содержимое каталогов, в которых хранятся библиотеки и модули:
$ ls -l /lib64/libpam* $ ls -l /lib64/security/
Конфигурационные файлы
-
Изучите формат конфигурационных файлов. Определите управляющие группы и флаги.
$ vi /etc/pam.d/system-auth $ vi /etc/pam.d/su
Изучение модулей
Разрешите всем пользователям переключаться в root без ввода пароля с помощью команды su
-
Включите в начало файла
/etc/pam.d/su
(в стекеauth
) строку:auth sufficient pam_permit.so
-
Зайдите в систему как обычный пользователь и проверьте, что можете переключиться в режим root с помощью su без ввода пароля, например, выполните команду:
$ su -c "hostname mephi"
-
Верните систему в исходное состояние.
Запретите всем пользователям использовать команду su
-
Оставьте в файле
/etc/pam.d/su
только одну строку, относящуюся к стекуauth
:auth requisite pam_deny.so
-
Зайдите в систему как обычный пользователь и убедитесь, что переключения в режим root не происходит.
-
Верните систему в исходное состояние.
Разрешите выполнять команду su только пользователям из группы wheel
-
Модуль pam_wheel.so разрешает доступ только тем пользователям, которые входят в группу wheel. Отредактируйте файл
/etc/pam.d/su
так, чтобы стек auth выглядел следующим образом:auth sufficient pam_rootok.so auth required pam_wheel.so use_uid auth substack system-auth auth include postlogin
-
Добавте пользователя user1 в группу wheel.
-
Зайдите в систему как user1 и попробуйте использовать команду su. Будет запрошен пароль администратора, после чего должен открыться сеанс администратора.
-
Зайдите в систему под другим пользователем (не членом группы wheel) и попробуйте использовать команду su. Снова будет запрошен пароль администратора, но переключиться в сеанс root не удастся.
-
Измените управляющий флаг для модуля pam_wheel на requisite. Повторите эксперимент. Что изменилось и почему?
-
Верните систему в исходное состояние.
Запретите вход в систему пользователю root через терминалы
-
Модуль pam_securetty.so запрещает вход в систему от имени root на терминалах, которых нет в списке
/etc/securetty
. Добавьте в файл/etc/pam.d/login
на вершину стекаauth
следующую строку:auth required pam_securetty.so
-
Очистите список, предварительно создав резервную копию файла. Обратите внимание, что пустой файл
/etc/securetty
запрещает вход root на все терминалы, а отсутствие этого файла - разрешает. -
Попытайтесь зайти в систему через терминал под именем root, введя правильный пароль.
-
Убедитесь, что можно зайти в систему под обычным пользователем.
-
Верните систему в исходное состояние.
Качество пароля
-
Модуль pam_pwquality.so проверяет качество пароля. Прочтите справку:
$ man pam_pwquality
-
Добавьте в файл
/etc/security/pwquality.conf
следующую строку:minlen = 12
-
Добавьте в файл /etc/pam.d/system-auth следующую строку:
password requisite pam_pwquality.so try_first_pass local_users_only retry=5 authtok_type=MEPhI
-
Попытайтесь изменить свой пароль, выбирая его длину меньше 11. Сколько попыток даётся пользователю?
-
Верните систему в исходное состояние.
Ограничение на вход в систему
-
Модуль pam_limits.so проверяет различные лимиты. Прочтите справку:
$ man pam_limits
-
Добавьте в файл
/etc/security/limits.conf
следующую строку:user1 hard maxlogins 2
-
Попытайтесь зайти в систему через терминалы больше двух раз. Сколько раз удалось зайти?
-
Верните систему в исходное состояние.
Разработка программы, использующей PAM
-
Разработайте простую программу, выполняющую обращение к PAM. В качестве прототипа используйте пример.
-
Скомпилируйте программу:
$ gcc check_user.c -o check_user -lpam -lpam_misc
-
Создайте в каталоге
/etc/pam.d/
файл с именем сервиса (check) со следующим содержимым:auth required pam_unix.so account required pam_unix.so
-
Проверьте работоспособность программы на примере собственного имени.
-
Создайте дополнительного пользователя и проверьте работоспособность программы для нового пользователя.
-
Проведите эксперименты, добавляя в конфигурационный файл
/etc/pam.d/check
вызов изученных выше модулей с различными сочетаниями управляющих флагов. -
Изучите функцию pam_strerror(), которая возвращает указатель на строку, описывающую код ошибки, переданный через второй аргумент errnum.
#include <security/pam_appl.h> const char *pam_strerror( pamh, errnum); pam_handle_t *pamh; int errnum;
-
Добавьте в пример вызов данной функции и вывод на экран описания кода возврата (ошибки) после функций pam_authenticate() и pam_acct_mgmt(). Например:
printf("error code: %s\n", pam_strerror(pamh, retval));
-
Добейтесь ситуации, когда функция pam_authenticate() завершается успешно, а функция pam_acct_mgmt() завершается с ошибкой. Используйте команды passwd (ключи l, u, e) и chage -E.