Como as chaves públicas são "enviadas" para os servidores e como as chaves privadas são "usadas" para SSH?

11

Existem duas máquinas Linux, A e B. Os scripts em execução em A precisam poder fazer o SSH em B. Portanto, A gera uma chave pública (provavelmente ssh-keygengerada id_rsa.pub) e, em seguida, usa sua respectiva chave privada (novamente, provavelmente id_rsa) para criar essa conexão SSH.

Se qualquer coisa que eu disse acima estiver incorreta ou enganada, comece me corrigindo!

Supondo que eu esteja mais ou menos no alvo:

  • Como A "fornece" B sua chave pública ( id_rsa.pub)? Isso precisa ser um processo manual ou pode ser automatizado? Se manual, qual é o processo? Se automatizado, qual é o comando? Quando B "obtém" essa chave pública, para onde ela é armazenada?
  • Ao iniciar a conexão SSH com B, como A “usa” sua chave privada ( id_rsa) como parte dessa conexão?
user3178622
fonte
3
Por que o voto negativo sem explicação? Mostra pesquisa, é um SSCCE e, que eu saiba, não é uma duplicata. Se você não concorda, e acha que isso é uma duplicata, forneça um link para a pergunta que você acha que é uma duplicata!
user3178622
Embora eu não tenha votado negativamente e não ache essa pergunta ruim, talvez a Pilha de Segurança da Informação seja um local mais adequado.
MC10 19/08/2015
3
Também não votei, mas entendo por que alguém o fez. Esse é um método de login amplamente usado, embora eu concorde que os resultados da pesquisa do Google sejam desordenados sobre como fazê-lo funcionar, e não sobre como funciona os artigos. É possível encontrar as informações que você está procurando.
Tyson
5
A noção de SSCCE não é realmente aplicável a perguntas que não são sobre código.
Scott
2
Não é uma duplicata, mas está relacionada: superuser.com/questions/383732/how-does-ssh-encryption-work . Pode responder à segunda parte da questão (como chaves privadas são usadas)
Jay

Respostas:

5

ssh-keygengera as chaves pública e privada, que residem inicialmente apenas localmente. Dar a chave pública a outro host é algo que o usuário precisaria fazer manualmente, enviando-a para alguém responsável pelo servidor B ou, se você tiver uma conta com uma senha, poderá fazer login e colocá-la lá. Para permitir login sem senha no servidor B, você precisará adicionar sua chave pública ao arquivo ~ / .ssh / allowed_keys no servidor B (uma chave pública por linha, pode haver qualquer número de chaves nesse arquivo). Existe um comando linux ssh-copy-idque copiará o ID para você e o colocará no arquivo.

Por padrão, o ssh usará o arquivo ~ / .ssh / id_XXX como sua chave privada. XXX pode ser rsa, dsa ou qualquer protocolo para o qual uma chave foi gerada. IIRC, dsa é antigo e não deve ser usado. Se você quiser usar uma chave privada diferente, poderá especificá-la no seu comando ssh usando -i. Contanto que a chave privada usada corresponda a uma chave pública na máquina remota (no arquivo de keys_computadas da conta do usuário na qual você está efetuando login), não será necessário fornecer uma senha.

