Como pude parar o ssh de oferecer uma chave errada?

33

(Este é um problema com ssh, não com gitolite)

Eu configurei o gitolite no meu servidor doméstico (servidor ubuntu 12.04, open-ssh). Quero um arquivo de identidade especial para administrar os repositórios, portanto, preciso acessar o ssh no meu próprio host usando duas chaves de identidade diferentes.

Este é o conteúdo do meu arquivo .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

Este é o conteúdo do meu arquivo hosts:

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

Portanto, eu devo conseguir me comunicar com o gitolite dessa maneira para acessar com a conta "normal":

$ssh git.gammu.com 

e desta maneira para acessar com a conta administrativa:

$ssh gitadmin.gammu.com

Quando tento acessar com a conta normal, tudo está bem:

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.

Quando faço o mesmo com a conta administrativa:

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.

Deve mostrar o repositório administrativo. Se eu iniciar o ssh com a opção detalhada:

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
...

Está oferecendo a chave id_alvaro_mantra, e não deveria !!

O mesmo acontece quando eu especifico a chave com a opção -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).
...

O que está acontecendo? Estou sentindo falta de algo, mas não consigo encontrar o que.

Estes são os conteúdos do meu diretório home:

-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

Há muitas outras chaves que não são oferecidas ... por que o id_alvaro_mantra é oferecido e não as outras chaves? Eu não consigo entender

Preciso de ajuda, não sei para onde procurar ....

Alvaro Maceda
fonte

Respostas:

53

Esse é o comportamento esperado de acordo com a página de manual de 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).

Basicamente, especificar IdentityFiles apenas adiciona chaves a uma lista atual que o agente SSH já apresentou ao cliente.

Tente substituir esse comportamento por este na parte inferior do seu .ssh/configarquivo:

Host *
IdentitiesOnly yes
gertvdijk
fonte
Muito obrigado, isso funcionou. Eu tinha esquecido completamente o agente ssh!
Alvaro Maceda
3
Além disso, você pode especificá-lo no nível do host, que é o que eu fiz finalmente: Host git.gammu.com User git IdentityFile /home/alvaro/.ssh/id_alvaro_mantra IdentitiesOnly yes`
Alvaro Maceda
2
@AlvaroMaceda está correto. Adicionar IdentitiesOnly yesàs Hostentradas gitadmin.gammu.com e git.gammu.com é suficiente. Você não precisa fazer uma entrada curinga que afetará outros hosts.
Bruno Bronosky 29/07
6

Para mim, a solução foi adicionar uma chave a uma lista de chaves ssh, com um comando:

ssh-add ~/.ssh/id_name_of_my_rsa_key

portanto, poderia ser oferecido ao conectar-se ao servidor. Depois de adicionar um ssh, foi automaticamente reconhecido o correto.

Editar:

Mas, recentemente, acho que a melhor solução, e mais permanente, é acessar ~/.ssh/confige adicionar IdentitiesOnly yesseu arquivo de configuração assim:

Host github.com
  HostName github.com
    User git
      IdentityFile ~/.ssh/id_rsa
      IdentitiesOnly yes
Aleks
fonte
Obrigado, sua segunda abordagem foi exatamente o que devo fazer. Notas laterais: HostName é excessivo no seu exemplo, pois seu valor é igual ao Host, a indentação de mais de um nível não tem meios, pois há agrupamento por Host e Match apenas no ssh_config.
dess
A segunda abordagem foi a única que funcionou para mim no OS X Catalina.
Daryl