Como posso adicionar uma chave de host ao known_hosts
arquivo SSH com segurança?
Estou configurando uma máquina de desenvolvimento e quero (p.ex.) evitar o git
prompt ao clonar um repositório github.com
usando SSH.
Eu sei que posso usar StrictHostKeyChecking=no
(por exemplo , esta resposta ), mas isso não é seguro.
Até agora, encontrei...
O GitHub publica suas impressões digitais de chave SSH nas impressões digitais de chave SSH do GitHub
Eu posso usar
ssh-keyscan
para obter a chave do host para arquivosgithub.com
.
Como combino esses fatos? Dada uma lista pré-preenchida de impressões digitais, como verifico se a saída de ssh-keyscan
pode ser adicionada ao known_hosts
arquivo?
Acho que estou perguntando o seguinte:
Como obtenho a impressão digital de uma chave retornada por ssh-keyscan
?
Vamos supor que eu já tenha sido MITM-ed para SSH, mas que posso confiar na página HTTPS do GitHub (porque ela tem uma cadeia de certificados válida).
Isso significa que 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 de ssh-keyscan
? Ou posso misturar hosts com hash/sem hash em known_hosts
?
A parte mais importante da adição "segura" de uma chave ao
known_hosts
arquivo é obter a impressão digital da chave do administrador do servidor. A impressão digital da chave deve ser algo assim:No caso do GitHub, normalmente não podemos falar diretamente com um administrador. No entanto, eles colocam a chave em suas páginas da web para que possamos recuperar as informações de lá.
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.
2) Obtenha uma cópia da impressão digital da chave do administrador do servidor - neste caso, navegue até a página com as informações no github.com
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
(Observe que a segunda chave foi manipulada, mas é bastante semelhante à original - se algo assim acontecer, você está sob um ataque sério e deve entrar em contato com um especialista em segurança confiável.)
Se as chaves forem diferentes, aborte 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 você já baixou
Ou para instalar para todos os usuários em um sistema (como root):
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-temp
arquivo e crie um script para adicionar esse conteúdo ao seu arquivo de hosts conhecido.Agora você deve se livrar de todos os
ssh
comandos que foramStrictHostKeyChecking
desativados.Você pode misturar entradas com hash/sem hash em seu arquivo known_hosts.
Então, se você quiser adicionar a chave do github, basta fazer:
ssh-keyscan github.com >> ~/.ssh/known_hosts
Se você quiser hash, adicione -H
ssh-keyscan -H github.com >> ~/.ssh/known_hosts
Nota: isso é vulnerável ao ataque MITM, responde apenas à parte "Relacionado" da pergunta.
A maneira mais fácil é buscar manualmente as chaves usando
ssh-keyscan
, verifique-as manualmente:E adicione-os ao seu script, que carregará a chave pública "autorizada".
Eu escrevi um script simples (add_to_known_hosts) para lidar com isso:
Ele não criará entradas duplicadas no arquivo known_hosts e verificará se a impressão digital corresponde a uma fornecida como segundo argumento.
Agora que o GitHub fornece suas chaves SSH e impressões digitais por meio do endpoint da API de metadados (a partir de janeiro de 2022), você pode aproveitar a confiança que tem no certificado TLS do GitHub usado
api.github.com
(por ser assinado por uma autoridade de certificação (CA) que está em armazenamento de certificados raiz confiável do seu sistema) para buscar com segurança suas chaves de host SSH.Se você
jq
instalou, pode fazê-lo com este one-linerOu se você quiser usar Python
Automatizando a verificação de impressão digital SSH Known_Hosts
Estou tentando fazer isso em Python no Jupyterhub há algum tempo, mas a resposta de @Michael foi muito útil!
Sejamos claros - por design, esta etapa para confirmar que um host conhecido NÃO deve ser automatizado, dada a suscetibilidade a ataques man in the middle (mais informações aqui , mas deve ser óbvio por que isso é uma preocupação).
Verificando manualmente SSH RSA Fingerprint para GitHub.com com Python e Bash
A solução insegura
-o "StrictHostKeyChecking no"
foi boa para testes, mas feliz por ter uma alternativa.!
bang no Jupyter para invocar o comando bash parassh-keyscan
&cat
Assert Fingerprints match para confirmar hosts conhecidos
Agora você pode usar uma declaração python para garantir a autenticidade de nossa impressão digital RSA confiável versus a impressão digital RSA digitalizada pela Internet:
Obrigado e uma solução muito melhor para ignorar a verificação rigorosa!
Se você quiser verificar se a chave existe antes de gerar uma nova:
Além disso, no meu caso, tive que mencionar uma porta específica:
Para gerar o arquivo known_hosts, após gerar suas chaves privada e pública e copiar a chave pública para site.com, você pode fazer