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), а библиотека, в свою очередь, последовательно обрабатывает запрос через набор конфигурируемых модулей.
Основные компоненты
- Библиотека PAM (
libpam): центральный компонент, предоставляющий API для приложений. Она загружает и выполняет модули в порядке, определённом конфигурационными файлами. - Модули 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: всегда возвращает отказ (используется как «заглушка»).
- Конфигурационные файлы: определяют, какие модули и в каком порядке должны вызываться для каждого приложения или службы. Обычно находятся в каталоге
/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 может использоваться для установки контекста безопасности для пользовательской сессии.
Источники
- RFC 86.0 — "Pluggable Authentication Modules". Sun Microsystems, 1996.
- Linux-PAM System Administrator's Guide. Документация проекта Linux-PAM.
- "The Linux Programming Interface" by Michael Kerrisk. Глава 40: "Pluggable Authentication Modules".
- "PAM: A Flexible Authentication Framework" — статья на сайте IBM DeveloperWorks.
- Документация дистрибутивов Linux (Ubuntu, Red Hat, Arch Linux) по настройке PAM.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →