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

PAM принимает любой пароль для действительных пользователей

Я только что подключил свою рабочую станцию ​​Arch Linux к Samba AD, которую настроил для нашей компании. Я протестировал его, и он работал, по крайней мере, я так думал. Он принял мой пароль, создал мой домашний адрес и все остальное и вошел в систему. Я забыл проверить, что это не стал бы принять. Оказывается, пока имя пользователя действительное (AD или локальное, не имеет значения), он будет принимать любой пароль. Может ли кто-нибудь указать мне на то, что я сделал не так?

Я использую SSSD для управления подключением AD. Вот мой /etc/pam.d/system-auth:

#%PAM-1.0

auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_sss.so use_first_pass
auth        required      pam_env.so

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

password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_sss.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     optional      pam_mkhomedir.so umask=0077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_sss.so

Давайте подробно проанализируем раздел аутентификации вашей конфигурации PAM.

auth        sufficient    pam_unix.so nullok try_first_pass

В первой строке говорится: «Если этот тест прошел успешно, прекратите дальнейшие проверки и примите логин; если он не удастся, продолжайте проверку. Проверьте пользователей / пароли, настроенные в /etc/passwd и /etc/shadow.Если пользователь существует и поле пароля пусто, пользователю разрешен вход. "Это проверка аутентификации для учетных записей локальных пользователей.

auth        requisite     pam_succeed_if.so uid >= 500 quiet

Во второй строке говорится: «Если этот тест завершится неудачно, прекратите дальнейшие проверки и отклоните вход в систему; в случае успеха продолжайте проверку. Значение UID пользователя должно быть 500 или больше». Это предотвращает вход в системные учетные записи с использованием паролей в AD или другой общей базе данных пользователей.

auth        sufficient    pam_sss.so use_first_pass

В третьей строке говорится: «Если этот тест прошел успешно, прекратите дальнейшие проверки и примите логин; если он не удастся, продолжайте проверку. Проверьте с помощью SSSD». Это проверка для учетных записей AD.

auth        required      pam_env.so

В четвертой строке говорится: «Если эта строка не работает, отклоните вход в систему; но в любом случае продолжайте проверять до конца этого раздела. Установите любые переменные среды, описанные в /etc/security/pam_env.conf и / или /etc/environment. "

Теперь подумайте, что произойдет, если пользователь существует (либо в AD, либо в локальном /etc/passwd), но проверка пароля не выполняется. Первый, pam_unix.so терпит неудачу; но это не может вызвать отказ, потому что это помешает вам использовать какие-либо учетные записи пользователей на основе AD.

Итак, процесс переходит ко второй строке. Если у пользователя есть действительное сопоставление UID, а номер UID равен 500 или больше, это тоже будет успешным. Единственный способ, которым это не удалось бы, - это если бы UID был меньше 500.

Третья строка выполняет проверку AD; это тоже не удается. Но опять же, "достаточно" используется, чтобы разрешить настройку любых других методов аутентификации после этого, поэтому процесс продолжается, как и с pam_unix.so.

На этом этапе должна быть успешно выполнена четвертая строка, чтобы позволить пользователю войти. Но это просто установка переменных среды. man pam_env говорит мне pam_env.so модуль вернет значение PAM_SUCCESS, если переменные среды были успешно установлены. Но поскольку это последний модуль PAM в этом стеке, и ни один из других модулей до сих пор не подвергал абсолютному отклонению, результат этого модуля станет общим результатом фазы аутентификации.

Чтобы исправить это, на этапе аутентификации требуется pam_deny.so в самом конце, чтобы остановить любые попытки входа в систему, когда все фактические механизмы аутентификации не смогли принять пользователя.

Так же pam_env.so вероятно, должно произойти раньше в процессе, чтобы инициализация переменной среды происходила одинаково для всех допустимых пользователей. Если это не сработает в начале auth фаза, затем pam_env.so вероятно, следует пойти в session вместо фазы; man pam_env говорит, что он будет работать в любом auth или session фазы.

Итак, мое первоначальное предложение - изменить auth раздел вашей конфигурации PAM на это:

auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_sss.so use_first_pass
auth        requisite     pam_deny.so

Итак, функциональность будет:

  • Установите переменные среды для пользователя. Если это не удается, все равно что-то серьезно не так.
  • Проверьте локальный пароль; в случае успеха примите логин и завершите этот этап.
  • Отклоняйте всех пользователей с UID менее 500 на этом этапе (= нет входа в систему с учетной записью root или системой с учетной записью AD!)
  • Проверить пароль в AD; в случае успеха примите логин и завершите этот этап.
  • Если мы дойдем до этого момента, ни один из реальных механизмов аутентификации не принял пароль, поэтому безоговорочно отклоните попытку входа в систему.

Если окажется, что pam_env.so вызывает проблемы при размещении в начале auth фаза, вы можете просто прокомментировать ее; похоже, что раньше он пропускался при любом действительном входе в систему.

Как всегда при изменении конфигурации PAM, сначала откройте сеанс в системе и убедитесь, что он sudo'd root или иным образом имеет полные права root: затем сделайте резервную копию текущей конфигурации. Сделайте изменение но не выходи из системы чтобы проверить это: вместо этого проверьте его, открыв другой сеанс. В случае сбоя у вас все еще есть вход в исходный сеанс, поэтому при необходимости вы можете легко восстановить старую конфигурацию. Если это производственная система или иная критическая, откройте два корневые сеансы перед внесением изменений, просто для защиты от ошибок, связанных с тем, что пальцы работают быстрее, чем мозг.