¿Cómo se "envían" las claves públicas a los servidores y cómo se "usan" las claves privadas para SSH?

11

Hay dos máquinas Linux, A y B. Las secuencias de comandos que se ejecutan en A necesitan poder SSH en B. Por lo tanto, A genera una clave pública (probablemente ssh-keygengenerada id_rsa.pub) y luego usa su clave privada respectiva (nuevamente, probablemente id_rsa) para hacer esa conexión SSH.

Si algo de lo que he dicho anteriormente es incorrecto o está equivocado, ¡comience por corregirme!

Suponiendo que estoy más o menos en el objetivo:

  • ¿Cómo “da” a B su clave pública ( id_rsa.pub)? ¿Tiene que ser un proceso manual o puede ser automatizado? Si es manual, ¿cuál es el proceso? Si está automatizado, ¿cuál es el comando? Cuando B "obtiene" esta clave pública, ¿a dónde va o se almacena?
  • Al iniciar la conexión SSH a B, ¿cómo “usa” su clave privada ( id_rsa) como parte de esa conexión?
usuario3178622
fuente
3
¿Por qué el voto negativo sin explicación? Muestra investigación, es un SSCCE y, que yo sepa, no es un duplicado. Si no está de acuerdo y cree que esto es un duplicado, ¡proporcione un enlace a la pregunta que considera que es un duplicado!
user3178622
Si bien no voté en contra y no creo que esta pregunta sea mala de ninguna manera, tal vez la Pila de seguridad de la información sería un lugar más adecuado.
MC10
3
Yo tampoco rechacé el voto, pero entiendo por qué alguien lo hizo. Este es un método de inicio de sesión muy utilizado, aunque estoy de acuerdo en que los resultados de búsqueda de Google están saturados de cómo hacer que funcione, y no cómo funciona los artículos. Es posible encontrar la información que está buscando.
Tyson
55
La noción de SSCCE no es realmente aplicable a las preguntas que no se refieren al código.
Scott
2
No es un duplicado pero está relacionado: superuser.com/questions/383732/how-does-ssh-encryption-work . Podría responder la segunda parte de la pregunta (cómo se usan las claves privadas)
Jay

Respuestas:

5

ssh-keygengenera las claves públicas y privadas, que inicialmente residen solo localmente. Dar la clave pública a otro host es algo que el usuario necesitaría hacer manualmente, ya sea enviándolo a alguien responsable del servidor B o si tiene una cuenta con una contraseña, puede iniciar sesión y ponerla allí usted mismo. Para permitir el inicio de sesión sin contraseña en el servidor B, necesitará agregar su clave pública al archivo ~ / .ssh / Authorised_keys en el servidor B (una clave pública por línea, puede haber cualquier cantidad de claves en este archivo). Hay un comando de Linux ssh-copy-idque copiará la ID por usted y la colocará en el archivo.

Por defecto, ssh usará el archivo ~ / .ssh / id_XXX como su clave privada. XXX puede ser rsa, dsa o cualquier protocolo para el que se generó una clave. IIRC, dsa es viejo y no debe usarse. Si desea usar una clave privada diferente, puede especificarla en su comando ssh usando -i. Siempre que la clave privada que se utilice coincida con una clave pública en la máquina remota (en el archivo Author_keys para la cuenta del usuario en la que está iniciando sesión), no necesitará proporcionar una contraseña.

