Открыть сервис

PAM

PAM (от англ. Pluggable Authentication Modules, подключаемые модули аутентификации) — это механизм, реализованный на уровне операционной системы, который предоставляет единый интерфейс для интеграции различных схем аутентификации, авторизации и управления учётными записями пользователей. PAM позволяет разработчикам приложений и системным администраторам подключать и настраивать методы проверки подлинности (парольная, биометрическая, смарт-карты и др.) без изменения исходного кода самих программ. Архитектура PAM является стандартом де-факто для Unix-подобных операционных систем, включая Linux, BSD, macOS и Solaris.

История

Концепция PAM была разработана в 1995 году компанией Sun Microsystems для операционной системы Solaris 2.3. Основной целью было создание гибкого и расширяемого механизма аутентификации, который мог бы заменить жёстко привязанные к конкретным приложениям методы проверки паролей. В 1996 году спецификация PAM была опубликована как открытый стандарт (RFC 86.0). Вскоре после этого проект Linux-PAM (первоначально называвшийся «Linux-PAM» или «libpam») был создан для переноса этой технологии в ядро Linux. Первая стабильная версия Linux-PAM вышла в 1998 году. С тех пор PAM стал обязательным компонентом большинства дистрибутивов Linux, а также был включён в OpenBSD (под названием BSD Authentication) и macOS.

Архитектура и принцип работы

PAM работает по принципу «модульной подключаемости». Вместо того чтобы встраивать логику аутентификации непосредственно в приложение (например, в программу входа в систему login, SSH-сервер или экранную блокировку), разработчик использует библиотеку PAM (обычно libpam.so). Приложение вызывает стандартные функции PAM (например, pam_authenticate, pam_acct_mgmt, pam_open_session), а библиотека, в свою очередь, последовательно обрабатывает запрос через набор конфигурируемых модулей.

Основные компоненты

  1. Библиотека PAM (libpam): центральный компонент, предоставляющий API для приложений. Она загружает и выполняет модули в порядке, определённом конфигурационными файлами.
  2. Модули PAM (.so-файлы): динамически загружаемые библиотеки, каждая из которых реализует определённый метод аутентификации или управления учётными записями. Примеры модулей:
  • pam_unix.so: проверка паролей из стандартных файлов /etc/passwd и /etc/shadow.
  • pam_ldap.so: аутентификация через LDAP-сервер (например, Active Directory).
  • pam_google_authenticator.so: двухфакторная аутентификация (TOTP).
  • pam_cracklib.so: проверка сложности пароля.
  • pam_limits.so: установка лимитов ресурсов для пользователя.
  • pam_deny.so: всегда возвращает отказ (используется как «заглушка»).
  1. Конфигурационные файлы: определяют, какие модули и в каком порядке должны вызываться для каждого приложения или службы. Обычно находятся в каталоге /etc/pam.d/ (например, /etc/pam.d/sshd, /etc/pam.d/login) или в едином файле /etc/pam.conf.

Типы управления (Management Groups)

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

  • auth: проверка подлинности (пароль, токен, биометрия). Модуль может запрашивать у пользователя пароль и проверять его.
  • account: проверка учётной записи (не истёк ли срок действия, не заблокирована ли учётная запись, разрешён ли вход в данное время). Модуль может проверять ограничения по времени, срок действия пароля и т.д.
  • password: смена пароля. Модуль отвечает за обновление пароля в соответствующем хранилище (файлы, LDAP, база данных).
  • session: управление сессией (открытие/закрытие). Модуль может выполнять действия при входе пользователя (например, монтировать домашний каталог, записывать в журнал) и при выходе (размонтировать, очистить временные файлы).

Флаги управления (Control Flags)

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

  • required: модуль должен завершиться успешно, иначе аутентификация будет отклонена. Однако даже при неудаче последующие модули в цепочке всё равно выполняются (чтобы не дать злоумышленнику понять, на каком этапе произошла ошибка).
  • requisite: модуль должен завершиться успешно. Если он возвращает ошибку, аутентификация немедленно прекращается, и последующие модули не выполняются.
  • sufficient: если модуль завершился успешно, аутентификация считается успешной, и последующие модули не выполняются (если только предыдущие required-модули не дали сбой). Если модуль завершился неудачно, ошибка игнорируется, и выполнение цепочки продолжается.
  • optional: результат модуля не влияет на общий результат аутентификации. Используется для логирования или дополнительных проверок, которые не являются критическими.

