Нужна помощь в понимании директив 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 проверяет UID. Если оно больше 499, оно переходит к строке 3, где проверяется локально. Поскольку UID > 499 не являются локальными, это условие не выполняется, но является нетерминальной директивой, оно переходит к LDAP + RADIUS + OTP.
- Если я закомментирую строку 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
проверка, вероятно , регистрирует ошибку. Это просто не мешает вашим логинам.
Этот ответ точно охватывает рамки исходного вопроса. Любые дополнительные вопросы, которые были заданы в обновлениях или комментариях, не рассматриваются.