Нужна помощь в понимании директив PAM

У меня есть следующие директивы в моем /etc/pam.d/sshd файл на коробке RHEL5, и я немного запутался. Эти директивы предназначены для работы LDAP + RADIUS + OTP. То, что я пытаюсь сделать, это сказать pam не проверять UID пользователей < 499 для LDAP + RADIUS + OTP, а также исключить UID = 30027 из проверки на то же самое.

Эта директива работает как задумано. Он проверяет, если UID >= 499, и если это так, он пропускает (достаточно аутентификации pam_unix.so nullok_secure).

auth [success=1 default=ignore] pam_succeed_if.so uid >= 499 quiet

Я запутался здесь. Это должно сделать LDAP + RADIUS + OTP, так как success=1, но каким-то образом это все еще работает. Разве не следует пропустить следующее правило, если оно истинно?

auth [success=1 default=ignore] pam_succeed_if.so uid eq 30027 quiet
auth sufficient pam_unix.so nullok_secure
auth sufficient  pam_radius_auth.so
auth required /lib/security/pam_google_authenticator.so forward_pass

Хотя я заставил вещи работать так, как я хочу, я запутался в логике этого.


Обновить

Итак, вот что я получаю в /var/log/secure, когда я ssh использую локального пользователя с идентификатором пользователя 30327 -

Aug  8 08:21:30 journey sshd[9357]: Accepted keyboard-interactive/pam for sidd from 10.1.1.178 port 51242 ssh2
Aug  8 08:21:30 journey sshd[9357]: pam_unix(sshd:session): session opened for user sidd by (uid=0)

Это то, что я получаю по ssh, используя root с идентификатором 0 (<499).

Aug  8 08:25:51 journey sshd[9402]: Accepted keyboard-interactive/pam for root from 10.1.1.178 port 51246 ssh2
Aug  8 08:25:51 journey sshd[9402]: pam_unix(sshd:session): session opened for user root by (uid=0)

Это то, что я получаю, когда использую пользователя ldap только с паролем LDAP и без OTP -

Aug  8 08:27:04 journey sshd[9447]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=journey  user=schoure
Aug  8 08:27:05 journey sshd(pam_google_authenticator)[9447]: Failed to read "/home/schoure/.google_authenticator"
Aug  8 08:27:07 journey sshd[9445]: error: PAM: Cannot make/remove an entry for the specified session for schoure from journey

Это то, что я получаю, когда использую пользователя ldap с LDAP + OTP -

Aug  8 08:28:13 journey sshd[9452]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=journey  user=schoure
Aug  8 08:28:13 journey sshd[9450]: Accepted keyboard-interactive/pam for schoure from 10.1.1.178 port 43068 ssh2
Aug  8 08:28:13 journey sshd[9450]: pam_unix(sshd:session): session opened for user schoure by (uid=0)

Таким образом, вы правы - pam_unix не работает для пользователей LDAP, но поскольку он установлен на "достаточно", он не является терминальным. Спасибо за разъяснение этого.

Что касается вашей другой точки -

auth [success=1 default=ignore] pam_succeed_if.so uid eq 30027 quiet

не получая оценки, я вижу, что это оценивается. Если я закомментирую эту директиву, я получу

Aug  8 08:34:39 journey sshd(pam_google_authenticator)[9537]: Failed to read "/home/sidd/.google_authenticator"
Aug  8 08:34:42 journey sshd[9535]: error: PAM: Cannot make/remove an entry for the specified session for sidd from journey

Так что я все еще не понимаю, как это работает, начиная с 30327 > 499 и, следовательно, следует пропустить вторую строку. Единственная причина, по которой я вижу, что это работает, если PAM каким-то образом добавляет неявное ИЛИ между первыми двумя строками.

ОБНОВЛЕНИЕ 2

Ах, я вижу, что происходит. Эта строка в действительности просто заполнитель. Я изменил этот UID на некоторый случайный UID, который не существует, и он все еще работает. Итак, я понимаю логику -

  1. Строка 1 проверяет UID. Если оно больше 499, оно переходит к строке 3, где проверяется локально. Поскольку UID > 499 не являются локальными, это условие не выполняется, но является нетерминальной директивой, оно переходит к LDAP + RADIUS + OTP.
  2. Если я закомментирую строку 2, для которой установлен определенный UID, PAM полностью пропустит локальную аутентификацию из-за успеха =1.

Таким образом, если я что-то сделал не так, это сработало. Я получаю то, что мне нужно сделать, и это работает для меня.

Я не хочу, чтобы локальные пользователи проходили аутентификацию через LDAP + RADIUS + OTP, поэтому эти три строки должны выполнить эту работу за меня. Они работают, но я просто хотел бы подтвердить, что они правы -

auth sufficient pam_unix.so nullok_secure
auth sufficient  pam_radius_auth.so
auth required /lib/security/pam_google_authenticator.so forward_pass

1 ответ

Вы действительно уверены, что он пропускает pam_unix.so?

sufficient "нетерминальное" поведение при сбое. Даже если проверка pam_unix.so не удалась, аутентификация будет продолжена для попытки pam_radius_auth.so.

Моя интерпретация:

  • uid eq 30027 проверка никогда не вернет истину. Тест будет выполняться только в том случае, если uid <499, что делает невозможным условие uid eq 30027 чтобы быть правдой.
  • pam_unix.so будет предпринята попытка во всех сценариях, и если это не удастся, pam_radius_auth.so будет предпринята попытка
  • pam_google_authenticator.so будет предпринята попытка, если оба они потерпят неудачу.

Проверьте свои журналы снова. Радиус входа в систему может не быть неудачным, но pam_unix.so проверка, вероятно , регистрирует ошибку. Это просто не мешает вашим логинам.


Этот ответ точно охватывает рамки исходного вопроса. Любые дополнительные вопросы, которые были заданы в обновлениях или комментариях, не рассматриваются.

Другие вопросы по тегам