Конфигурация

Конфигурация PAM обычно хранится в виде файлов в каталоге /etc/pam.d/. Имя файла соответствует имени службы (например, sshd для SSH-сервера, login для текстового входа, sudo для команды sudo). Каждая строка файла имеет следующий формат:

`` тип_управления флаг_управления путь_к_модулю [аргументы] ``

Пример конфигурации для службы sshd (упрощённый):

`` auth required pam_unix.so auth sufficient pam_ldap.so auth requisite pam_deny.so account required pam_unix.so account required pam_ldap.so password required pam_unix.so session required pam_limits.so session required pam_unix.so ``

В этом примере:

  • Для аутентификации сначала проверяется локальный пароль (pam_unix.so). Если он пройден, управление передаётся следующему модулю. Если нет — выполняется pam_ldap.so. Если LDAP-аутентификация успешна, процесс завершается (так как sufficient). Если оба не удались, срабатывает pam_deny.so, который всегда возвращает отказ.
  • Для проверки учётной записи (account) используются оба модуля (pam_unix.so и pam_ldap.so), причём оба обязательны.
  • Для смены пароля используется только локальный модуль.
  • Для управления сессией применяются модули лимитов и локальной сессии.

Применение

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

  • Вход в систему: графические менеджеры входа (GDM, SDDM, LightDM), текстовые login и getty.
  • Удалённый доступ: SSH-сервер (sshd), FTP-серверы (vsftpd, proftpd).
  • Привилегированные команды: sudo, su, pkexec.
  • Экранные блокировки: i3lock, xscreensaver, gnome-screensaver.
  • Серверы баз данных: PostgreSQL (через pam), MySQL (через auth_pam).
  • Веб-серверы: Apache HTTP Server (через модуль mod_authnz_pam), Nginx (через внешние модули).
  • VPN и прокси: OpenVPN, WireGuard (через скрипты или модули).

Преимущества и недостатки

Преимущества

  • Гибкость: возможность комбинировать различные методы аутентификации (пароль, LDAP, двухфакторная, биометрия) без изменения приложений.
  • Централизованное управление: администратор может изменить политику аутентификации для всех приложений, отредактировав один конфигурационный файл.
  • Расширяемость: разработчики могут создавать собственные модули PAM для интеграции с новыми системами.
  • Безопасность: PAM не раскрывает детали неудачной аутентификации (например, какой именно модуль не сработал), что затрудняет атаки перебором.

Недостатки

  • Сложность конфигурации: неправильная настройка цепочек модулей может привести к блокировке доступа всех пользователей или к снижению безопасности.
  • Зависимость от порядка модулей: порядок выполнения модулей критичен, и его изменение может нарушить работу системы.
  • Ограниченная поддержка современных протоколов: PAM изначально не предназначен для работы с веб-токенами (JWT, OAuth) или современными криптографическими протоколами, что требует дополнительных модулей.
  • Потенциальные уязвимости: ошибки в реализации модулей PAM могут привести к обходу аутентификации (например, известная уязвимость CVE-2021-3560 в pam_systemd).

Интересные факты

  • В некоторых дистрибутивах Linux (например, Ubuntu) по умолчанию используется модуль pam_winbind.so для интеграции с доменами Windows Active Directory.
  • Модуль pam_cracklib.so (или его современный аналог pam_pwquality.so) позволяет проверять сложность пароля на основе словарей, что снижает риск подбора простых паролей.
  • В macOS PAM используется для аутентификации через Touch ID (модуль pam_tid.so).
  • Существует модуль pam_echo.so, который выводит сообщение пользователю во время аутентификации (например, предупреждение о политике безопасности).
  • В системах с SELinux PAM может использоваться для установки контекста безопасности для пользовательской сессии.

Источники

  1. RFC 86.0 — "Pluggable Authentication Modules". Sun Microsystems, 1996.
  2. Linux-PAM System Administrator's Guide. Документация проекта Linux-PAM.
  3. "The Linux Programming Interface" by Michael Kerrisk. Глава 40: "Pluggable Authentication Modules".
  4. "PAM: A Flexible Authentication Framework" — статья на сайте IBM DeveloperWorks.
  5. Документация дистрибутивов Linux (Ubuntu, Red Hat, Arch Linux) по настройке PAM.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →