Назад | Перейти на главную страницу

Запретить ssh-клиенту предлагать все открытые ключи, которые он может найти?

Как и большинство системных администраторов, я все время использую openssh. У меня около дюжины ключей ssh, мне нравится иметь разные ключи ssh для каждого хоста. Однако это вызывает проблему, когда я подключаюсь к хосту в первый раз, и все, что у меня есть, это пароль. Я хочу просто подключиться к хосту с помощью пароля, в данном случае без ключа ssh. Однако клиент ssh предложит все открытые ключи в моем ~/.ssh/ (Я знаю это, глядя на вывод ssh -v). Поскольку у меня их так много, я буду отключаться из-за слишком большого количества сбоев аутентификации.

Есть ли способ сказать моему клиенту ssh не предлагать все ключи ssh?

Хотя другие намекали на это с помощью решений на основе конфигурации, вероятно, стоит отметить, что вы можете легко сделать это единовременно в командной строке с помощью:

ssh -o 'PubkeyAuthentication no' myhostname.mydomain

Это ожидаемое поведение согласно справочной странице ssh_config:

 IdentityFile
         Specifies a file from which the user's DSA, ECDSA or DSA authentica‐
         tion identity is read.  The default is ~/.ssh/identity for protocol
         version 1, and ~/.ssh/id_dsa, ~/.ssh/id_ecdsa and ~/.ssh/id_rsa for
         protocol version 2.  Additionally, any identities represented by the
         authentication agent will be used for authentication.  

         [...]

         It is possible to have multiple identity files specified in configu‐
         ration files; all these identities will be tried in sequence.  Mul‐
         tiple IdentityFile directives will add to the list of identities
         tried (this behaviour differs from that of other configuration
         directives).

В основном, указав IdentityFiles просто добавляет ключи в текущий список, который агент SSH уже представил клиенту.

Попробуйте переопределить это поведение с помощью этого в нижней части вашего .ssh/config файл:

Host *
  IdentitiesOnly yes

Вы также можете переопределить этот параметр на уровне хоста, например:

Host foo
  User bar
  IdentityFile /path/to/key
  IdentitiesOnly yes

Следуя решению Джеймса Снирингера, вы можете просто установить ssh_config в следующих строках:

Host *.mycompany.com
  IdentityFile .ssh/id_dsa_mycompany_main

Host *.mycustomer.com
  IdentityFile .ssh/id_dsa_mycustomer

Host *
  RSAAuthentication no #this should be up top, avoid ssh1 at all costs
  PubkeyAuthentication no

Если вы подключаетесь с помощью определенного ключа ко многим машинам, не входящим в общий домен, рассмотрите возможность предоставления им всех CNAME в вашем собственном DNS. Я делаю это со всеми клиентскими системами.

Подобно решению user23413, вы можете полностью отключить аутентификацию с открытым ключом для определенного хоста (или шаблона подстановки):

Host *.example.org
RSAAuthentication no        # SSHv1
PubkeyAuthentication no     # SSHv2

Если вы укажете определенный файл ключа с помощью ssh -i / path / to / key, он будет использовать только этот файл, даже если в агент загружены другие, и вам не будет предложено ввести пароль. Вы также можете отредактировать ~ / .ssh / config и добавить что-то вроде этого ...

Хост foo.example.com
IdentityFile .ssh / id_rsa_foo.example.com

вы также можете сделать ...

Хост * .example.org
IdentityFile .ssh / id_rsa_example.org