Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Безопасность работы с системой Linux

PAM на страже ваших компьютеров

Оригинал: PAM - Securing Linux Boxes Everywhere
Автор: Federico Kereki
Дата: 1 января 2009
Перевод: Александр Тарасов aka oioki
Дата перевода: 27 июля 2009

Если вы увлекаетесь британским детективом и знаете, кто такие Шерлок Холмс, Секстон Блейк, мистер Ридер, мисс Марпл, Эркюль Пуаро, Отец Браун, доктор Джон Эвелин Торндайк и лорд Питер Уимсли, тогда вы наверняка знаете персонажа, придуманного Э.У. Хорнунгом (это зять сэра Артура Конан-Дойля, создателя Шерлока Холмса) - джентльмен-вор Раффлс. В рассказе "Подарок к юбилею" он был очарован старинной золотой чашей, выставленной в Британском музее. Найдя единственного охранника, Раффлс расспрашивает его о его службе, и получает самонадеянный ответ: "Видите ли, сэр, сейчас еще рано, однако днем здесь будет полно народу, и чем больше людей, тем безопаснее." (пер. А. Егорова). В операционной системе Linux безопасность обеспечивается не количеством глаз (которое как раз не спасло беднягу-охранника; в конце статьи можно найти ссылку на текст рассказа), а с помощью PAM (Pluggable Authentication Modules, Подключаемых Модулей Аутентификации). В этой статье мы познакомимся с функциями, настройками и использованием PAM.

Давайте начнем с самого начала и рассмотрим, как программа аутентифицирует пользователя. Если не будет единого базового механизма аутентификации, тогда каждая программа должна содержать в себе логику аутентификации, такую как просмотр файла /etc/passwd на наличие пользователя и соответствия введенного пароля. Но что если таких программ много? Придется включать одну и ту же логику в каждую из них? А если требования к безопасности изменятся? Что, придется модифицировать и перекомпилировать все эти программы? Очевидно, это плохой метод и наверняка не самый безопасный. Как бы сделать так, чтобы все приложения сразу обновлялись до требуемого метода аутентификации и удовлетворяли новым требованиям безопасности?

Проект PAM предоставляет решение путем добавления дополнительного программного уровня. Программа, которой требуется аутентификация, должна использовать стандартную библиотеку или API (Application Programming Interface, Прикладной программный интерфейс), а системный администратор должен указать порядок аутентификации для данной конкретной программы (проверки осуществляются отдельными модулями; можно даже запрограммировать собственные модули). Таким образом, можно динамически изменять требования безопасности, причем все программы будут автоматически следовать вашим новым указаниям. Другими словами, можно модифицировать механизмы аутентификации программ (которые собраны с поддержкой PAM) без пересборки самих программ. С точки зрения программиста это очень хороший подход, ведь ему не требуется связываться с механизмами аутентификации. Когда мы используем модули PAM, требуемые проверки выполняются автоматически (см. рисунок 1).

Библиотека PAM разбивает механизм аутентификации на четыре группы (см. таблицу 1). Обратите внимание, что не всем программам требуются все четыре действия. К примеру, команде passwd требуется лишь последняя группа. Подсказка: как определить, использует ли программа PAM? Нужно вывести с помощью утилиты ldd все разделяемые библиотеки, используемые данной программой, и найти среди них libpam.so; пример см. в листинге 1.


Рисунок 1. Когда программа делает запрос аутентификации, библиотека PAM исполняет код модулей, указанных в конфигурационном файле и принимает решение, принять (успех) или отклонить (неудача) этот запрос.

Листинг 1. Чтобы узнать, использует ли программа PAM, воспользуйтесь утилитой ldd и найдите в ее выводе библиотеку libpam.so. Нужно писать полный путь до исполняемого файла. Если не знаете полный путь, узнайте его с помощью команды whereis. Например:

$ whereis login
login: /bin/login /etc/login.defs /usr/share/man/man3/login.3.gz 
 ↪/usr/share/man/man1/login.1.gz
$ ldd /bin/login
        linux-gate.so.1 =>  (0xffffe000)
        libpam_misc.so.0 => /lib/libpam_misc.so.0 (0xb7eff000)
        libpam.so.0 => /lib/libpam.so.0 (0xb7ef3000)
        libaudit.so.0 => /lib/libaudit.so.0 (0xb7edf000)
        libc.so.6 => /lib/libc.so.6 (0xb7dac000)
        libdl.so.2 => /lib/libdl.so.2 (0xb7da8000)
        /lib/ld-linux.so.2 (0xb7f25000)

