PubkeyAuthentication
PubkeyAuthentication это директива сервера OpenSSH (sshd_config), которая определяет, разрешена ли аутентификация по открытому ключу. Она принимает yes или no, а по руководству значение по умолчанию yes. Оставьте её включённой: вход по ключу это метод, на который опирается защищённый сервер, а если выключить её при отключённых паролях, по SSH не сможет войти никто.
Допустимые значения, значение по умолчанию и что директива не решает
В руководстве sshd_config сказано, что PubkeyAuthentication определяет, разрешена ли аутентификация по открытому ключу, и что значение по умолчанию yes; аргумент равен yes или no. У клиента есть собственный переключатель в ssh_config, который руководство ssh_config тоже включает по умолчанию.
Директива это лишь выключатель метода. Какие ключи принимаются, решают другие настройки. AuthorizedKeysFile называет файлы с разрешёнными открытыми ключами, по умолчанию это .ssh/authorized_keys .ssh/authorized_keys2. Относительные пути отсчитываются от домашнего каталога пользователя, раскрываются токены %h, %U, %u и %%, а значение none пропускает пользовательские файлы ключей. PubkeyAcceptedAlgorithms ограничивает допустимые алгоритмы подписи, а ssh -Q PubkeyAcceptedAlgorithms показывает, что поддерживает ваша сборка.
Формат файла описан в статье про authorized_keys. PubkeyAuthentication допускается внутри блоков Match.
Вход только по ключам и проверка действующего значения
Оставьте директиву включённой и отключите два других пути входа по паролю. Это ядро входа только по ключам, описанное в статье про аутентификацию по ключам:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
Почему нужны оба отключения, объясняют статьи PasswordAuthentication и KbdInteractiveAuthentication. Проверьте файл и прочитайте значения, которые использует sshd:
sudo sshd -t
sudo sshd -T | grep -iE '^(pubkeyauthentication|authorizedkeysfile|strictmodes) '
sudo systemctl reload ssh # на некоторых дистрибутивах sshd
ssh -v -o PreferredAuthentications=publickey -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 -l deploy your-server
Последнюю команду запускайте из второго терминала, не закрывая первую сессию. Успешный вход sshd записывает как "Accepted publickey for", далее идут пользователь, адрес и отпечаток ключа; прочитать запись можно через sudo journalctl -u ssh (на некоторых дистрибутивах служба называется sshd).
Почему вход по ключу не работает, даже если стоит yes
Большинство сбоев не связано с этой директивой. По руководству, StrictModes, по умолчанию yes, проверяет режимы доступа и владельца файлов пользователя и его домашнего каталога перед тем, как принять вход. Руководство sshd(8) рекомендует, чтобы authorized_keys был доступен пользователю на чтение и запись и недоступен остальным:
chmod 600 ~/.ssh/authorized_keys
- Открытого ключа нет в файле, либо
AuthorizedKeysFileуказывает в другое место. - Домашний каталог или
.sshпринадлежит другому пользователю или открыт остальным. - Клиент предлагает не тот ключ. Его параметр
IdentitiesOnlyпо умолчанию равенno, поэтому агент может предложить другие ключи первыми. - Множество предложенных ключей исчерпывает MaxAuthTries раньше, чем дойдёт очередь до нужного.
- Блок
Matchили более ранняя строка переопределяет значение, ведь используется первое полученное.
Эту ошибку подробно разбирает руководство по Permission denied (publickey).
Взаимодействие с другими настройками и место в усилении защиты
Никогда не задавайте PubkeyAuthentication no как меру усиления защиты. Если AuthenticationMethods требует publickey, а метод выключен, sshd отвергнет конфигурацию: в его исходном коде проверяется, что хотя бы один заданный список выполним, и при неудаче выводится "AuthenticationMethods cannot be satisfied by enabled authentication methods". Эта проверка не видит блоки Match, поэтому продолжайте тестировать.
Ключи это первый фактор в более сильной схеме. Добавьте второй шаг через AuthenticationMethods publickey,keyboard-interactive или используйте аппаратный ключ из статьи про FIDO2 и WebAuthn: PubkeyAuthOptions поддерживает для ключей FIDO значения touch-required и verify-required, а по умолчанию действует none.
Сочетайте ключи с PermitRootLogin no и списком AllowUsers. Порядок работ изложен в руководстве по усилению защиты SSH, дополнительный фактор в руководстве по двухфакторной аутентификации SSH, а о ботах, которые продолжают попытки, рассказывает руководство по защите от подбора паролей.
Связанные термины: sshd_config, Аутентификация по ключам, authorized_keys, PasswordAuthentication, FIDO2 и WebAuthn.
Часто задаваемые вопросы
Какое значение PubkeyAuthentication по умолчанию?
По руководству OpenSSH это yes, то есть вход по ключу разрешён, пока вы не зададите no. Действующее значение проверьте командой sudo sshd -T | grep -i pubkeyauthentication.
Нужно ли ставить PubkeyAuthentication no?
Нет. Вход по ключу это то, на чём держится защищённый сервер. При выключенном методе и отключённых паролях по SSH не войдёт никто, а обязательный publickey в AuthenticationMethods заставит sshd отвергнуть конфигурацию.
Где sshd ищет открытые ключи?
В файлах, названных в AuthorizedKeysFile. По умолчанию это .ssh/authorized_keys и .ssh/authorized_keys2 в домашнем каталоге пользователя. Значение none пропускает пользовательские файлы ключей.
Почему мой ключ отвергается, хотя PubkeyAuthentication равен yes?
Обычные причины: ключа нет в authorized_keys, неверные владелец или права, которые отвергает StrictModes, либо клиент предлагает другой ключ. Прочитайте журнал sshd и запустите ssh -v.
Достаточно ли PubkeyAuthentication yes для входа только по ключам?
Нет. Нужно ещё задать PasswordAuthentication no и KbdInteractiveAuthentication no, иначе пароль или запрос PAM всё ещё могут быть предложены.
Хотите увидеть, в каком состоянии ваш сервер?
Запустите бесплатную read-only проверку сервера или откройте Security Lab и посмотрите цикл обнаружение, сдерживание, восстановление, проверка в действии.
Получить бесплатную проверку сервераОткрыть Security Lab