Должен ли ssh-ключ иметь имя id_rsa?

Я сталкивался с этой проблемой пару раз при создании серверов сборки с аутентификацией с ключом.

Мне было интересно, есть ли у кого-нибудь еще подобный опыт. У меня есть пара ключей для моего текущего пользователя, которые могут подключаться к разным машинам. Допустим, machine1 и machine2. Я вставил свой открытый ключ в их соответствующий файл authorized_keys. Первый из них я назвал первым ключом id_rsa, а второй - key bender.

Когда я пытаюсь подключиться к bender, я получаю следующий вывод с помощью моего подробного ssh-соединения

debug1: SSH2_MSG_NEWKEYS sentdebug1: expecting SSH2_MSG_NEWKEYSdebug1: SSH2_MSG_NEWKEYS receiveddebug1: SSH2_MSG_SERVICE_REQUEST sentdebug1: SSH2_MSG_SERVICE_ACCEPT receiveddebug1: Authentications that can continue: publickeydebug1: Next authentication method: publickeydebug1: Trying private key: /home/bozo/.ssh/.ssh/identitydebug1: Trying private key: /home/bozo/.ssh/.ssh/id_rsadebug1: Trying private key: /home/bozo/.ssh/id_dsadebug1: No more authentication methods to try.Permission denied (publickey).

Он предлагает только ключ id_rsa, как вы можете видеть выше. Правильно ли это? Если да, то почему? Как мне заставить его предлагать больше ключей? Я знаю, что это проблема, которую я периодически вижу, потому что у меня дома есть несколько ключей без особых проблем.

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

Пожалуйста, и спасибо вам.

По умолчанию ssh выполняет поиск id_dsa и id_rsa файлы. Ключи не обязательно должны быть названы так, вы можете назвать их mykey точно так же, или даже поместите его в другой каталог. Однако, если вы делаете что-либо из этого, вам нужно явно ссылаться на ключ в команде ssh следующим образом:

ssh user@server -i /path/to/mykey

Если команда не принимает -i, например sshfs, используйте IdentityFile вариант:

sshfs -o IdentityFile=/path/to/mykey user@host:/path/on/remote /mountpoint

как это работает

При генерации ключа вы получите два файла: id_rsa (закрытый ключ) и id_rsa.pub (открытый ключ). Как следует из их названий, закрытый ключ должен храниться в секрете, а открытый ключ может быть опубликован для всеобщего сведения.

Аутентификация с открытым ключом работает с открытым и закрытым ключами. И клиент, и сервер имеют свои собственные ключи. При установке openssh-server открытый и закрытый ключи сервера генерируются автоматически. Что касается клиента, вам придется сделать это самостоятельно.

Когда вы (клиент) соединяетесь с сервером, происходит обмен открытыми ключами. Вы получите один сервер, а сервер - ваш. При первом получении открытого ключа сервера вам будет предложено принять его. Если этот открытый ключ со временем изменится, вы будете предупреждены, потому что происходит возможная атака MITM (Man in the middle), перехватывающая трафик между клиентом и сервером.

Сервер проверяет, разрешено ли вам подключаться (определено в /etc/ssh/sshd_config) и если ваш открытый ключ указан в ~/.ssh/authorized_keys файл. Возможные причины отказа в предоставлении открытого ключа:

  • /etc/ssh/sshd_config:
    • AllowUsers или AllowGroups указан, но пользователь вашего сервера не указан в списке групп или пользователей (значение по умолчанию не определено, что не накладывает никаких ограничений на вход пользователей или групп в систему).
    • DenyUsers или DenyGroups указан, и вы находитесь в списке пользователей или групп.
    • Вы пытаетесь войти в систему как root, но PermitRootLogin устанавливается на No (по умолчанию yes).
    • PubkeyAuthentication устанавливается на No (по умолчанию yes).
    • AuthorizedKeysFile устанавливается в другое местоположение, и открытые ключи не добавляются в этот файл (по умолчанию .ssh/authorized_keys, относительно домашней директории)
  • ~/.ssh/authorized_keys: ваш открытый ключ не добавлен в этот файл (обратите внимание, что этот файл читается как пользователь root)

Использование нескольких клавиш

Нередко используется несколько ключей. Вместо того, чтобы бежать ssh user@host -i /path/to/identity_file, вы можете использовать конфигурационный файл, ~/.ssh/config.

Общими настройками являются идентификационный файл (ключи) и порт. Следующая конфигурация будет проверять "id_dsa" и "bender" только при подключении к ssh youruser@yourhost:

Host yourhost   IdentityFile ~/.ssh/id_dsa   IdentityFile ~/.ssh/bender

Если вы опустите Host yourhost, настройки будут применяться ко всем подключениям по SSH. Другие параметры также могут быть указаны для этого соответствия хоста, например User youruser, Port 2222 и т.д. Это позволило бы вам подключиться к стенографии ssh yourhost вместо ssh -p2222 youruser@yourhost -i ~/.ssh/id_dsa -i ~/.ssh/bender.

Мой любимый метод позволяет автоматически выбирать закрытый ключ

IdentityFile ~/.ssh/%l_%r@%h_id_rsa

SSH заменит % l на имя локальной машины, % r на удаленное имя пользователя и % h на удаленный хост, поэтому, если я захочу подключиться со своей машины с именем foo к bar от имени пользователя, я запускаю:

ssh bar

И ssh автоматически использовал бы:

~/.ssh/foo_user@bar_id_rsa

Поскольку локальный хост также сохраняется, это позволяет использовать общие домашние каталоги через NFS (разные ключи для каждой машины!) или даже определять, на какой машине должен был находиться ключ...

Принимая во внимание комментарий Стивенруза о том, что для указания большого количества ключей требуется больше времени, а мне приходится играть с большим количеством ключей, я хотел бы предложить свое личное решение.

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

Здесь я связался со своими ключами для машин, работающих под управлением virtualbox:

$ cd .ssh/$ ln -s adam_vbox-id_rsa.pub id_rsa.pub$ ln -s adam_vbox-id_rsa id_rsa$ ls -ltotal 12-rw------- 1 adam adam 1675 2013-10-04 02:04 adam_vbox-id_rsa-rw-r--r-- 1 adam adam  396 2013-10-04 02:04 adam_vbox-id_rsa.publrwxrwxrwx 1 adam adam   16 2013-10-04 02:17 id_rsa -> adam_vbox-id_rsalrwxrwxrwx 1 adam adam   20 2013-10-04 02:17 id_rsa.pub -> adam_vbox-id_rsa.pub-rw-r--r-- 1 adam adam 3094 2013-10-04 02:09 known_hosts

Можно также добавить действительно быстрый скрипт для перехода к другому набору без необходимости вручную вводить ln снова командуй.

Опять же, это не решение только для двух ключей, но для большего числа оно может быть выполнимым.