Таблица 1. Проверки PAM подразделяются на четыре группы, организованных в виде очереди. Задействование тех или иных групп определяется запросами пользователя.

auth Относится к аутентификации пользователей, к примеру, когда нужно ввести пароль. Обычно эти проверки идут первыми.
account Относится к управлению учетными записями, к примеру, сюда входит проверка устаревания пароля и проверки по времени доступа. Когда пользователь идентифицирован с помощью модулей auth, модули account определяют, можно ли пользователю давать доступ.
session Относится к управлению соединениями, например, журналирование входов в систему, журналирование выполненных действий или выполнение очистки по завершению сессии.
password Содержит функции, например, обновление пароля пользователя.

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

required Этот модуль должен завершиться успешно. Если он завершается неудачей, вся проверка также завершается неудачей. Если все модули помечены как required, тогда непрохождение любой из проверок будет означать отказ в доступе, хотя все другие модули в группе также будут исполнены.
requisite Работает аналогично required, однако в случае неудачи, возврат происходит незамедлительно, и остальные модули группы даже не исполняются.
sufficient Если этот модуль завершается успешно, остальные модули не исполняются, и вся проверка завершается успешно.
optional Если этот модуль завершается неудачно, тогда окончательное решение зависит от результата исполнения других модулей. Если в конфигурации нет модулей типа required или sufficient, тогда для разрешения доступа хотя бы один из модулей типа optional должен завершиться успешно.

Настройка PAM

Для каждой службы (такой как login или SSH), необходимо указать, какие проверки будут сделаны в каждой группе. Список этих действий называется стеком. В завимости от результата исполнения в каждом стеке, пользователю будет разрешен или отклонен доступ, либо что-то будет позволено или не позволено. Исполняемые действия задаются для каждой службы в отдельном файле в каталоге /etc/pam.d (новый метод), либо в едином файле /etc/pam.conf (старый метод). В данной статье рассмотрен первый, новый метод.

Внимание! Помните, что безрассудная правка конфигурационных файлов может сделать вашу систему неработоспособной! К примеру, удалив все конфигурационные файлы, вы не сможете вновь войти в систему. Поэтому убедитесь, что у вас под рукой есть резервная копия всех конфигов и загрузочный CD.

