KbdInteractiveAuthentication
KbdInteractiveAuthentication это директива сервера OpenSSH (sshd_config), которая определяет, разрешена ли аутентификация keyboard-interactive. Она принимает yes или no, а по руководству значение по умолчанию yes. Это современное имя ChallengeResponseAuthentication, и вместе с UsePAM именно через неё PAM запрашивает пароль или одноразовый код, поэтому на сервере только с ключами её стоит отключить.
Допустимые значения и значение по умолчанию
Согласно руководству sshd_config, аргумент должен быть yes или no, а значение по умолчанию yes. Keyboard-interactive это универсальный метод входа SSH из RFC 4256: сервер присылает один или несколько запросов, а клиент на них отвечает. Запросом может быть пароль, одноразовый код или несколько вопросов, и что именно появится, решает сервер.
В Linux запросы обычно задаёт PAM. Портируемое руководство говорит, что при UsePAM yes аутентификация PAM работает и через KbdInteractiveAuthentication, и через PasswordAuthentication, а сам UsePAM по умолчанию равен no.
Пакеты Debian отличаются от upstream. В справочной странице Debian среди параметров, которые пакет задаёт в /etc/ssh/sshd_config, указаны KbdInteractiveAuthentication no и UsePAM yes, а справочная страница Ubuntu говорит то же самое. Поэтому встроенное значение и значение на вашем сервере могут различаться. Всегда читайте действующее значение, а не предполагайте его.
ChallengeResponseAuthentication, старое имя
Старые инструкции и системы управления конфигурацией до сих пор используют ChallengeResponseAuthentication. В примечаниях к OpenSSH 8.7 от 2021-08-20 есть исправление, которое убирает упоминания старого ключевого слова в пользу KbdInteractiveAuthentication. В руководстве sshd_config старое имя по-прежнему названо устаревшим псевдонимом, поэтому старые файлы продолжают работать, но в новой конфигурации стоит использовать текущее имя.
Причину объясняет сообщение коммита: старое имя пришло из протокола SSH 1, новое из протокола 2, и они не были полностью эквивалентны. На практике скрипт, который правит только старое имя, может пропустить нужную настройку, поэтому перед тем как доверять файлу, поищите оба варианта:
sudo grep -rniE 'challengeresponse|kbdinteractive' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/
sudo sshd -T | grep -i '^kbdinteractiveauthentication '
Вторая команда показывает значение, которое sshd использует на самом деле. Оно решает дело, когда ключевое слово встречается в нескольких файлах или строках.
Взаимодействие с PasswordAuthentication, UsePAM и AuthenticationMethods
Keyboard-interactive может запросить пароль учётной записи, поэтому одного PasswordAuthentication no недостаточно, чтобы закрыть вход по паролю. Портируемое руководство отмечает, что эти два метода обычно играют одну роль, и советует отключить один из них. Для сервера только с ключами отключите оба и оставьте ключи включёнными, как объясняет статья про PasswordAuthentication:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
Для ключа и одноразового кода keyboard-interactive должен остаться включённым, потому что именно он несёт запрос кода от модуля PAM:
UsePAM yes
KbdInteractiveAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive
Без строки AuthenticationMethods PAM мог бы принять один лишь пароль как самостоятельный вход. Директива также допускается в блоках Match, поэтому проверяйте действующее значение для конкретного пользователя. Если указать keyboard-interactive в AuthenticationMethods и при этом отключить сам метод, получится ловушка блокировки, о которой сказано в той статье.
Как проверить и безопасно протестировать
Не закрывайте текущую сессию и работайте из второго терминала. Отредактируйте файл, проверьте его, прочитайте действующие значения и только потом перезагружайте службу. Руководство sshd(8) описывает -t как проверку корректности, а -T как вывод действующей конфигурации, при необходимости для соединения, заданного через -C:
sudo sshd -t
sudo sshd -T -C user=deploy,addr=192.0.2.10,host=server | grep -iE '^(kbdinteractive|passwordauth|pubkeyauth|usepam|authenticationmethods)'
sudo systemctl reload ssh # на некоторых дистрибутивах sshd
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=keyboard-interactive -l deploy your-server
На сервере только с ключами последняя команда должна завершиться отказом без какого-либо запроса. Держите наготове консоль провайдера и знайте шаги из руководства по восстановлению доступа к SSH.
Полный порядок внедрения описан в руководстве по усилению защиты SSH, настройка запроса кода в руководстве по двухфакторной аутентификации SSH, а правило первого значения объясняет статья про sshd_config.
Связанные термины: sshd_config, PasswordAuthentication, PAM, Двухфакторная аутентификация, Аутентификация по ключам.
Часто задаваемые вопросы
Какое значение KbdInteractiveAuthentication по умолчанию?
По руководству OpenSSH это yes. Debian и Ubuntu поставляют sshd_config, где задано no, поэтому проверьте действующее значение командой sudo sshd -T | grep -i kbdinteractiveauthentication.
ChallengeResponseAuthentication это то же самое?
Это старое имя. В OpenSSH 8.7 упоминания о нём заменили на KbdInteractiveAuthentication, а руководство называет его устаревшим псевдонимом. В новой конфигурации используйте новое имя.
Нужно ли ставить KbdInteractiveAuthentication no?
Да, на сервере только с ключами, вместе с PasswordAuthentication no, потому что при UsePAM он всё ещё может запросить пароль. Нет, если PAM выдаёт одноразовый код в схеме ключ плюс код.
Нужен ли KbdInteractiveAuthentication yes для TOTP?
Да. Запрос кода передаётся через keyboard-interactive, поэтому включите его вместе с UsePAM yes и потребуйте через AuthenticationMethods publickey,keyboard-interactive.
Почему я всё ещё могу ввести пароль после PasswordAuthentication no?
Keyboard-interactive при UsePAM yes может по-прежнему запросить пароль учётной записи. Задайте и KbdInteractiveAuthentication no и подтвердите результат через sshd -T.
Хотите увидеть, в каком состоянии ваш сервер?
Запустите бесплатную read-only проверку сервера или откройте Security Lab и посмотрите цикл обнаружение, сдерживание, восстановление, проверка в действии.
Получить бесплатную проверку сервераОткрыть Security Lab