BamaPookie
fonte
Obrigado @BamaPookie - alguns acompanhamentos: (1) quando ssh-keygené executado, você menciona que as duas chaves "residem apenas localmente"? Onde?!? Como em que pasta posso navegar e ver id_rsa.pube id_rsa? (2) Eu pensei que ssh-addera o comando para adicionar uma chave pública authorized_keys, não? Qual é a diferença entre ssh-copy-ide ssh-add? Obrigado novamente!
user3178622
2
@ user3178622 re '1' Eu não tenho na minha frente, mas parece ~/.ssh/id_rsa re '2', o ssh-add não serve para adicionar as chaves_comitentes, mas sim para adicionar a um chaveiro. Eu não usei o ssh -adicione embora. O ssh-add tem a ver com permitir que você não precise digitar uma frase-chave sempre que usar uma chave que exija uma frase-chave. Portanto, se suas chaves ssh não exigirem uma frase-chave, acho que não há motivo para usar ssh-add e acho que você ainda precisará usar ssh-copy-id ou fazer o manual de copiar a chave pública no authorized_keys
barlop
2
O ssh-keygen perguntará onde salvar o arquivo, mas o local padrão é ~ / .ssh / ssh-copy-id copia a chave pública para um host remoto. O ssh-add adiciona uma chave privada ao seu chaveiro local. Adicionar uma chave privada ao seu chaveiro local significa que ela será verificada por padrão ao tentar uma conexão ssh (ou seja, sem precisar especificá-la com -i).
BamaPookie
1
@BamaPookie Onde você escreve "Adicionar uma chave privada ao seu chaveiro local significa que ela será verificada por padrão ao tentar uma conexão ssh (ou seja, sem precisar especificá-la com -i)." <--- Vale a pena esclarecer que Eu acho que você quer dizer que ele altera a chave privada padrão escolhida, de modo que, em vez de ser id_rsa, é do chaveiro. (Obviamente, sem o ssh-add, você ainda não precisará especificar uma chave privada com -i, ela ainda terá um padrão, apenas um padrão diferente).
barlop
3

Existem duas máquinas Linux, A e B. Os scripts em execução em A precisam poder fazer o SSH em B. Portanto, A gera uma chave pública (provavelmente um id_rsa.pub gerado por ssh-keygen) e, em seguida, usa sua respectiva chave privada ( novamente, provavelmente id_rsa) para fazer essa conexão SSH.

Se qualquer coisa que eu disse acima estiver incorreta ou enganada, comece me corrigindo!

Supondo que eu esteja mais ou menos no alvo:

sim

mas B precisa que a chave pública de A seja listada no arquivo allowed_keys de B para que A possa se conectar a B

também é possível excluir id_rsa.pub e ssh para B e ainda funcionará, porque a chave pública é gerada atualizada a cada conexão ssh e não armazenada em nenhum id_rsa.pub

Como A "fornece" B sua chave pública (id_rsa.pub)? Isso precisa ser um processo manual ou pode ser automatizado? Se manual, qual é o processo? Se automatizado, qual é o comando?

manual - algo como

a partir de um-

cat ~/.ssh/id_rsa.pub | ssh USER@HOST "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

ou ainda mais manualmente, para dividir o comando

A $ cat id_rsa.pub | ssh user@host 'cat>~/a.a'

depois em B, verifique se ~ / .ssh existe e faça cat a.a >> ~/.ssh/authorized_keys

e você pode selecionar as teclas autorizadas de B antes e depois para garantir que a chave esteja listada.

Ou você pode enviar um email id_rsa.pub para uma conta de e-mail, e em B, B pode verificar o e-mail e anexar o conteúdo de id_rsa.pub ao arquivo

automaticamente

O comando ssh-copy-id

Você precisa poder fazer o ssh, portanto, precisa de acesso por senha

Em vez de executar o ssh user @ host, você faz o ssh-copy-id user @ host e é solicitada uma senha, você a digita, está inserida e ela copiará a chave pública. E da próxima vez que você usar o ssh user @ host, ele usará a chave

Quando B "obtém" essa chave pública, para onde ela é armazenada?

~s. / Sh

Ao iniciar a conexão SSH com B, como A “usa” sua chave privada (id_rsa) como parte dessa conexão?

bem, eu não sei muito sobre isso, no topo da minha cabeça, mas tudo o que é criptografado com uma chave pode ser descriptografado com a outra chave, e se identificar é um pouco diferente do envio de dados .. e pode haver algo sobre uma chave temporária também.

barlop
fonte
Obrigado @barlop! Por favor, veja minhas perguntas abaixo da resposta do BamaPookie; Eu tenho as mesmas perguntas para você!
user3178622