Каждый стек состоит из модулей, выполняющихся последовательно в заданном порядке. Для каждого модуля нужно указать, является ли он обязательным (неудача автоматически запрещает доступ), достаточным (успех автоматически разрешает доступ) либо желательным (проводит альтернативные проверки). В таблице 2 расписаны эти управляющие флаги. Файл конфигурации каждой службы состоит из списка правил, каждое начинается с новой строки (длинные строки можно разбивать с помощью символа \, но это требуется крайне редко). Строки, начинающиеся с символа решетки (#), являются комментариями и поэтому игнорируются. Каждое правило состоит из трех полей: контекст (таблица 1), управляющие флаги (таблица 2) и модуль, который требуется исполнить, с дополнительными (необязательными) параметрами. К примеру, спецификации PAM-проверок для программы login можно найти в файле /etc/pam.d/login.

Управляющие флаги могут быть и более сложными, но я не стану перечислять их все. Если интересно, в конце статьи есть ссылка на подробности. Также можно использовать директиву include, к примеру auth include common-account, которая включает содержимое (а именно правила) других файлов.

Существует особый сервис под названием other, который используется в тех случаях, когда для программы, использующей PAM, не найдено соответствующего конфигурационного файла. С точки зрения безопасности будет неплохо начать с создания /etc/pam.d/other такого, как на листинге 2. Все попытки войти в систему будут отклонены, а администратору будет отправлено уведомление об этом событии. Если хотите сделать более либеральные правила, замените pam_deny.so на pam_unix2.so, тогда будет использоваться стандартный метод аутентификации Linux, хотя уведомление все равно будет отправлено (см. листинг 3). Если не заботиться о безопасности, замените pam_deny.so на pam_permit.so - это даст доступ для всех, но потом пеняйте на себя.

Рекомендую провести беглый осмотр всех файлов в /etc/pam.d. Если найдете файлы неиспользуемых приложений, просто переименуйте их, и PAM задействует стандартную конфигурацию "other". Если позже программа понадобится, переименуйте соответствующий конфигурационный файл обратно, и все встанет на свои места.

Листинг 2. Безопасные правила "other" отклоняют все запросы доступа к службе, для которой не указаны другие правила. Модуль pam_deny.so всегда завершается неудачей, поэтому все попытки получения доступа будут отклонены, вдобавок к этому модуль pam_warn.so отправит системному администратору уведомление об этом событии.

#
# по умолчанию; запрещает любой доступ
#
auth        required    pam_deny.so
auth        required    pam_warn.so
account     required    pam_deny.so
password    required    pam_deny.so
password    required    pam_warn.so
session     required    pam_deny.so

Листинг 3. Правила PAM, эквивалентные стандартным правилам безопасности UNIX. Замечание: в некоторых дистрибутивах нужно указывать модуль pam_unix.so.

#
# стандартные минималистичные правила UNIX
#
auth        required    pam_unix2.so
account     required    pam_unix2.so
password    required    pam_unix2.so
session     required    pam_unix2.so

Листинг 4. Файл /etc/pam.d/sshd содержит правила безопасности для SSH-соединений. Обратите внимание, что модуль pam_access.so добавляет дополнительные проверки (см. листинг 5).

auth        required    pam_unix2.so
auth        required    pam_nologin.so
account     required    pam_unix2.so
account     required    pam_access.so
session     required    pam_limits.so
session     required    pam_unix2.so
session     optional    pam_umask.so
password    requisite   pam_pwcheck.so cracklib
password    required    pam_unix2.so use_authtok

Листинг 5. Файл /etc/security/access.conf используется модулем pam_access.so, чтобы определить, каким пользователям позволено входить в систему и с каких IP-адресов. В данном примере, в систему теоретически может войти любой пользователь локальной сети, но лишь пользователю remoteKereki позволен удаленный доступ извне.

+ : ALL : 192.168.
+ : remoteKereki : ALL
- : ALL : ALL

Листинг 6. Секция password в файле /etc/pam.d/passwd определяет хорошие требования, предъявляемые к новым паролям.

#
# retry=3     три подхода для установки нового пароля
# minlen=10   требуется как минимум десять символов
# ucredit=-1  как минимум один символ в верхнем регистре
# lcredit=0   любое количество символов в нижнем регистре
# dcredit=-2  как минимум две цифры
# ocredit=-1  как минимум один неалфавитный символ
#
password required pam_cracklib.so retry=3 minlen=10 \
     ucredit=-1 lcredit=0 dcredit=-2 ocredit=-1 
#
# Модуль pam_cracklib лишь проверяет пароли, но не сохраняет их.
# Для этого нам потребуется еще стандартный модуль pam_unix.
# Параметр use_authtok означает, что модуль pam_unix не будет
# запрашивать пароль, а будет как раз использовать этот,
# предоставленный модулем pam_cracklib.
#
password  required pam_unix.so use_authtok nullok

Безопасный удаленный доступ

Рассмотрим конкретное применение этого механизма. Я хочу заходить на свою машину удаленно по SSH, но не хочу позволять это делать другим пользователям (см. листинг 4). Поэтому я соответствующим образом настроил файл /etc/pam.d/sshd. В разделе "Модули, модули кругом" в конце статьи можно найти описание этих и других модулей. Вот некоторые из них:

  • pam_unix2.so: предоставляет традиционные методы по работе с паролями, правами и сессиями, классический UNIX-подход.
  • pam_nologin.so: запрещает вход в систему, когда существует файл /etc/nologin.
  • pam_access.so: реализует дополнительные правила контроля доступа (будет описано чуть позже), в соответствии с файлом /etc/security/access.conf.
  • pam_limits.so: накладывает ограничения на пользователей и группы, в соответствии с файлом /etc/security/limits.conf.
  • pam_umask.so: устанавливает маску создания файла для текущего окружения (более подробные сведения дает команда info umask).
  • pam_pwcheck: проверяет прочность пароля (подробности также будут даны чуть позже).

Если вы взглянете на файл /etc/pam.d/sshd, который установлен в вашей системе, вы наверняка увидите то же самое, только не будет модуля pam_access. Он и представляет здесь наибольший интерес. Этот модуль обеспечивает дополнительные проверки, определяемые файлом /etc/security/access.conf. В нем я указал тех, кто может получать доступ к моему компьютеру (листинг 5). Первая строка определяет, что войти в систему может любой пользователь (ALL) из внутренней домашней сети. Вторая строка означает, что пользователь remoteKereki может войти в систему из любой точки мира, а последняя строка однозначно завершает политику доступа, запрещая доступ всем, кто не указан в предыдущих строках. Я создал пользователя remoteKereki с минимумом прав, чтобы я сам мог войти в систему, затем, выполнив su, стать собственно собой или пользователем root, если потребуется. Если злоумышленник угадает пароль для remoteKereki, это ему не поможет, ведь атакующему придется еще угадывать пароль для других, более полезных пользователей. Таким образом, пользователь remoteKereki является дополнительным барьером для злоумышленников.

Чтобы демон sshd задействовал PAM при аутентификации пользователей, нужно добавить строку UsePAM yes в файл конфигурации /etc/ssh/sshd_config, а затем перезапустить SSH: /etc/init.d/sshd restart. Чтобы еще больше увеличить защищенность компьютера, можно перенести службу SSH со стандартного порта (22) на другой, запретить вход в систему под именем root и ограничить число попыток входа, чтобы усложнить задачу брут-форса (прямого перебора всех паролей), как это сделать - тема отдельной статьи. Дополнительные сведения можно получить в руководстве man sshd_config.

Нужны хорошие пароли

Если дать пользователям свободу, тогда большинство из них будут использовать легко угадываемые и редко меняющиеся пароли, что значительно упрощает задачу для злоумышленников. С помощью PAM можно значительно увеличить защищенность компьютера. Этим занимается модуль pam_pwcheck.so, он проверяет вводимые новые пароли на прочность:

  • Какова длина нового пароля?
  • Похож ли новый пароль на бывший?
  • Совпадает ли новый пароль со старым, или записан как зеркальное отображение старого, или получен перестановкой частей старого пароля? (к примеру, safe123 и 123safe)
  • Новый пароль получен изменением регистра некоторых букв старого пароля? (например, sEcReT и SEcrET)
  • Использовался ли этот пароль ранее? (старые пароли сохраняются в файле /etc/security/opasswd)

Можно вызвать модуль с параметрами (их полный перечень смотри в man pam_pwcheck), которые описывают дополнительные правила:

  • minlen=aNumber: определяет минимальную длину (по умолчанию, 5 символов) нового пароля. Значение "нуль" означает, что будет принят любой пароль.
  • cracklib=pathToDictionaries: проверяет новый пароль на наличие в словаре cracklib. Если пароль имеется в словаре, тогда самая простая брут-форс атака легко и быстро взломает его.
  • tries=aNumber: определяет количество попыток смены пароля, ведь новый пароль может быть не принят из-за его простоты.
  • remember=aNumber: определяет количество запоминаемых предыдущих паролей.

Сходную функциональность предоставляет другой модуль, под названием pam_cracklib.so, однако у него другие параметры. К примеру, в нем можно указать, в скольких символах должны отличаться старый и новый пароли, нужно ли включать цифры, символы в верхнем и нижнем регистрах, а также неалфавитные символы. Более подробную информацию можно найти в руководстве man pam_cracklib.

Заключение

В Linux все не так, как в британском музее, и для обеспечения безопасности используется PAM. Даже не прибегая к написанию собственных модулей, можно достаточно гибко настроить механизмы аутентификации, удовлетворяя любые требования безопасности. При этом можно быть уверенным в том, что программы задействуют эти новые правила автоматически.

Модули, модули кругом

Безопасность вашей системы зависит от используемых вами модулей. Модули хранятся в каталоге /lib/security или /lib64/security (для 64-битных систем), однако некоторые дистрибутивы не следуют этому стандарту. К примеру, в некоторых системах модули можно найти в каталоге /usr/lib/security. При желании можно написать и собственные модули (см. раздел Источники информации), но для начала следует разобраться с уже имеющимися. Ниже приведен список наиболее часто используемых модулей. Больше информации по каждому из них можно получить, набрав man модуль, к примеру man pam_pwcheck. Обратите внимание, что нет "стандартного списка" модулей. Их состав варьируется от дистрибутива к дистрибутиву.

  • pam_access: разрешает или запрещает доступ, в зависимости от IP-адреса, имени пользователя, имени хоста или доменного имени и т.п. По умолчанию, правила доступа определены в файле /etc/security/access.conf. Когда пользователь входит, проверяются правила доступа до первого совпадения, и делается решение, разрешить или запретить доступ. Также смотри модуль pam_time - там другие ограничения.
  • pam_cracklib и pam_pwcheck: предоставляют функции проверки прочности пароля (проверки на легкость угадывания или повторяемость). У пользователя спрашивают пароль, и если он проходит предустановленные правила и считается прочным, тогда нужно ввести его еще раз для проверки правильности ввода.
  • pam_deny: безусловно запрещает доступ. Этот модуль можно использовать для блокирования пользователей, как политику по умолчанию. См. также pam_permit.
  • pam_echo: выводит предустановленное текстовое сообщение. См. также pam_motd.
  • pam_env: позволяет присвоение значений переменным окружения. Правила по умолчанию берутся из файла /etc/security/pam_env.conf.
  • pam_exec: вызывает внешнюю программу.
  • pam_lastlog: выводит дату и время последнего входа в систему.
  • pam_limits: устанавливает ограничения на системные ресурсы, используемые пользователем. Ограничения по умолчанию берутся из файла /etc/security/limits.conf.
  • pam_listfile: разрешает или запрещает сервис в зависимости от значений в файле. К примеру, если вы хотите открыть FTP-доступ лишь для некоторых пользователей, перечень которых указан в файле /etc/ftpusers_ok, нужно добавить строку auth required pam_listfile.so item=user sense=allow file=/etc/ftpusers_ok onerr=fail в файл /etc/pam.d/ftpd. См. также модуль pam_nologin.
  • pam_mail: сообщает пользователю о наличии свежей электронной почты.
  • pam_mkhomedir: создает домашний каталог пользователя, если он не существует на локальной машине. Таким образом, можно использовать централизованную авторизацию (к примеру, в NIS или LDAP) и создавать домашние каталоги лишь при необходимости.
  • pam_motd: выводит "сообщение дня". См. также модуль pam_echo.
  • pam_nologin: запрещает доступ, когда существует файл /etc/nologin.
  • pam_permit: безусловно разрешает доступ - очень небезопасно! См. также модуль pam_deny.
  • pam_rootok: разрешает доступ для пользователя root без дополнительных проверок. Обычно этот модуль используется в /etc/pam.d/su, чтобы пользователь root мог войти под любым другим пользователем даже без ввода пароля. Файл должен содержать следующие строки (обратите внимание на вторую строку, см. модуль pam_wheel):
    auth  sufficient   pam_rootok.so
    auth  required     pam_wheel.so
    auth  required     pam_unix.so
    
  • pam_succeed_if: проверяет некоторые характеристики учетной записи, к примеру, принадлежность к определенной группе, значение UID и т.п.
  • pam_time: запрещает доступ к службе в зависимости от дня недели и времени дня. По умолчанию правила берутся из файла /etc/security/time.conf. Однако, запрет накладывается лишь на момент входа в систему. Способа принудительно заставить пользователя выйти из системы нет.
  • pam_umask: устанавлиает маску создания файлов.
  • pam_unix или pam_unix2: классическая аутентификация в UNIX-стиле, основана на файлах /etc/passwd и /etc/shadow. См. также модуль pam_userdb.
  • pam_userdb: аутентифицирует пользователя с помощью базы данных. См. также модуль pam_unix.
  • pam_warn: заносит название службы, номер терминала, пользователя и другие данные в системный журнал. Модуль можно использовать везде, он не влияет на процесс аутентификации.
  • pam_wheel: позволяет root-доступ лишь для членов группы wheel. Часто этот модуль используется для su, чтобы лишь избранные пользователи могли пользоваться этой программой. Пример использования можно найти в описании модуля pam_rootok.

Источники информации

Рассказ "A Jubilee Present", автор E. W. Hornung, оригинальный английский текст: hornung.thefreelibrary.com/Raffles-Further-Adventures-Of-The-Amateur-Cracksman/2-1

Официальная документация PAM: www.kernel.org/pub/linux/libs/pam

Описание конфигурационных файлов: www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-configuration-file.html

Описание повсеместных модулей PAM: www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-module-reference.html

Федерико Кереки (Federico Kereki) - системный инженер из Уругвая, в течение 20 лет преподает в университете, работает разработчиком и консультантом, пишет статьи и учебные курсы. Он пользуется Linux уже много лет. Заинтересован в улучшении безопасности и производительности Linux-машин.



Средняя оценка 5 при 2 голосовавших