MacOs. Ошибка при подключении по SSH: Too many authentication failures for root.

Суть проблемы:
Для подключения по SSH вы используете сертификаты для определенных хостов, а для других заходите по паролю. Сертификаты добавлены в keychain (связку ключей) с помощью ssh-add -K *.pem для удобного вызова без указания конкретного сертификата ключом -i. После этого при попытке захода по ssh на сервера, где не настроен сертификат, по паролю получаем ошибку: Too many authentication failures for root (ну или другой пользователь).

Причина:

К сожалению подстановка ключей не интеллектуальна, она не знает к какому хосту какой ключ нужно подставлять. Проверить это можно указав ключ -v при подключении к хосту, где нет сертификатов.

Получим что-то подобное:

OpenSSH_6.9p1, LibreSSL 2.1.7
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 20: Applying options for *
debug1: /etc/ssh/ssh_config line 102: Applying options for *
debug1: Connecting to msk-saprouter [192.0.0.3] port 22.
debug1: Connection established.
debug1: Host 'msk-saprouter' is known and matches the RSA host key.
debug1: Found key in /Users/User/.ssh/known_hosts:3
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Volumes/PEMS/cert1.pem
debug1: Authentications that can continue: publickey,password
debug1: Offering RSA public key: /Volumes/PEMS/cert2.pem
debug1: Authentications that can continue: publickey,password
debug1: Offering RSA public key: /Volumes/PEMS/cert3.pem
Received disconnect from 192.0.0.3: 2: Too many authentication failures for root

Выходит, что сертификаты перебираются по очереди, пока не найдется нужный, или не истечет кол-во попыток неудачного подключения.

 

Решения:

  1. Ииспользовать для хостов без сертификатов ключ -o PubkeyAuthentication=no
    пример: ssh root@192.0.0.3 -o PubkeyAuthentication=no. 
    Для систем с сертификатом ключ будет продолжать подставляться из-за ssh-add -K *.pem.
  2. Изменить порядок методов аутентификации:правим файл sudo nano /etc/ssh/ssh_config

    находим строку: PreferredAuthentications gssapi-with-mic,hostbased,publickey,keyboard-interactive,password

    меняем на: PreferredAuthentications password,gssapi-with-mic,hostbased,publickey,keyboard-interactive.Тогда для всех хостов система будет спрашивать пароль, а для указания сертификата нужно будет воспользоваться ключом -i:
    ssh root@192.0.0.3 -i /Volumes/PEMS/cert1.pem
  3. Создать алиас для команды ssh:
    правим sudo nano ~/.bash_profile
    добавляем строку alias zzh='ssh -o PubkeyAuthentication=no'

    Тогда для доступа по сертификатам используем команду ssh, указывать ключ не придется, а для хостов без сертификата используем команду (алиас) zzh, которая укажет ssh что не нужно использовать сертификаты и она спросит пароль.
  4. Насильно объявить сертификаты для каждого хоста:
    sudo nano ~/.ssh/config:

     Host host1
      IdentityFile /Volumes/PEMS/cert1.pem
      IdentitiesOnly yes
      Port 22
    Host host2
      IdentityFile /Volumes/PEMS/cert2.pem
      IdentitiesOnly yes
      Port 22
    Host host3
      HostName 192.0.0.3
      IdentitiesOnly yes
      Port 22
      User root

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