Я играюсь с MFA из личного интереса и столкнулся с проблемой, которую не могу решить. Недавно я настроил PAM (используя Google Authenticator) и хотел бы объединить это с еще одним типом аутентификации.
У меня есть несколько учетных записей и sshd_config следующий:
PasswordAuthentication no
PermitEmptyPasswords no
AuthenticationMethods publickey,keyboard-interactive
ChallengeResponseAuthentication yes
UsePAM yes
Match User user2
PasswordAuthentication yes
AuthenticationMethods password,keyboard-interactive
Для всех пользователей, кроме "user2", я могу правильно авторизоваться с помощью ключей и кода подтверждения. Однако при попытке подключения к "user2" возникает проблема. При попытке подключения с клиента я правильно получаю запросы на ввод пароля и кода подтверждения. Но ожидаемый пароль — это не пароль учетной записи "user2" (допустим, "hunter2"), а код подтверждения, который отображается в приложении:
$ ssh user2@machine -p port
user2@machine's password:
Когда я ввожу "hunter2" в запрос пароля, я получаю отказ. Однако, если я ввожу проверочный код, который я вижу в приложении, я попадаю на следующий запрос:
$ ssh user2@machine -p port
user2@machine's password:
Verification Code:
Что, конечно, требует Код подтверждения второй раз. Тогда я полностью вошел в систему.
Я попробовал несколько разных комбинаций в блоке user2:
Match User user2
PasswordAuthentication yes
AuthenticationMethods password
выше требуется ввести код подтверждения в запросе пароля, как указано выше, что позволяет мне успешно войти в систему до запроса кода подтверждения.
Мой файл /etc/pam.d/sshd остался совершенно нетронутым, за исключением добавления:
auth required pam_google_authenticatior.so
И комментирование
@include common-auth
->
#@include common-auth
auth required pam_google_authenticatior.so
решение1
Это нормальный результат с OpenSSH. Оба метода password
и keyboard-interactive
auth используют PAM по умолчанию, и оба вызывают один и тот же стек PAM.(В конце концов, у вас есть «UsePAM yes», что означает, что вы указали ему использовать PAM для проверки пароля, поэтому он послушно вызывает PAM, чтобы проверить то, что, по его мнению, является паролем.)Поэтому оба они будут принимать одни и те же входные данные.
Единственное различие между этими двумя механизмами заключается в том, что только «клавиатурно-интерактивный» фактически позволяет PAM отображать несколько подсказок подряд или изменять текст подсказки, который отображается. Между тем, «пароль» — это механизм фиксированного формата — естьнетнастоящие «запросы», отправляемые SSH-клиенту; он запрашивает у вас только один пароль и всё.
Другими словами, объединять два механизма бесполезно — вы не сможете заставить OpenSSH отдельно проверять пароль и токен, все или ничего. (Хотя возможность указывать два разных стека PAM в OpenSSH предлагалась несколько раз, до сих пор ни один такой патч не был принят.)