Agregue de forma segura un host (por ejemplo, GitHub) al archivo SSH known_hosts

20

¿Cómo puedo agregar una clave de host al known_hostsarchivo SSH de forma segura?

Estoy configurando una máquina de desarrollo, y quiero (por ejemplo) evitar que aparezca un gitmensaje cuando clono un repositorio para github.comusar SSH.

Sé que puedo usar StrictHostKeyChecking=no(por ejemplo, esta respuesta ), pero eso no es seguro.

Hasta ahora, he encontrado ...

  1. GitHub publica sus huellas digitales de clave SSH en https://help.github.com/articles/github-s-ssh-key-fingerprints/

  2. Puedo usar ssh-keyscanpara obtener la clave de host github.com.

¿Cómo combino estos hechos? Dada una lista prepoblada de huellas digitales, ¿cómo verifico que la salida de ssh-keyscanse pueda agregar al known_hostsarchivo?


Supongo que estoy preguntando lo siguiente:

¿Cómo obtengo la huella digital de una clave devuelta por ssh-keyscan?

Supongamos que ya he sido MITM-ed para SSH, pero que puedo confiar en la página GitHub HTTPS (porque tiene una cadena de certificados válida).

Eso significa que tengo algunas claves de host SSH (sospechosas) (de ssh-keyscan) y algunas huellas digitales de clave (de confianza). ¿Cómo verifico uno contra el otro?


Relacionado: ¿cómo hago el hash de la parte del host de la salida ssh-keyscan? ¿O puedo mezclar hosts con hash / sin hash known_hosts?

Roger Lipscombe
fuente
¿Por qué no sería seguro para su caso de uso?
quadruplebucky
StrictHostKeyChecking=noes vulnerable a MITM. ¿Es ssh-keyscanseguro contra MITM?
Roger Lipscombe
No entiendo por qué estoy demasiado preocupado por alguien haciéndose pasar por un desconocido que nunca he conocido a quien yo estoy confiando lo suficiente como para escribir código que estoy a punto para descargar y ejecutar ...
quadruplebucky
Debido a que este es mi código fuente en un repositorio privado en github, y no quiero un MITM (por ejemplo) que introduzca cambios maliciosos cuando presiono commits. Ese es solo un ejemplo.
Roger Lipscombe
Yo (para bien o para mal) elijo confiar en Github. No elijo confiar en cada enlace de red aleatorio entre ellos y yo.
Roger Lipscombe

Respuestas:

11

La parte más importante de agregar de forma "segura" una clave al known_hostsarchivo es obtener la huella digital de la clave del administrador del servidor. La huella digital clave debería verse así:

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

En el caso de GitHub, normalmente no podemos hablar directamente con un administrador. Sin embargo, ponen la clave en sus páginas web para que podamos recuperar la información desde allí.

Instalación manual de llaves

1) Tome una copia de la clave del servidor y obtenga su huella digital. NB: Haga esto antes de verificar la huella 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) Obtenga una copia de la huella digital del administrador del servidor; en este caso, vaya a la página con la información en github.com

  1. Ir a github.com
  2. Vaya a la página de ayuda (en el menú de la derecha si ha iniciado sesión; de lo contrario, en la parte inferior de la página de inicio).
  3. En la sección Introducción , vaya a Conectarse a GitHub con SSH
  4. Vaya a Prueba de su conexión SSH
  5. Copie la huella digital SHA256 de esa página en su editor de texto para su uso posterior.

3) Compare las claves de las dos fuentes

Al colocarlos directamente uno encima del otro en un editor de texto, es fácil ver si algo ha cambiado

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

(Tenga en cuenta que la segunda clave ha sido manipulada, pero se parece bastante a la original; si sucede algo como esto, está bajo un ataque grave y debe comunicarse con un experto en seguridad de confianza).

Si las teclas son diferentes, cancele el procedimiento y póngase en contacto con un experto en seguridad.

4) Si las claves se comparan correctamente, entonces debe instalar la clave que ya descargó

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

O para instalar para todos los usuarios en un sistema (como root):

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

Instalación automatizada de llaves

Si necesita agregar una clave durante un proceso de compilación, entonces debe seguir los pasos 1-3 del proceso manual anterior.

Una vez hecho esto, examine el contenido de su github-key-temparchivo y cree un script para agregar esos contenidos a su archivo de hosts conocidos.

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

Ahora debería deshacerse de cualquier sshcomando que se haya StrictHostKeyCheckingdeshabilitado.

Miguel
fuente
17

Puede mezclar entradas hash / no hashed en su archivo conocido_hosts.

Entonces, si desea agregar la clave github, puede hacer lo siguiente:

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

Si quieres hash, agrega -H

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

Pequeñito
fuente
1
¿Cuál es la diferencia entre hash / no hashed? Sé lo que es el hashing, pero no por qué se aplica en este contexto.
Glen Thomas
3
Hashing sus entradas le permite ocultar información sobre los hosts a los que está acostumbrado a conectarse. Verifique la respuesta aceptada en security.stackexchange.com/questions/56268/…
Wee
44
Esto no responde la pregunta. El uso de ssh-keyscan está sujeto a un ataque de hombre en el medio, lo que significa que la clave que almacena podría ser una clave perteneciente al atacante que intenta ingresar en su sistema. Por favor, vea mi respuesta para una forma de verificar las cosas
Michael
Att. Obtener atención para las respuestas que siempre han sido incorrectas : "las dos respuestas principales son realmente inseguras"
Peter Mortensen
6

La forma más fácil es buscar manualmente las claves usando ssh-keyscan, verificarlas 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)

Y agréguelos a su script, que luego llevará la clave pública "autorizada".

Jakuje
fuente
Tengo las llaves como dijiste, ¿cómo las 'agrego a mi script'?
Glen Thomas
Ya sea como un archivo separado o como una cadena en su secuencia de comandos.
Jakuje
Esta respuesta es peligrosa porque oculta en "verificarlos manualmente" es un proceso completamente difícil. A continuación, agregué una respuesta que trata de explicar cómo hacer eso y usar los resultados de manera segura.
Michael
Att. Obtener atención para las respuestas que siempre han sido incorrectas : "las dos respuestas principales son realmente inseguras"
Peter Mortensen
1
@RogerLipscombe Estoy de acuerdo en que la respuesta podría interpretarse de forma segura: "verificarlos manualmente" no se explica, pero si entiende que significa "seguir las instrucciones en la página del manual de ssh", entonces probablemente estaría bien. El riesgo aquí es que alguien podría no entender eso y podría, por ejemplo, intentar cosas inseguras como verificar la clave después de iniciar sesión en el servidor. Es por eso que llamé a esta respuesta "peligrosa" y otra "insegura": el detalle de cómo se verifica manualmente es lo importante. Gracias por aceptar.
Michael