A chave ssh precisa ser nomeada id_rsa?

130

Eu me deparei com esse problema algumas vezes ao criar servidores de compilação com autenticação com chave.

Fiquei me perguntando se alguém já experimentou isso. Eu tenho algumas chaves para meu usuário atual que podem se conectar a máquinas diferentes. Digamos machine1 e machine2. Eu colei minha chave pública no respectivo arquivo allowed_keys. O primeiro nomeiei a primeira chave id_rsa e a segunda chave dobradora.

Quando tento me conectar ao bender, recebo a seguinte saída com minha conexão ssh detalhada

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

Ele oferece apenas a chave id_rsa, como você pode ver acima. Isso está correto? Se sim, por quê? Como faço para oferecer mais chaves? Sei que é um problema que vejo de forma intermitente, porque em casa tenho várias chaves sem muitos problemas.

Também apreciaria uma visão geral de como o pub e as chaves privadas interagem com o cliente e o servidor. Eu pensei que tinha uma idéia bastante decente, mas aparentemente estou perdendo alguma coisa.

Por favor e obrigado.

myusuf3
fonte

Respostas:

157

Por padrão, o ssh pesquisa id_dsae id_rsaarquivos. As chaves não precisam ser nomeadas dessa maneira, você também pode nomeá-las mykeyou até colocá-las em um diretório diferente. No entanto, se você escolher um desses, precisará referenciar explicitamente a chave no comando ssh da seguinte maneira:

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

Se um comando não aceitar -i, por exemplo sshfs, use a IdentityFileopção:

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

Como funciona

Ao gerar uma chave, você obterá dois arquivos: id_rsa(chave privada) e id_rsa.pub(chave pública). Como seus nomes sugerem, a chave privada deve ser mantida em segredo e a chave pública pode ser publicada.

A autenticação de chave pública funciona com uma chave pública e uma privada. O cliente e o servidor têm suas próprias chaves. Ao instalar openssh-servero servidor, chaves públicas e privadas são geradas automaticamente. Para o cliente, você terá que fazer isso sozinho.

Quando você (cliente) se conecta a um servidor, as chaves públicas são trocadas. Você receberá os servidores um e o servidor seu. Na primeira vez que você receber a chave pública do servidor, você será solicitado a aceitá-la. Se essa chave pública mudar ao longo do tempo, você será avisado porque um possível ataque MITM (homem no meio) está acontecendo, interceptando o tráfego entre o cliente e o servidor.

O servidor verifica se você tem permissão para se conectar (definido em /etc/ssh/sshd_config) e se sua chave pública está listada no ~/.ssh/authorized_keysarquivo. Possíveis razões pelas quais a chave pública é negada:

  • /etc/ssh/sshd_config:
    • AllowUsersou AllowGroupsestá especificado, mas o usuário do servidor não está listado na lista de grupos ou usuários (o padrão não é definido, não havendo restrição para os usuários ou grupos de efetuar login).
    • DenyUsersou DenyGroupsestá especificado e você está na lista de usuários ou grupos.
    • Você está tentando fazer login como root, mas PermitRootLoginestá definido como No(padrão yes).
    • PubkeyAuthenticationestá definido como No(padrão yes).
    • AuthorizedKeysFileestá definido para um local diferente e as chaves públicas não são adicionadas a esse arquivo (padrão .ssh/authorized_keys, em relação ao diretório inicial)
  • ~/.ssh/authorized_keys: sua chave pública não é adicionada neste arquivo (observe que este arquivo é lido como usuário root)

Usando várias chaves

Não é incomum usar várias chaves. Em vez de executar ssh user@host -i /path/to/identity_file, você pode usar um arquivo de configuração ~/.ssh/config,.

As configurações comuns são o IdentityFile (as chaves) e a porta. A próxima configuração verificará "id_dsa" e "bender" somente ao se conectar com ssh youruser@yourhost:

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

