Introducción §
ssh
nos permite establecer un túnel de comunicación segura con un equipo remoto para muchas cosas, entre las que se encuentran usar una shell
. Para poder ingresar a una máquina usando este protocolo, usualmente nos enfrentaremos a un escenario como este:
❯ ssh [email protected]
[email protected]'s password:
El comando ejecutado ha sido ssh [email protected]
, que básicamente le dice al comando que me quiero conectar al host bolt.htb
con el usuario root
.
Justo después de hacerlo, veo que obtengo una respuesta que más bien es una pregunta: ¿Cuál es la contraseña?
Entonces, ahora me enfrento a que alguna persona con malas intenciones, pueda hacer un ataque de fuerza bruta intentando millones de contraseñas hasta dar con la correcta. Así que… ¿cómo podemos evitar eso? Conozcamos a la infraestructura de llave pública.
PKI (Public Key Infrastructure) §
Sería bueno empezar por una descripción sencilla de qué es esto. Afortunadamente, he hecho un video al respecto y verlo ayudaría a comprender mejor el concepto.
Para poder aplicar este mismo concepto a ssh
, usaremos dos tres elementos principales. Una llave pública, una privada y una lista de llaves admitidas.
Como se explica en ese video, una llave pública es capaz de verificar si un mensaje ha sido firmado por una llave privada. Y, vaya sorpresa, ese es justo el mecanismo que usaremos para poder resolver nuestro problema
Directorio .ssh
§
Aquí se guarda, la configuración y algunos archivos importantes para que ssh
funcione correctamente. Hoy usaremos tres de estos archivos.
Si el directorio no ha sido creado para tu usuario (se debe encontrar en la carpeta home
o ~
), puedes generarlo junto con tu par de llaves con el comando
ssh-keygen
Fichero id_rsa
§
En este archivo se encuentra nuestra llave privada. Es importante nunca compartirla con nadie, porque podría conllevar una suplantación de identidad.
Fichero id_rsa.pub
§
Aquí podemos ver a la pareja de id_rsa
, pues se trata de nuestra llave pública. Este archivo puede ser compartido con cualquier usuario sin riesgo de comprometer nuestro sistema. Por eso se llama llave pública.
Fichero authorized_keys
§
Dentro de este archivo encontramos llaves públicas con autorización para acceder al sistema.
Configuración §
Como el archivo authorized_keys
tiene una lista de llaves públicas admitidas por la cuenta, tendremos una estructura de diretorios como la siguiente
Localhost Remotehost
~/.ssh ~/.ssh
\_ id_rsa \_ authorized_keys
\_ id_rsa.pub
- En localhost, solo será necesario crear el par de llaves con el comando
ssh-keygen
. Esto generará tantoid_rsa
comoid_rsa.pub
. - En la máquina remota, crearemos un directorio
.ssh
en la carpeta del usuario al que se quiere acceder sin contraseña y, dentro, tendremos un archivo llamadoauthorized_keys
. - Dentro de
authorized_keys
colocaremos las llaves públicas de las máquinas desde las que nos queremos conectar. Para hacerlo, solo necesitamos copiar el contenido delid_rsa.pub
que se creó automáticamente y pegarlo dentro deauthorized_keys
. Si ya existe ese archivo y tiene contenido, solo hace falta agregar una línea más y colocarlo ahí.
Cada vez que queramos conectarnos desde una máquina nueva, solo hará falta colocar la llave pública de ese equipo en el archivo authorized_keys
.
¿Cómo funciona? §
Como la máquina remota tiene la llave pública de la local, el problema está resuelto gracias a la criptografía asimétrica.
Cuando se establece la conexión entre ambas computadoras, la remota puede saber si la local tiene la llave privada que le corresponde a alguna de las llaves públicas de authorized_keys
. ¿Cómo? La llave pública solo hace par con una llave privada, de manera que el host que tenga un id_rsa
que haga juego con un id_rsa.pub
dentro de authorized_keys
tiene que haber sido explícitamente ingresado en ese archivo. Por lo tanto, se permite el ingreso sin contraseña y el usuario vería una respuesta del comando como esta.
❯ ssh [email protected]
anti@debian: ~ $
Ahora no necesitamos poner una contraseña para ingresar al host. Solo con el fichero id_rsa
dentro del directorio .ssh
en nuestro home
será suficiente para poder abrir una shell en el host remoto.