Суть проблемы:
Для подключения по 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
Выходит, что сертификаты перебираются по очереди, пока не найдется нужный, или не истечет кол-во попыток неудачного подключения.
Решения:
- Ииспользовать для хостов без сертификатов ключ -o PubkeyAuthentication=no
пример: ssh root@192.0.0.3 -o PubkeyAuthentication=no. Для систем с сертификатом ключ будет продолжать подставляться из-за ssh-add -K *.pem. - Изменить порядок методов аутентификации:правим файл 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 - Создать алиас для команды ssh:
правим sudo nano ~/.bash_profile
добавляем строку alias zzh='ssh -o PubkeyAuthentication=no'
Тогда для доступа по сертификатам используем команду ssh, указывать ключ не придется, а для хостов без сертификата используем команду (алиас) zzh, которая укажет ssh что не нужно использовать сертификаты и она спросит пароль. - Насильно объявить сертификаты для каждого хоста:
sudo nano ~/.ssh/config:
Host host1IdentityFile /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
Тогда для хостов с сертификатом будет выбираться именно его сертификат, а для хостов с паролем будет запрашиваться пароль.