Se você omitir Host yourhost, as configurações serão aplicadas a todas as conexões SSH. Outras opções também pode ser especificado para este jogo host, como User youruser, Port 2222, etc. Isso permitirá que você se conectar com a abreviação ssh yourhostem vez de ssh -p2222 youruser@yourhost -i ~/.ssh/id_dsa -i ~/.ssh/bender.

Lekensteyn
fonte
11
por que preciso especificar a chave? a questão toda é para que eu possa fazer o ssh na máquina com mais facilidade.
myusuf3
2
@StevenRoose from ssh_config(5): O nome do arquivo pode usar a sintaxe til para se referir ao diretório inicial de um usuário ou a um dos seguintes caracteres de escape: '% d' (diretório inicial do usuário local), '% u' (nome do usuário local), '% l '(nome do host local),'% h '(nome do host remoto) ou'% r '(nome do usuário remoto). Não é possível especificar curingas, mas isso deve ser conveniente o suficiente, eu acho. Esteja ciente de que um servidor precisa analisar cada chave que você enviou, portanto, especificar menos chaves é melhor. Os curingas no host funcionam, consulte novamente a página de manual de ssh_config(5).
Lekensteyn
2
@therobyouknow Você não precisa criar um par de chaves exclusivo para cada máquina. Normalmente você tem poucas chaves e anexa a chave pública de uma das chaves ao .ssh/authorized_keysarquivo nas máquinas remotas. Se você usar o .ssh/id_rsanome do arquivo padrão (ou id_dsa, id_ecdsa ou o id_ed25519 recente), o ssh tentará isso automaticamente e você não precisará especificar IdentityFilena sua configuração (ou no -i path/to/id_fileparâmetro ssh).
Lekensteyn
4
Adoro respostas que vão além dos detalhes exigidos e explicam o conceito. Trabalho maravilhoso! 1
user2490003
11
@landed É o host do servidor SSH (pode ser um endereço IP ou nome DNS). Eu tentei esclarecer essa seção, espero que ajude.
Lekensteyn
40

Meu método favorito permite que a chave privada seja selecionada automaticamente

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

O SSH substituirá% l pelo nome da máquina local,% r pelo nome de usuário remoto e% h pelo host remoto; portanto, se eu quiser conectar-me da minha máquina chamada foo a bar como usuário, execute:

ssh bar

E o ssh usaria automaticamente:

~/.ssh/foo_user@bar_id_rsa

Como o host local também é armazenado, isso permite diretórios pessoais compartilhados por NFS (chave diferente por máquina!) Ou até mesmo identifica em qual máquina a chave deveria estar ...

Viperfang
fonte
1

Considerando o comentário de StevenRoose de que leva mais tempo para especificar muitas teclas e, por acaso, estou brincando com muitas teclas, gostaria de sugerir minha solução pessoal.

Crio um link simbólico para a chave que quero usar no momento e, como isso muda com pouca frequência, dependendo do projeto em que estou trabalhando, fico feliz com isso.

Aqui, vinculei às minhas chaves para máquinas rodando em 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

Também se pode adicionar um script muito rápido para mudar para outro conjunto sem a necessidade de digitar manualmente o comando ln novamente.

Novamente, essa não é uma solução apenas para duas chaves, mas para um número maior, pode ser viável.

ajhcasual
fonte
11
Acabei de adicionar um alias por bash_profile para cada servidor com o qual trabalho. Portanto, para um servidor chamado bob, eu só tenho esse ... alias bob = "ssh bob.example.com -l pete -i / path / to / key" - então apenas digito bob - e estou dentro!
precisa
2
Embora às vezes seja mais fácil "fazer as coisas do jeito que você já sabe", existem abordagens mais fáceis se você configurar chaves e hosts .ssh / configs. Este comentário é dirigido tanto no comentário cartaz e comentarista @ Peter-Bagnall
Scott Prive