Adicione com segurança um host (por exemplo, GitHub) ao arquivo SS_ known_hosts

20

Como posso adicionar uma chave de host ao known_hostsarquivo SSH com segurança?

Estou configurando uma máquina de desenvolvimento e quero (por exemplo) impedir que o gitprompt seja clonado quando clonar um repositório github.comusando SSH.

Eu sei que posso usar StrictHostKeyChecking=no(por exemplo, esta resposta ), mas isso não é seguro.

Até agora, eu encontrei ...

  1. O GitHub publica suas impressões digitais chave do SSH em https://help.github.com/articles/github-s-ssh-key-fingerprints/

  2. Eu posso usar ssh-keyscanpara obter a chave do host github.com.

Como eu combino esses fatos? Dada uma lista pré-preenchida de impressões digitais, como verifico se a saída de ssh-keyscanpode ser adicionada ao known_hostsarquivo?


Acho que estou perguntando o seguinte:

Como obtenho a impressão digital de uma chave retornada ssh-keyscan?

Vamos supor que eu já tenha sido MITM-ed para SSH, mas que posso confiar na página GitHub HTTPS (porque ela possui uma cadeia de certificados válida).

Isso significa que eu tenho algumas chaves de host SSH (suspeitas) (de ssh-keyscan) e algumas impressões digitais de chaves (confiáveis). Como verifico um contra o outro?


Relacionado: como faço o hash da parte do host da saída ssh-keyscan? Ou posso misturar hosts com hash / unhashed known_hosts?

Roger Lipscombe
fonte
Por que não seria seguro para o seu caso de uso?
quadruplebucky
StrictHostKeyChecking=noé vulnerável ao MITM. É ssh-keyscanseguro contra o MITM?
Roger Lipscombe
Não consigo entender por que estou excessivamente preocupado com alguém representando um estranho Eu nunca conheci quem eu estou confiando o suficiente para escrever código que estou prestes a baixar e executar ...
quadruplebucky
Porque este é o meu código-fonte em um repositório particular no github, e eu não quero que um MITM (por exemplo) introduza alterações maliciosas quando envio por push. Esse é apenas um exemplo.
Roger Lipscombe
Eu (para melhor ou para pior) escolho confiar no github. Não escolho confiar em todos os links de rede aleatórios entre mim e eles.
Roger Lipscombe

Respostas:

11

A parte mais importante da adição "segura" de uma chave ao known_hostsarquivo é obter a impressão digital da chave do administrador do servidor. A impressão digital principal deve ser algo como isto:

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

No caso do GitHub, normalmente não podemos conversar diretamente com um administrador. No entanto, eles colocam a chave em suas páginas da web para que possamos recuperar as informações a partir daí.

Instalação manual da chave

1) Tire uma cópia da chave do servidor e obtenha sua impressão digital. NB: Faça isso antes de verificar a impressão digital.

$ ssh-keyscan -t rsa github.com | tee github-key-temp | ssh-keygen -lf -
# github.com:22 SSH-2.0-babeld-f3847d63
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

2) Obtenha uma cópia da impressão digital chave do administrador do servidor - nesse caso, navegue até a página com as informações em github.com

  1. Vá para github.com
  2. Vá para a página de ajuda (no menu à direita, se estiver logado; na parte inferior da página inicial, caso contrário).
  3. Na seção Introdução , vá para Conectando ao GitHub com SSH
  4. Vá para Testando sua conexão SSH
  5. Copie a impressão digital SHA256 dessa página no seu editor de texto para uso posterior.

3) Compare as chaves das duas fontes

Ao colocá-los diretamente um acima do outro em um editor de texto, é fácil ver se algo mudou

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA) #key recovered from github website
2048 SHA256:nThbg6kXUpJ3Gl7E1InsaspRomtxdcArLviKaEsTGY8 github.com (RSA) #key recovered with keyscan

(Observe que a segunda chave foi manipulada, mas se parece bastante com a original - se algo assim acontecer, você estará sob um ataque sério e deverá entrar em contato com um especialista em segurança confiável.)

Se as chaves forem diferentes, interrompa o procedimento e entre em contato com um especialista em segurança

4) Se as chaves forem comparadas corretamente, você deverá instalar a chave que já baixou

cat github-key-temp >> ~/.ssh/known_hosts

Ou para instalar para todos os usuários em um sistema (como root):

cat github-key-temp >> /etc/ssh/ssh_known_hosts

Instalação automatizada de chaves

Se você precisar adicionar uma chave durante um processo de compilação, siga as etapas 1 a 3 do processo manual acima.

Feito isso, examine o conteúdo do seu github-key-temparquivo e crie um script para adicioná-lo ao seu arquivo hosts conhecido.

if ! grep github.com ~/.ssh/known_hosts > /dev/null
then
     echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" >> ~/.ssh/known_hosts
fi

Agora você deve se livrar de todos os sshcomandos que foram StrictHostKeyCheckingdesativados.

Michael
fonte
17

Você pode misturar entradas com hash / unhashed no seu arquivo known_hosts.

Portanto, se você deseja adicionar a chave do github, basta:

ssh-keyscan github.com >> ~/.ssh/known_hosts

Se desejar, adicione -H

ssh-keyscan -H github.com >> ~/.ssh/known_hosts

Pequenino
fonte
11
Qual é a diferença entre hashed / unhashed? Eu sei o que é hash, mas não por que é aplicado nesse contexto.
21419 Glen Glen Thomas
3
O hash de suas entradas permite ocultar informações sobre os hosts aos quais você está acostumado. Verifique a resposta aceita em security.stackexchange.com/questions/56268/…
Wee
4
Isso não responde à pergunta. O uso do ssh-keyscan está sujeito a um ataque intermediário, o que significa que a chave que você armazena pode ser uma chave pertencente ao invasor que tenta invadir seu sistema. Por favor, veja minha resposta para uma maneira de verificar as coisas.
Michael
Att. Chamando a atenção para as respostas que têm brindes sido incorreta - "as duas principais respostas são realmente inseguro"
Peter Mortensen
6

A maneira mais fácil é buscar manualmente as chaves usando ssh-keyscan, verifique-as manualmente:

$ ssh-keyscan -t rsa github.com | ssh-keygen -lf -
# github.com:22 SSH-2.0-libssh-0.7.0
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

E adicione-os ao seu script, que carregará a chave pública "autoritativa".

Jakuje
fonte
Eu tenho as chaves, como você disse, como as 'adiciono ao meu script'?
Glen Thomas
Como um arquivo separado ou como uma sequência no seu script.
Jakuje 14/02/19
Essa resposta é perigosa porque oculta no "verifique-os manualmente" é um processo totalmente difícil. Adicionei uma resposta abaixo, que tenta explicar como fazer isso e usar os resultados com segurança.
Michael
Att. Chamando a atenção para as respostas que têm brindes sido incorreta - "as duas principais respostas são realmente inseguro"
Peter Mortensen
11
@RogerLipscombe Concordo que a resposta possa ser interpretada com segurança - "verifique-as manualmente" não é explicado, mas se você entende que significa "seguir as instruções na página de manual do ssh", provavelmente isso seria bom. O risco aqui é que alguém pode não entender isso e, por exemplo, tentar coisas inseguras, como verificar a chave depois de fazer login no servidor. Foi por isso que chamei essa resposta de "perigosa" e outra de "insegura" - o detalhe de como você verifica manualmente é a parte importante. Obrigado pela aceitação.
Michael