Условное выполнение инструкций в файле конфигурации Pam

Я работаю над проектом по созданию модуля pam в linux для аутентификации путем ввода поведения человека. Я достаточно изучил и имею представление о работе четырех управляющих флагов в конфигурационном файле pam, а именно. обязательный, требуемый, достаточный и необязательный. У меня есть следующие 2 вопроса о файле конфигурации PAM, специфичном для моего проекта.

  1. В качестве второго фактора аутентификации я хотел бы использовать google-authenticator. В настоящее время мой файл конфигурации имеет следующий код:

    auth sufficient pam_test.so  
    auth required pam_google_authenticator.so
    

Модуль google-authenticator вызывается правильно, если моему модулю не удается пройти аутентификацию, когда введенный пароль правильный, но поведение при вводе не совпадает. Однако он также вызывается, если сам введенный пароль неверен. Во втором случае я хотел бы завершить всю цепочку. Есть ли способ сделать это? Могу ли я условно (на основе другого кода состояния ошибки pam) вызвать модуль google-authenticator?

  1. Другой вопрос заключается в том, что я хотел бы вернуться к моему модулю из модуля google-authenticator и принимать решения на основе кода состояния pam модуля google-authenticator. В принципе, я хотел бы использовать новейшую обучающую выборку для дальнейшего обучения (адаптивный алгоритм). Поэтому, чтобы различать истинно отрицательные и ложноотрицательные результаты, я хотел бы вернуться из модуля google-authenticator? Это возможно?

Это мой первый вопрос о stackoverflow. Извините, если я допустил какие-то ошибки в вопросах.


person Siddharth Shah    schedule 09.03.2015    source источник


Ответы (1)


См. man 5 pam.d для получения дополнительной информации об этих hijinx. Я предполагаю, что вы работаете в Linux с Linux-PAM.

Я предполагаю, что pam_test.so - это то, что вы написали. Таким образом, вы должны возвращать PAM_AUTH_ERR, когда пароль недействителен. Вы можете указать разные действия на основе разных кодов возврата с «расширенным» синтаксисом. Для справки, на (моей) справочной странице pam.d «простые» действия имеют следующий «расширенный» синтаксис:

   required
       [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
   requisite
       [success=ok new_authtok_reqd=ok ignore=ignore default=die]
   sufficient
       [success=done new_authtok_reqd=done default=ignore]
   optional
       [success=ok new_authtok_reqd=ok default=ignore]

Они имеют форму retval=action, где retval — это код возврата PAM_*, с удаленным PAM_ и преобразованным в нижний регистр (поэтому PAM_SUCCESS становится успешным). Действия bad и die дают статус неудачи, но die выходит из стека. Действия ok и done (и целое число N) указывают на успешный статус. «Готово» также останавливает выполнение стека. Использование целого числа N пропускает такое количество следующих модулей. Специальное «по умолчанию» означает «любое другое значение, возвращаемое модулем».

Затем вы можете сделать:

auth [success=done new_authtok_reqd=ok auth_err=die default=ignore] pam_test.so

Это остановит выполнение стека авторизации с ошибкой, если пароль неверный, остановит выполнение с успехом, когда модуль пройдет, и переместится по стеку аутентификации в любом другом сценарии.

Что касается возврата к вашему коду... это целая новая банка червей. Вы можете сделать это, но я не могу придумать способ, который не является полным взломом. Например, прыгайте через обручи с потоком управления, используя code=N, чтобы прыгать и вызывать свой модуль со специальными аргументами, которые затем завершаются успехом или неудачей в зависимости от аргумента. Для полноты (и полного HACK) что-то вроде:

auth [success=done new_authtok_reqd=ok auth_err=die default=ignore] pam_test.so
auth [success=ok default=1] pam_google_authenticator.so
auth [default=1] pam_test.so wasvalid
auth [default=bad] pam_test.so wasinvalid

Он имеет следующие свойства: Если пароль недействителен или удовлетворяет условиям pam_test.so, дальнейшая проверка подлинности не выполняется и завершается с ошибкой или успехом соответственно. Если pam_test не работает по какой-либо другой причине, он вызывает аутентификатор Google. Если это удается, он переходит к следующей строке с вызовом pam_test.so wasvalid, в противном случае переходит к pam_test.so wasinvalid. Выполняется только один из двух последующих вызовов pam_test.so. После этого фрагмента код возврата будет успешным или неудачным, в зависимости от статуса аутентификатора Google. Это фактически «требовать pam_google_authenticator.so, но также вызывать мой модуль с соответствующим флагом». Если вы хотите, чтобы авторизация заканчивалась этим, несмотря ни на что, вы можете использовать:

auth [success=done new_authtok_reqd=ok auth_err=die default=ignore] pam_test.so
auth [success=ok default=1] pam_google_authenticator.so
auth [default=done] pam_test.so wasvalid
auth [default=die] pam_test.so wasinvalid
person Zach    schedule 10.03.2015
comment
Это сработало!! Я бы, наверное, проголосовал за это. Однако мне не хватает репутации. - person Siddharth Shah; 17.03.2015