Ключ ssh должен быть назван id_rsa?

130

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

Мне было интересно, если кто-то еще испытал это. У меня есть пара ключей для моего текущего пользователя, которые могут подключаться к разным машинам. Пусть скажут машина1 и машина2. Я вставил свой открытый ключ в соответствующий им файл author_keys. Первый из них я назвал первым ключом id_rsa и вторым ключом Бендера.

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

debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /home/bozo/.ssh/.ssh/identity
debug1: Trying private key: /home/bozo/.ssh/.ssh/id_rsa
debug1: Trying private key: /home/bozo/.ssh/id_dsa
debug1: No more authentication methods to try.
Permission denied (publickey).

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

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

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

myusuf3
источник

Ответы:

157

По умолчанию 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 (Человек посередине), перехватывающая трафик между клиентом и сервером.

Сервер проверяет, разрешено ли вам подключаться (определено в /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, относительно home dir)
  • ~/.ssh/authorized_keys: ваш открытый ключ не добавлен в этот файл (обратите внимание, что этот файл читается как пользователь root)

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

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

Общие настройки - IdentityFile (ключи) и порт. Следующая конфигурация будет проверять «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.

Lekensteyn
источник
1
почему мне нужно указать ключ? все дело в том, чтобы я мог проще ssh к машине.
myusuf3
2
@StevenRoose from ssh_config(5): имя файла может использовать синтаксис тильды для ссылки на домашний каталог пользователя или один из следующих escape-символов: «% d» (домашний каталог локального пользователя), «% u» (локальное имя пользователя), «% l '(имя локального хоста), "% h" (имя удаленного хоста) или "% r" (имя удаленного пользователя). Не возможно указать групповые символы, но это должно быть достаточно удобно, я думаю. Имейте в виду, что сервер должен проверять каждый отправленный вами ключ, поэтому лучше указывать меньше ключей. Подстановочные знаки на хосте работают, см. Снова страницу руководства ssh_config(5).
Лекенштейн
2
@therobyouknow. Вам не нужно создавать уникальную пару ключей для каждой машины. Обычно у вас мало ключей, и вы добавляете открытый ключ одного из ключей в .ssh/authorized_keysфайл на удаленных компьютерах. Если вы используете стандартное .ssh/id_rsaимя файла (или id_dsa, id_ecdsa или недавний id_ed25519), тогда ssh попытается сделать это автоматически, и вам не нужно указывать это IdentityFileв вашей конфигурации (или -i path/to/id_fileпараметре для ssh).
Лекенштейн
4
Я люблю ответы, которые выходят за рамки необходимых деталей и не торопятся, чтобы объяснить концепцию. Великолепная работа! +1
user2490003
1
@landed Это хост сервера SSH (это может быть IP-адрес или DNS-имя). Я попытался уточнить этот раздел, надеюсь, это поможет.
Лекенштейн
40

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

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

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

ssh bar

И SSH будет автоматически использовать:

~/.ssh/foo_user@bar_id_rsa

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

Viperfang
источник
1

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

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

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

$ cd .ssh/
$ ln -s adam_vbox-id_rsa.pub id_rsa.pub
$ ln -s adam_vbox-id_rsa id_rsa

$ ls -l
total 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.pub
lrwxrwxrwx 1 adam adam   16 2013-10-04 02:17 id_rsa -> adam_vbox-id_rsa
lrwxrwxrwx 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 вручную .

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

ajhcasual
источник
1
Я просто добавляю псевдоним bash_profile для каждого сервера, с которым я работаю. Так что для сервера с именем bob у меня просто есть это ... alias bob = "ssh bob.example.com -l pete -i / path / to / key" - тогда я просто набираю bob - и я в игре!
Питер Баньялл
2
В то время как иногда легче «сделать все так, как вы уже знаете», существуют более простые подходы, если вы настраиваете ключи и хосты .ssh / config. Этот комментарий направлен как на постер с комментариями, так и на комментатора @ Peter-Bagnall
Скотт Прайв