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

33

(Это проблема с ssh, а не с gitolite)

Я настроил gitolite на моем домашнем сервере (сервер Ubuntu 12.04, open-ssh). Мне нужен специальный идентификационный файл для администрирования репозиториев, поэтому мне нужен доступ через ssh к моему собственному хосту с использованием двух разных ключей идентификации.

Это содержимое моего файла .ssh / config:

Host gitadmin.gammu.com
User            git
IdentityFile    /home/alvaro/.ssh/id_gitolite_mantra

Host git.gammu.com
User            git
IdentityFile    /home/alvaro/.ssh/id_alvaro_mantra

Это содержимое моего файла hosts:

# Git
127.0.0.1      gitadmin.gammu.com
127.0.0.1      git.gammu.com

Так что я должен иметь возможность общаться с gitolite таким образом, чтобы получить доступ к «нормальной» учетной записи:

$ssh git.gammu.com 

и этот способ доступа с учетной записью администратора:

$ssh gitadmin.gammu.com

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

alvaro@mantra:~/.ssh$ ssh git.gammu.com
PTY allocation request failed on channel 0
hello alvaro, this is gitolite 2.2-1 (Debian) running on git 1.7.9.5
the gitolite config gives you the following access:
    @R_ @W_    testing
Connection to git.gammu.com closed.

Когда я делаю то же самое с административной учетной записью:

alvaro@mantra:~$ ssh gitadmin.gammu.com
PTY allocation request failed on channel 0
hello alvaro, this is gitolite 2.2-1 (Debian) running on git 1.7.9.5
the gitolite config gives you the following access:
    @R_ @W_    testing
Connection to gitadmin.gammu.com closed.

Он должен показать административный репозиторий. Если я запускаю ssh с подробной опцией:

ssh -vvv gitadmin.gammu.com 
...
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug2: key: /home/alvaro/.ssh/id_alvaro_mantra (0x7f7cb6c0fbc0)
debug2: key: /home/alvaro/.ssh/id_gitolite_mantra (0x7f7cb6c044d0)
debug1: Authentications that can continue: publickey,password
debug3: start over, passed a different list publickey,password
debug3: preferred gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/alvaro/.ssh/id_alvaro_mantra
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 279
...

Он предлагает ключ id_alvaro_mantra, и он не должен !!

То же самое происходит, когда я указываю ключ с опцией -i:

ssh -i /home/alvaro/.ssh/id_gitolite_mantra -vvv gitadmin.gammu.com
...
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug2: key: /home/alvaro/.ssh/id_alvaro_mantra (0x7fa365237f90)
debug2: key: /home/alvaro/.ssh/id_gitolite_mantra (0x7fa365230550)
debug2: key: /home/alvaro/.ssh/id_gitolite_mantra (0x7fa365231050)
debug1: Authentications that can continue: publickey,password
debug3: start over, passed a different list publickey,password
debug3: preferred gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/alvaro/.ssh/id_alvaro_mantra
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug2: input_userauth_pk_ok: fp 36:b1:43:36:af:4f:00:e5:e1:39:50:7e:07:80:14:26
debug3: sign_and_send_pubkey: RSA 36:b1:43:36:af:4f:00:e5:e1:39:50:7e:07:80:14:26
debug1: Authentication succeeded (publickey).
...

Что творится? Я что-то упустил, но не могу найти что.

Это содержимое моего домашнего каталога:

-rw-rw-r--  1 alvaro alvaro  395 nov 14 18:00 authorized_keys
-rw-rw-r--  1 alvaro alvaro  326 nov 21 10:21 config
-rw-------  1 alvaro alvaro  137 nov 20 20:26 environment
-rw-------  1 alvaro alvaro 1766 nov 20 21:41 id_alvaromaceda.es
-rw-r--r--  1 alvaro alvaro  404 nov 20 21:41 id_alvaromaceda.es.pub
-rw-------  1 alvaro alvaro 1766 nov 14 17:59 id_alvaro_mantra
-rw-r--r--  1 alvaro alvaro  395 nov 14 17:59 id_alvaro_mantra.pub
-rw-------  1 alvaro alvaro  771 nov 14 18:03 id_developer_mantra
-rw-------  1 alvaro alvaro 1679 nov 20 12:37 id_dos_pruebasgit
-rw-r--r--  1 alvaro alvaro  395 nov 20 12:37 id_dos_pruebasgit.pub
-rw-------  1 alvaro alvaro 1679 nov 20 12:46 id_gitolite_mantra
-rw-r--r--  1 alvaro alvaro  397 nov 20 12:46 id_gitolite_mantra.pub
-rw-------  1 alvaro alvaro 1675 nov 20 21:44 id_gitpruebas.es
-rw-r--r--  1 alvaro alvaro  408 nov 20 21:44 id_gitpruebas.es.pub
-rw-------  1 alvaro alvaro 1679 nov 20 12:34 id_uno_pruebasgit
-rw-r--r--  1 alvaro alvaro  395 nov 20 12:34 id_uno_pruebasgit.pub
-rw-r--r--  1 alvaro alvaro 2434 nov 21 10:11 known_hosts

Существует множество других ключей, которые не предлагаются ... почему предлагается id_alvaro_mantra, а не другие ключи? Я не могу понять

Мне нужна помощь, не знаю, где искать ....

Альваро Македа
источник

Ответы:

53

Это ожидаемое поведение в соответствии с manpage 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
gertvdijk
источник
Большое спасибо, что сработало. Я бы полностью забыл ssh-agent!
Альваро Македа
3
Кроме того, вы можете указать это на уровне хоста, вот что я наконец-то сделал: Host git.gammu.com User git IdentityFile /home/alvaro/.ssh/id_alvaro_mantra IdentitiesOnly yes`
Альваро Македа,
2
@ AlvaroMaceda правильно. Добавление IdentitiesOnly yesк gitadmin.gammu.com и git.gammu.com Hostзаписей достаточно. Вам не нужно вводить подстановочные знаки, которые будут влиять на другие хосты.
Бруно Броноски
6

Для меня решение было добавить ключ в список ключей SSH, с помощью команды:

ssh-add ~/.ssh/id_name_of_my_rsa_key

так что это может быть предложено при подключении к серверу. После добавления SSH он был автоматически распознан как правильный.

Редактировать:

Но в последнее время я думаю, что лучшее решение, и более постоянное, это перейти ~/.ssh/configи добавить IdentitiesOnly yesв свой файл конфигурации, например:

Host github.com
  HostName github.com
    User git
      IdentityFile ~/.ssh/id_rsa
      IdentitiesOnly yes
Aleks
источник
Спасибо, ваш второй подход был именно тем, что я должен сделать. Примечания: HostName в вашем примере является чрезмерным, поскольку его значение равно значению Host, отступ более чем на один уровень не имеет смысла, поскольку группировка по Host и Match только в ssh_config.
дес
Второй подход был единственным, который работал для меня на OS X Catalina.
Дэрил