====== Использование библиотеки PAM ====== * [[http://www.freebsd.org/doc/ru/articles/pam/index.html|FreeBSD Handbook: Подключаемые Модули Аутентификации (PAM)]] * [[https://redos.red-soft.ru/base/manual/admin-manual/safe-redos/pam/|Pluggable Authentication Modules (PAM) - настройки системы аутентификации]] ===== Терминология PAM ===== ==== Подсистемы (facility) ==== === auth === Аутентификация. Эта подсистема, собственно говоря, реализует аутентификацию аппликанта и выяснение полномочий учётной записи. === account === Управление учётной записью. Эта подсистема обрабатывает вопросы доступности учетной записи, не связанные с аутентификацией, такие, как ограничения в доступе на основе времени суток или загрузки сервера. === session === Управление сеансом. Эта подсистема отрабатывает задачи, связанные с установлением и закрытием сеанса, такие, как учет входов пользователей. === password === Управление паролем. Эта подсистема используется для изменения ключа аутентификации, связанного с учетной записью, по причине истечения его срока действия или желания пользователя изменить его. ==== Управляющие флаги цепочек ==== === required === Если модуль возвратил положительный ответ, выполняется оставшаяся часть цепочки, запрос удовлетворяется, если никакой другой модуль не отработает отрицательно. Если же модуль возвратит отрицательный ответ, остаток цепочки тоже отрабатывается, но запрос отвергается. === sufficient === Если модуль возвратит положительный ответ, и ни один из предыдущих модулей в цепочке на отработал отрицательно, то отработка цепочки немедленно прекращается, а запрос удовлетворяется. Если модуль отработал отрицательно, то результат игнорируется и цепочка отрабатывается дальше. === optional === Модуль отрабатывается, но результат выполнения игнорируется. Если все модули в цепочке помечены как optional, то удовлетворяться будут все запросы. === requisite === Если модуль возвращает положительный ответ, выполняется оставшаяся часть цепочки, запрос удовлетворяется, если никакой другой модуль не отработает отрицательно. Если же модуль отрабатывает отрицательно, то отработка цепочки немедленно прекращается, а запрос отвергается. === binding === Если модуль отработал успешно, и ни один из предыдущих модулей в цепочке не сработал отрицательно, то цепочка прерывается, а запрос подтверждается. Если же модуль отработает неудачно, то выполняется оставшаяся часть цепочки, однако запрос отвергается. ===== Примеры использования ===== ==== Права на команду su === $ cat /etc/pam.d/su ==== Приостановка регистрации пользователей ==== === Debian/Ubuntu === root@gate:~# grep nologin /etc/pam.d/sshd # Disallow non-root logins when /etc/nologin exists. account required pam_nologin.so root@gate:~# cat > /etc/nologin Please do not login now === FreeBSD === [gate:~] # grep nologin /etc/pam.d/sshd account required pam_nologin.so [gate:~] # cat > /var/run/nologin Please do not login now ==== Аутентификация сервиса login через pam radius ==== * [[Сервис FreeRADIUS]] === FreeBSD === [gate:~] # cat /etc/radius.conf auth server testing123 3 2 [gate:~] # cat /etc/pam.d/login ... auth sufficient pam_radius.so no_warn try_first_pass auth include system ... === Debian/Ubuntu === root@gate:~# apt install libpam-radius-auth freeradius-utils root@gate:~# cat /etc/pam_radius_auth.conf ... server testing123 3 ... root@gate:~# cat /etc/pam.d/login ... auth sufficient pam_radius_auth.so # Standard Un*x authentication. ... ==== Автоматическое создание домашних каталогов ==== === Debian/Ubuntu === root@gate:~# apt install libpam-modules root@gate:~# pam-auth-update --enable mkhomedir root@gate:~# less /etc/pam.d/common-session ... session required pam_mkhomedir.so === FreeBSD === [gate:~] # mkdir /home freebsd10# pkg install pam_mkhomedir [gate:~] # cat /etc/pam.d/sshd ... # session session required /usr/local/lib/pam_mkhomedir.so ... ==== Использование pam_ssh для сервиса login ==== === Debian/Ubuntu === Все само пропишется, пароль ДОЛЖЕН совпадать с UNIX паролем client1:~# apt install libpam-ssh client1:~# grep -r ssh /etc/pam.* client1:~# pam-auth-update === FreeBSD === [client1:~] # cat /etc/pam.d/system ... # auth ... auth sufficient pam_ssh.so no_warn try_first_pass auth required pam_unix.so no_warn try_first_pass nullok ... # session session optional pam_ssh.so session required pam_lastlog.so no_fail ... ==== Использование pam_krb5 для сервиса login/xdm ==== === Debian/Ubuntu === root@client1:~# apt install libpam-krb5 все настроится автоматически root@client1:~# grep krb5 /etc/pam.d/* === FreeBSD === [client1:~] # cat /etc/pam.d/system ... # auth ... auth sufficient pam_krb5.so no_warn try_first_pass ... [client1:~] # cat /etc/pam.d/xdm ... # auth auth sufficient pam_krb5.so no_warn try_first_pass ... ==== Использование pam_script ==== * [[https://github.com/jeroennijhof/pam_script|jeroennijhof/pam_script]] * См. рекламный вебинар: [[Зачем вводить системы Linux в домен Microsoft]] * [[Зачем вводить системы Linux в домен Microsoft#Исправления и альтернативные варианты]] - Можно поручить монтирование домашних каталогов systemd === Вариант использования для автоматического создания учетных записей после аутентификации через внешний сервис === # less /etc/pam.d/common-auth ... auth [success=2 default=ignore] pam_krb5.so minimum_uid=1000 auth [success=1 default=ignore] pam_unix.so nullok_secure try_first_pass ... # apt install libpam-script # cat /etc/pam.d/common-auth ... # here are the per-package modules (the "Primary" block) auth [success=2 default=ignore] pam_krb5.so minimum_uid=1000 auth [success=2 default=ignore] pam_unix.so nullok_secure try_first_pass auth requisite pam_deny.so auth sufficient pam_script.so auth required pam_permit.so # and here are more per-package modules (the "Additional" block) ... # cat /usr/share/libpam-script/pam_script_auth #!/bin/bash id "$PAM_USER" &>/dev/null || useradd -m -s /bin/bash "$PAM_USER" #echo "$PAM_USER:$PAM_AUTHTOK" | /usr/sbin/chpasswd === Вариант использования для автоматического монтирования домашнего каталога по протоколу CIFS с GSSAPI/Kerberos аутентификацией === # cat /usr/share/libpam-script/pam_script_ses_open #!/bin/sh MYUID=`id -u $PAM_USER` MYGID=`id -g $PAM_USER` cp /tmp/krb5cc_${MYUID}* /tmp/krb5cc_0 mount | grep -q /home/$PAM_USER || mount.cifs //gate.corpX.un/$PAM_USER -o rw,user,sec=krb5,vers=3.1.1,uid=$MYUID,gid=$MYGID /home/$PAM_USER/ ###rm /tmp/krb5cc_0