PAM - обязательный и достаточный контрольный флаг

14

Я изучаю PAM и немного не понимаю, что означает некоторая комбинация контрольных флагов. Из документации Red Hat мы имеем:

  • требуемый
    сбой такого PAM в конечном итоге приведет к сбою возврата PAM-API, но только после того, как будут вызваны оставшиеся стековые модули (для этой службы и типа)

  • реквизит
    как требуется, однако, в случае, если такой модуль возвращает ошибку, управление возвращается непосредственно приложению.

  • Достаточного
    успеха такого модуля достаточно, чтобы удовлетворить требования аутентификации стека модулей (если ранее требуемый модуль потерпел неудачу, успех этого модуля игнорируется). Отказ этого модуля не считается фатальным для удовлетворения заявки, которую этот тип успешно выполнил. Если модуль завершается успешно, структура PAM немедленно возвращает приложение успешной работе, не пытаясь использовать другие модули.

Таким образом, в моем понимании, если модуль requisiteвыходит из строя, весь стек модулей не будет проанализирован, и элемент управления немедленно вернется к приложению. Если модуль sufficientзавершается успешно, оставшийся стек модулей не будет проанализирован, и элемент управления немедленно вернется к приложению. Если модуль requiredвыходит из строя, весь стек будет проанализирован.

Теперь я не могу понять, каково будет поведение, когда определенный модуль requiredвыходит из строя, а другой модуль sufficientуспешно.

ludiegu
источник

Ответы:

11

PAM последовательно обрабатывает элементы в стеке. Он хранит только память о том, в каком состоянии он находится (успех или отказ, при этом успех означает успех), а не о том, как он достиг этого состояния.

Если помеченный элемент sufficientуспешно выполняется, библиотека PAM прекращает обработку этого стека. Это происходит независимо от того, были ли предыдущие requiredпункты или нет. На этом этапе PAM возвращает текущее состояние: успех, если ни один предыдущий requiredэлемент не был выполнен, иначе отказано.

Аналогично, если помеченный элемент requisiteзавершается ошибкой, библиотека PAM прекращает обработку и возвращает ошибку. На этом этапе не имеет значения, requiredпотерпел ли предыдущий пункт неудачу.

Другими словами, requiredэто не обязательно вызывает обработку всего стека. Это только значит продолжать идти.

Жиль "ТАК - перестань быть злым"
источник
Но если какой-либо requiredэлемент не удался, зачем PAMпродолжать проходить через стек? если это все равно окончательно провалится?
Мухаммед Нурельдин
1
@MohammedNoureldin Даже если попытка входа в систему не удалась, необходимо выполнить некоторые действия, такие как ведение журнала, добавление тайм-аута против попыток перебора и т. Д. Также обычно система не раскрывает точную причину сбоя, например, при поиске username терпит неудачу, тогда пользователю все еще предлагают пароль.
Жиль "ТАК - перестань быть злым"
В каком порядке они перечислены в конфиге?
OrangeDog
@OrangeDog Да. Модуль, указанный в первой строке, выполняется, затем выполняется вторая строка (или пропускается в зависимости от результата первой строки) и т. Д.
Жиль "ТАК - перестать быть злым"
1

На мой взгляд, requiredуправляющий флаг должен быть всегда успешным, чтобы модуль был успешным.

sufficientПомечено модуль игнорируется , если он выходит из строя. Если он успешен, и ни один из requiredотмеченных выше модулей не дал сбоя, тогда нет необходимости проверять другие модули того же типа, и этот модуль считается успешным. Таким образом, в основном, requiredфлаг имеет более высокий приоритет, чем sufficientфлаг, но последний имеет возможность перестать проверять остальные из них, если предыдущие requiredпреуспели.

Пример:

1 auth       required     /lib/security/pam_nologin.so
2 auth       required     /lib/security/pam_securetty.so
3 auth       required     /lib/security/pam_env.so
4 auth       sufficient   /lib/security/pam_rhosts_auth.so
5 auth       required     /lib/security/pam_stack.so service=system-auth

Если строки 1, 2, 3 и 4 успешны, то строка 5 может быть пропущена, и модуль authуспешен. Если строка 4 не удалась, она игнорируется, а строка 5 проверяется. Если какая-либо из линий 1, 2, 3 потерпела неудачу, то строка 4 не учитывается.

dsmsk80
источник
1
Я думаю, его вопрос в том, что произойдет, если 1 не получится, а 2-4 - удачно 5 запускается? Если 1 удалось, 5 не будет запущен. Или, другими словами, применяется ли «останов после достаточного успеха», если предыдущий требуемый модуль вышел из строя?
CJM
Нет, модуль аутентификации потерпит неудачу с такой комбинацией.
dsmsk80 22.12.13
Вопрос не в том, удастся ли авторизация. Это будет. Вопрос в том, будет ли модуль 5 работать до того, как об этом сбое будет сообщено приложению.
CJM