Лабораторная работа "Изучение 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

  1. Определите, использует ли данная программа систему PAM, или нет. Например:

     $ ldd /bin/login | grep pam
     	libpam.so.0 => /lib64/libpam.so.0 (0x00007fe3a8428000)
     	libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007fe3a8223000)
    

Расположение в файловой системе

  1. Изучите содержимое каталогов, в которых хранятся библиотеки и модули:

     $ ls -l /lib64/libpam*
     $ ls -l /lib64/security/
    

Конфигурационные файлы

  1. Изучите формат конфигурационных файлов. Определите управляющие группы и флаги.

     $ vi /etc/pam.d/system-auth
     $ vi /etc/pam.d/su
    

Изучение модулей

Разрешите всем пользователям переключаться в root без ввода пароля с помощью команды su

  1. Включите в начало файла /etc/pam.d/su (в стеке auth) строку:

     auth sufficient pam_permit.so
    
  2. Зайдите в систему как обычный пользователь и проверьте, что можете переключиться в режим root с помощью su без ввода пароля, например, выполните команду:

     $ su -c "hostname mephi"
    
  3. Верните систему в исходное состояние.

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

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

     auth requisite pam_deny.so
    
  2. Зайдите в систему как обычный пользователь и убедитесь, что переключения в режим root не происходит.

  3. Верните систему в исходное состояние.

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

  1. Модуль 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
    
  2. Добавте пользователя user1 в группу wheel.

  3. Зайдите в систему как user1 и попробуйте использовать команду su. Будет запрошен пароль администратора, после чего должен открыться сеанс администратора.

  4. Зайдите в систему под другим пользователем (не членом группы wheel) и попробуйте использовать команду su. Снова будет запрошен пароль администратора, но переключиться в сеанс root не удастся.

  5. Измените управляющий флаг для модуля pam_wheel на requisite. Повторите эксперимент. Что изменилось и почему?

  6. Верните систему в исходное состояние.

Запретите вход в систему пользователю root через терминалы

  1. Модуль pam_securetty.so запрещает вход в систему от имени root на терминалах, которых нет в списке /etc/securetty. Добавьте в файл /etc/pam.d/login на вершину стека auth следующую строку:

     auth required pam_securetty.so
    
  2. Очистите список, предварительно создав резервную копию файла. Обратите внимание, что пустой файл /etc/securetty запрещает вход root на все терминалы, а отсутствие этого файла - разрешает.

  3. Попытайтесь зайти в систему через терминал под именем root, введя правильный пароль.

  4. Убедитесь, что можно зайти в систему под обычным пользователем.

  5. Верните систему в исходное состояние.

Качество пароля

  1. Модуль pam_pwquality.so проверяет качество пароля. Прочтите справку:

     $ man pam_pwquality
    
  2. Добавьте в файл /etc/security/pwquality.conf следующую строку:

     minlen = 12
    
  3. Добавьте в файл /etc/pam.d/system-auth следующую строку:

     password requisite pam_pwquality.so try_first_pass local_users_only retry=5 authtok_type=MEPhI
    
  4. Попытайтесь изменить свой пароль, выбирая его длину меньше 11. Сколько попыток даётся пользователю?

  5. Верните систему в исходное состояние.

Ограничение на вход в систему

  1. Модуль pam_limits.so проверяет различные лимиты. Прочтите справку:

     $ man pam_limits
    
  2. Добавьте в файл /etc/security/limits.conf следующую строку:

     user1 hard maxlogins 2
    
  3. Попытайтесь зайти в систему через терминалы больше двух раз. Сколько раз удалось зайти?

  4. Верните систему в исходное состояние.

Разработка программы, использующей PAM

  1. Разработайте простую программу, выполняющую обращение к PAM. В качестве прототипа используйте пример.

  2. Скомпилируйте программу:

     $ gcc check_user.c -o check_user -lpam -lpam_misc
    
  3. Создайте в каталоге /etc/pam.d/ файл с именем сервиса (check) со следующим содержимым:

     auth       required     pam_unix.so
     account    required     pam_unix.so
    
  4. Проверьте работоспособность программы на примере собственного имени.

  5. Создайте дополнительного пользователя и проверьте работоспособность программы для нового пользователя.

  6. Проведите эксперименты, добавляя в конфигурационный файл /etc/pam.d/check вызов изученных выше модулей с различными сочетаниями управляющих флагов.

  7. Изучите функцию pam_strerror(), которая возвращает указатель на строку, описывающую код ошибки, переданный через второй аргумент errnum.

     #include <security/pam_appl.h>
     const char *pam_strerror( pamh, errnum);	 
     pam_handle_t *pamh;
     int errnum;
    
  8. Добавьте в пример вызов данной функции и вывод на экран описания кода возврата (ошибки) после функций pam_authenticate() и pam_acct_mgmt(). Например:

     printf("error code: %s\n", pam_strerror(pamh, retval));
    
  9. Добейтесь ситуации, когда функция pam_authenticate() завершается успешно, а функция pam_acct_mgmt() завершается с ошибкой. Используйте команды passwd (ключи l, u, e) и chage -E.

Литература

  1. https://www.man7.org/linux/man-pages/man8/pam.8.html
  2. https://www.man7.org/linux/man-pages/man5/pam.d.5.html
  3. https://www.man7.org/linux/man-pages/man3/pam.3.html