PAM позволяет использовать sufficent
и required
для некоторой логики, например
auth sufficient pam_a.so
auth required pam_b.so
auth required pam_c.so
что означало бы «либо a истинно, либо b должно быть истинным, а затем c должно быть истинным».
Можно ли делать более сложные операции? как «(а или б) и (в или г)» или «(а и б) или (в и г)»? Возможно, с еще большим количеством слоев скобок.
Да, есть логика, позволяющая пропускать произвольное количество строк. Нет никаких «группирующих скобок» или чего-либо подобного, но если вы объедините логику, о которой вы только что упомянули, с возможностью пропускать строки, вы можете выборочно исключить поведение.
Вот пример с моего личного сервера:
# Skip Google authenticator check if they're coming from a local IP.
auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access/nogoogle.conf noaudit
auth required pam_google_authenticator.so nullok
Мне действительно не нужна двухфакторная аутентификация, если исходный IP-адрес исходит из моей локальной сети, поэтому я использую результат pam_access.so
отметьте, чтобы пропустить ровно одну строку в случае успеха. Если проверка не удалась, ничего не происходит и проверяется следующая строка.
Вы можете найти больше об этом в pam.conf
справочная страница. Найдите "значение1". Раздел начинается так:
For the more complicated syntax valid control values have the following form: [value1=action1 value2=action2 ...] Where valueN corresponds to the return code from the function invoked in the module for which the line is defined. ...
Имейте в виду, что эта логика намного сложнее, и если люди редактируют ваши конфигурации PAM, не замечая наличия пропуска строк, они могут вызвать всевозможный хаос, добавляя или удаляя строки в неправильных местах.