Назад | Перейти на главную страницу

Нужна помощь в понимании директив 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, поскольку успех = 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 с локальным пользователем с uid 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 с uid 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 каким-то образом добавляет неявное OR между первыми двумя строками.

ОБНОВЛЕНИЕ 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

Вы действительно уверены, что он пропускает 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 проверить наверное является регистрация сбоя. Это просто не мешает вам войти в систему.


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