Какие существуют способы настройки авторизации через PAM?

Добрый день. Я пытаюсь разобраться с аутентификацией через PAM и заметил, что для каждого приложения создается свой набор правил AAA. У меня возник вопрос: обычно в документации описывается авторизация по одному источнику, но мне необходимо реализовать следующий алгоритм: когда пользователь пытается подключиться через PAM, сначала осуществляется попытка аутентификации на сервере (например, через Radius). Если эта попытка завершается неудачно, то осуществляется локальная аутентификация (через shadow). Я не могу понять, как это корректно прописать в конфигурационном файле. Например, как будет выглядеть настройка, если я использую следующий код: <br/> <pre><code>#%PAM-1.0
auth      requisite    /lib/security/pam-radius.so
auth       required     /lib/security/pam_unix.so shadow nodelay
account    required     /lib/security/pam_nologin.so
account    required     /lib/security/pam_unix.so
password   required     /lib/security/pam_unix.so shadow nullok use_authtok
session    required     /lib/security/pam_unix.so
session    required     /lib/security/pam_limits.so</code></pre> <br/> <br/> В этом случае, получится ли, что независимо от результатов аутентификации на сервере, всегда будет происходить запрос к модулю локальной авторизации?
  • 27 ноября 2024 г. 7:13
Ответы на вопрос 2
Да, вы совершенно правы. В вашем текущем конфигурационном файле PAM для аутентификации, как он написан, действительно всё будет происходить так, как вы описали. 

Если вы используете следующий код:

```plaintext
#%PAM-1.0
auth      requisite    /lib/security/pam-radius.so
auth       required     /lib/security/pam_unix.so shadow nodelay
account    required     /lib/security/pam_nologin.so
account    required     /lib/security/pam_unix.so
password   required     /lib/security/pam_unix.so shadow nullok use_authtok
session    required     /lib/security/pam_unix.so
session    required     /lib/security/pam_limits.so
```

Это значит, что:

1. Произведётся попытка аутентификации через модуль `pam-radius.so`.
2. Если `pam-radius.so` возвращает неудачу, то будет выполнен `pam_unix.so`. 
3. В отличие от модуля `requisite`, который остановит дальнейшую аутентификацию сразу при неудаче, `required` продолжит выполнение последующих модулей аутентификации, даже если предыдущий завершился неудачно.

Так что в текущем варианте, независимо от результата выполнения модуля `pam-radius.so`, модуль `pam_unix.so` будет вызван и произведется попытка локальной аутентификации.

Если вам нужно изменить порядок или логику аутентификации, обдумайте возможность использования модуля `pam-auth-so`. Это может помочь вам настроить более сложные практики аутентификации.

Пример настройки, когда вы хотите проверить RADIUS и только при его неудаче — выполнять локальную аутентификацию, может выглядеть так:

```plaintext
#%PAM-1.0
auth      required    /lib/security/pam-radius.so
auth      [success=1 default=ignore]  /lib/security/pam_unix.so shadow nodelay
auth      required    /lib/security/pam_unix.so shadow nodelay
account    required    /lib/security/pam_nologin.so
account    required    /lib/security/pam_unix.so
password   required    /lib/security/pam_unix.so shadow nullok use_authtok
session    required    /lib/security/pam_unix.so
session    required    /lib/security/pam_limits.so
```

В этом случае, если `pam-radius.so` будет успешным, `pam_unix.so` не будет запрашиваться, а если будет неудачным, то произойдет переход к следующему модулю `pam_unix.so`.

Убедитесь, что правильные модули загружены и что их версии соответствуют вашему окружению и требуемой функциональности.
Держи. Читать и разбираться, что почем придется самому. 

Задача - локальная аутентификация., в случае отсутствия юзера - аутентификация через AD
auth       required     pam_env.so
auth       [success=3 new_authtok_reqd=done default=ignore] pam_unix.so try_first_pass
auth       requisite    pam_succeed_if.so uid >= 1000 quiet
auth       [success=1 new_authtok_reqd=done default=ignore] pam_winbind.so use_first_pass use_authtok krb5_auth krb5_ccache_type=FILE:/tmp/krb5cc_%u cached_login
auth       requisite    pam_deny.so
auth       required     pam_permit.so
auth       optional     pam_keystore.so use_first_pass
auth       optional     pam_ecryptfs.so unwrap
auth       optional     pam_gnome_keyring.so
auth       optional     pam_exec.so seteuid expose_authtok /usr/local/sbin/generate-credstore-auth

account    required     pam_unix.so
account    sufficient   pam_localuser.so
account    sufficient   pam_succeed_if.so uid < 1000 quiet
account    [default=bad success=ok user_unknown=ignore] pam_winbind.so
account    required     pam_permit.so

password   required     pam_pwquality.so try_first_pass retry=3 type=
password   sufficient   pam_unix.so nullok sha512 shadow try_first_pass use_authtok
password   optional     pam_ecryptfs.so
password   required     pam_deny.so
password   optional     pam_gnome_keyring.so

session    required     pam_env.so
session    required     pam_limits.so
-session   optional     pam_loginuid.so
session    optional     pam_mkhomedir.so umask=0077
-session   optional     pam_elogind.so
session    optional     pam_exec.so seteuid /usr/local/sbin/generate-credstore-session -p .trinity/share/config -d DOMAIN
session    [success=2 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session    [success=1 new_authtok_reqd=ok ignore=ignore default=bad] pam_unix.so
session    required     pam_winbind.so
session    optional     pam_ecryptfs.so unwrap
session    optional     pam_gnome_keyring.so auto_start

Скрипт generate-credstore-auth/generate-credstore-session - локальный, тебе не нужен, просто выброси
Похожие вопросы