BamaPookie
fuente
Gracias @BamaPookie: algunos seguimientos: (1) cuando ssh-keygense ejecuta, ¿mencionas que las dos claves "residen solo localmente"? ¿¡¿Dónde?!? Como en, ¿a qué carpeta puedo navegar y ver id_rsa.puby id_rsa? (2) Pensé que ssh-addera el comando para agregar una clave pública authorized_keys, ¿no? ¿Cuál es la diferencia entre ssh-copy-idy ssh-add? ¡Gracias de nuevo!
user3178622
2
@ user3178622 re '1' No lo tengo frente a mí pero parece ~/.ssh/id_rsa re '2', ssh-add no es para agregar a claves_autorizadas, es para agregar a un llavero ... No he usado ssh -aunque sí. ssh-add tiene que ver con permitirle no tener que ingresar una frase clave cada vez que usa una clave que requiere una frase clave. Entonces, si sus claves ssh no requieren una frase clave, entonces supongo que no hay ninguna razón para usar ssh-add y creo que aún necesitaría usar ssh-copy-id o hacer el manual copiando la clave pública en authorized_keys
barlop
2
ssh-keygen le preguntará dónde guardar el archivo, pero la ubicación predeterminada es ~ / .ssh / ssh-copy-id copia la clave pública en un host remoto. ssh-add agrega una clave privada a su llavero local. Agregar una clave privada a su conjunto de claves local significa que se comprobará de manera predeterminada cuando intente una conexión ssh (es decir, sin tener que especificarla con -i).
BamaPookie
1
@BamaPookie Donde escribe "Agregar una clave privada a su llavero local significa que se verificará de manera predeterminada cuando intente una conexión ssh (es decir, sin tener que especificarla con -i)". <--- Vale la pena aclarar que Creo que quiere decir que cambia la clave privada predeterminada que se elige, por lo que en lugar de ser id_rsa, es del llavero. (Por supuesto, sin ssh-add aún no tiene que especificar una clave privada con -i, seguirá teniendo un valor predeterminado, solo un valor predeterminado diferente).
barlop
3

Hay dos máquinas Linux, A y B. Las secuencias de comandos que se ejecutan en A necesitan poder SSH en B. Por lo tanto, A genera una clave pública (probablemente un id_rsa.pub generado por ssh-keygen), y luego usa su clave privada respectiva ( nuevamente, probablemente id_rsa) para hacer esa conexión SSH.

Si algo de lo que he dicho anteriormente es incorrecto o está equivocado, ¡comience por corregirme!

Suponiendo que estoy más o menos en el objetivo:

Si

pero B necesita que la clave pública de A aparezca en el archivo de claves autorizadas de B para que A pueda conectarse a B

también puede eliminar id_rsa.pub y ssh en B y seguirá funcionando, porque la clave pública se genera fresca con cada conexión ssh y no se almacena en ningún id_rsa.pub

¿Cómo “da” a B su clave pública (id_rsa.pub)? ¿Tiene que ser un proceso manual o puede ser automatizado? Si es manual, ¿cuál es el proceso? Si está automatizado, ¿cuál es el comando?

manual - algo como

a partir de una-

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

o incluso más manualmente, para desglosar el comando

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

luego en B, asegúrese de que ~ / .ssh existe y luego haga cat a.a >> ~/.ssh/authorized_keys

y puede colocar las claves_autorizadas de B antes y después para asegurarse de que la clave aparezca en la lista.

O bien, puede enviar un correo electrónico a id_rsa.pub a una cuenta de correo electrónico, luego, desde B, B puede consultar el correo electrónico y agregar el contenido de id_rsa.pub a su archivo de claves autorizadas

automáticamente

El comando ssh-copy-id

Debe poder ingresar, por lo que necesita acceso con contraseña

En lugar de hacer ssh user @ host, hace ssh-copy-id user @ host y se le solicita una contraseña, la ingresa, ya está, copiará la clave pública. Y la próxima vez que haga ssh user @ host, usará la clave.

Cuando B "obtiene" esta clave pública, ¿a dónde va o se almacena?

B's ~ / .ssh / certified_keys

Al iniciar la conexión SSH a B, ¿cómo “usa” su clave privada (id_rsa) como parte de esa conexión?

bueno, no sé mucho al respecto, pero lo que está cifrado con una clave puede descifrarse con la otra clave, e identificarse es un poco diferente al envío de datos ... y puede haber algo sobre una clave temporal también.

barlop
fuente
Gracias @barlop! Por favor, vea mis preguntas debajo de la respuesta de BamaPookie; Tengo las mismas preguntas para ti!
user3178622