Aquí está mi situación: estoy configurando un arnés de prueba que, desde un cliente central, lanzará varias instancias de máquinas virtuales y luego ejecutará comandos en ellas a través de ssh
. Las máquinas virtuales tendrán nombres de host y direcciones IP previamente no utilizados, por lo que no estarán en el ~/.ssh/known_hosts
archivo del cliente central.
El problema que tengo es que el primer ssh
comando ejecutado contra una nueva instancia virtual siempre aparece con un mensaje interactivo:
The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?
¿Hay alguna forma de evitar esto y hacer que el nuevo host sea conocido por la máquina del cliente, tal vez usando una clave pública que ya está integrada en la imagen de la máquina virtual? Realmente me gustaría evitar tener que usar Expect o lo que sea para responder el mensaje interactivo si puedo.
fuente
Respuestas:
Establezca la
StrictHostKeyChecking
opción enno
, ya sea en el archivo de configuración o mediante-o
:ssh -o StrictHostKeyChecking=no [email protected]
fuente
Warning: Permanently added 'hostname,1.2.3.4' (RSA) to the list of known hosts.
Para evitar la advertencia, y para evitar que la entrada se agregue a cualquier archivo conocido_hosts, hago:ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null [email protected]
En mi opinión, la mejor manera de hacer esto es la siguiente:
Eso asegurará que no haya entradas duplicadas, que esté cubierto tanto para el nombre de host como para la dirección IP, y también hará un hash de la salida, una medida de seguridad adicional.
fuente
ssh-keyscan
estaban fallando porque mi host de destino no admite el tipo de clave de la versión predeterminada 1. Agregar-t rsa,dsa
al comando solucionó esto.ssh-keygen -F [address]
lugar. medium.com/@wblankenship/…Para los flojos:
-H cambia el nombre de host / dirección IP
fuente
Como se mencionó, usar el escaneo de teclas sería la forma correcta y discreta de hacerlo.
Lo anterior hará el truco para agregar un host, SOLO si aún no se ha agregado. Tampoco es seguro para la concurrencia; no debe ejecutar el fragmento en la misma máquina de origen más de una vez al mismo tiempo, ya que el archivo tmp_hosts puede bloquearse, lo que finalmente hace que el archivo conocido_hosts se hinche ...
fuente
ssh-keyscan
? La razón es que requiere algo de tiempo y una conexión de red adicional.cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts
, pero una edición posterior lo cambió a>>
. Usar>>
es un error. Derrota el propósito de la unicidad en la primera línea y hace que descargue nuevas entradasknown_hosts
cada vez que se ejecuta. (Acabo de publicar una edición para volver a cambiarla.)Puede usar el
ssh-keyscan
comando para tomar la clave pública y agregarla a suknown_hosts
archivo.fuente
Así es como puedes incorporar ssh-keyscan en tu juego:
fuente
esta sería una solución completa, aceptando la clave de host solo por primera vez
fuente
Tuve un problema similar y descubrí que algunas de las respuestas proporcionadas solo me llevaron a una solución automatizada. Lo siguiente es lo que terminé usando, espero que ayude:
Agrega la clave
known_hosts
y no solicita la contraseña.fuente
Entonces, estaba buscando una forma mundana para evitar la interacción manual del host desconocido de clonar un repositorio git como se muestra a continuación:
Tenga en cuenta la huella digital de la clave RSA ...
Entonces, esto es algo de SSH, esto funcionará para git sobre SSH y solo cosas relacionadas con SSH en general ...
Primero, instale nmap en su controlador diario. nmap es muy útil para ciertas cosas, como detectar puertos abiertos y esto: verificar manualmente las huellas dactilares SSH. Pero, volviendo a lo que estamos haciendo.
Bueno. Estoy comprometido en los múltiples lugares y máquinas que lo he comprobado, o la explicación más plausible de que todo es Hunky Dory es lo que está sucediendo.
Esa 'huella digital' es solo una cadena acortada con un algoritmo unidireccional para nuestra conveniencia humana, a riesgo de que más de una cadena se resuelva en la misma huella digital. Sucede, se llaman colisiones.
En cualquier caso, volvamos a la cadena original que podemos ver en contexto a continuación.
Entonces, con anticipación, tenemos una forma de solicitar una forma de identificación del host original.
En este punto, manualmente somos tan vulnerables como automáticamente: las cadenas coinciden, tenemos los datos base que crean la huella digital y podríamos pedir esos datos base (para evitar colisiones) en el futuro.
Ahora, para usar esa cadena de una manera que evite preguntar sobre la autenticidad de un host ...
El archivo conocido_hosts en este caso no utiliza entradas de texto sin formato. Sabrás las entradas hash cuando las veas, se ven como hashes con caracteres aleatorios en lugar de xyz.com o 123.45.67.89.
La primera línea de comentarios aparece exasperantemente, pero puede deshacerse de ella con una simple redirección a través de la convención ">" o ">>".
Como he hecho todo lo posible para obtener datos no contaminados que se utilizarán para identificar un "host" y confianza, agregaré esta identificación a mi archivo conocido_hosts en mi directorio ~ / .ssh. Como ahora se identificará como un host conocido, no recibiré el mensaje mencionado anteriormente cuando eras joven.
Gracias por quedarte conmigo, aquí tienes. Estoy agregando la clave RSA de bitbucket para que pueda interactuar con mis repositorios git allí de forma no interactiva como parte de un flujo de trabajo de CI, pero haga lo que haga lo que quiera.
Entonces, así es como te mantienes virgen por hoy. Puede hacer lo mismo con github siguiendo instrucciones similares en su propio tiempo.
Vi tantas publicaciones de desbordamiento de pila que le dicen que agregue la clave mediante programación a ciegas sin ningún tipo de comprobación. Cuanto más verifique la clave de diferentes máquinas en diferentes redes, más confianza tendrá en que el host es el que dice que es, y eso es lo mejor que puede esperar de esta capa de seguridad.
INCORRECTO
ssh -oStrictHostKeyChecking = sin nombre de host [comando]INCORRECTO
ssh-keyscan -t rsa -H nombre de host >> ~ / .ssh / known_hostsNo hagas ninguna de las cosas anteriores, por favor. Tienes la oportunidad de aumentar tus posibilidades de evitar que alguien escuche tus transferencias de datos a través de un hombre en el medio del ataque. Aprovecha esa oportunidad. La diferencia es verificar literalmente que la clave RSA que tiene es la del servidor de buena fe y ahora sabe cómo obtener esa información para compararla y poder confiar en la conexión. Solo recuerde que más comparaciones de diferentes computadoras y redes generalmente aumentarán su capacidad de confiar en la conexión.
fuente
Hago un script de una sola línea, un poco largo pero útil para hacer esta tarea para hosts con múltiples IP, usando
dig
ybash
fuente
Lo siguiente evita entradas duplicadas en ~ / .ssh / known_hosts:
fuente
mkdir -p ~/.ssh/known_hosts;
¿Cómo estás construyendo estas máquinas? ¿puedes ejecutar un script de actualización dns? ¿Puedes unirte a un dominio IPA?
FreeIPA hace esto automáticamente, pero esencialmente todo lo que necesita es SSHFP dns records y DNSSEC en su zona (freeipa proporciona opciones configurables (dnssec está deshabilitado por defecto)).
Puede obtener los registros SSHFP existentes de su host ejecutando.
ssh-keygen -r jersey.jacobdevans.com
luego, una vez publicado, agregaría
VerifyHostKeyDNS yes
a su ssh_config o ~ / .ssh / configSi / cuando google decide activar DNSSEC, puede ingresar sin un indicador de hostkey.
ssh jersey.jacobdevans.com
PERO mi dominio aún no está firmado, así que por ahora verías ...
fuente
Para hacer esto correctamente, lo que realmente quiere hacer es recopilar las claves públicas del host de las máquinas virtuales a medida que las crea y colocarlas en un archivo en
known_hosts
formato. Luego puede usar-o GlobalKnownHostsFile=...
, señalando ese archivo, para asegurarse de que se está conectando al host al que cree que debería conectarse. Sin embargo, cómo hacerlo depende de cómo esté configurando las máquinas virtuales, pero leerlo del sistema de archivos virtual, si es posible, o incluso hacer que el host imprima el contenido/etc/ssh/ssh_host_rsa_key.pub
durante la configuración puede ser el truco.Dicho esto, esto puede no valer la pena, dependiendo del tipo de entorno en el que esté trabajando y quiénes sean sus adversarios anticipados. Hacer una simple "almacenar en la primera conexión" (a través de un escaneo o simplemente durante la primera conexión "real") como se describe en varias otras respuestas anteriores puede ser considerablemente más fácil y aún proporcionar un poco de seguridad. Sin embargo, si hace esto, le sugiero que cambie el archivo de hosts conocidos del usuario (
-o UserKnownHostsFile=...
) a un archivo específico para esta instalación de prueba en particular; Esto evitará contaminar su archivo de hosts conocidos personales con información de prueba y facilitará la limpieza de las claves públicas ahora inútiles cuando elimine sus máquinas virtuales.fuente
Todo esto
el negocio me seguía molestando, así que opté por
Un guión para gobernarlos a todos
Esta es una variante del script en https://askubuntu.com/a/949731/129227 con la respuesta de Amadu Bah https://serverfault.com/a/858957/162693 en un bucle.
llamada de ejemplo
./sshcheck somedomain sitio1 sitio2 sitio3
El script recorrerá los sitios de nombres y modificará el archivo .ssh / config y .ssh / known_hosts y hará ssh-copy-id a petición: para la última característica, solo deje que las llamadas de prueba ssh fallen, por ejemplo, presionando enter 3 veces en La solicitud de contraseña.
secuencia de comandos sshcheck
fuente
Aquí se explica cómo hacer una colección de hosts
definir una colección de hosts
Luego defina dos tareas para agregar las claves a los hosts conocidos:
fuente
Lo mejor sería verificar la huella digital de cada nuevo servidor / host. Esta es la única forma de autenticar el servidor. Sin ella, su conexión SSH puede estar sujeta a un ataque de hombre en el medio .
Si está realmente seguro de que desea ignorar la comprobación de la huella digital, entonces la segunda mejor opción, menos segura, es usar
StrictHostKeyChecking=accept-new
, que se introdujo en OpenSSH versión 7.6 (2017-10-03) :No utilice el valor anterior
StrictHostKeyChecking=no
que nunca verifica la autenticidad del servidor. (Aunque el significado de esta=no
configuración se cambiará algunas versiones más adelante ).fuente