SSH para conectarse a servidores remotos

March 01, 2017

Desarrolladores  General  Guias 


Este es el primero de una serie de semi-tutoriales en los que voy a explicar cómo funciona cierta tecnología, y cómo fue utilizada para crear nuestro sitio, además de algunos tips o soluciones a problemas que nos encontramos en el camino.

Nota importante: Los tutoriales pueden parecer orientados a muy novatos, y probablemente lo sean, pero algunos detalles pueden no ser conocidos por no tan novatos.

¿Qué es SSH?

De wikipedia: es el nombre de un protocolo y del programa que lo implementa, y sirve para acceder a máquinas remotas a través de una red. Permite manejar por completo la computadora mediante un intérprete de comandos. Además de la conexión a otros dispositivos, SSH nos permite copiar datos de forma segura.

Funcionamiento

SSH funciona conectando un programa cliente a un servidor SSH. Generalmente, el servidor ssh está, por defecto, funcionando en un Droplet.

El programa cliente para conectarse a un sistema remoto utilizando SSH, en linux se llama ssh. En el caso de Windows hay muchas opciones, la más común es PuTTY

Para conectarnos a un sistema remoto, la forma más básica del comando es:

ssh sistema_remoto

En este ejemplo, sistema_remoto puede ser la dirección IP o el nombre de dominio del sistema al que intentamos conectarnos.

Ese comando básico, asume que el usuario con el que intentamos conectarnos al sistema es el mismo al usuario de nuestra máquina local. En caso de que necesitemos conectarnos con otro usuario, el comando es:

ssh usuario@sistema_remoto

Una vez nos conectemos al servidor, seguramente se nos preguntará por la contraseña de ese usuario.

Uso de llaves privadas

Aunque sea útil el poder conectarnos a un sistema remoto utilizando contraseñas, es una idea mucho mejor utilizar un sistema de autenticación basado en llaves.

¿Cómo funcionan las llaves?

Esta sistema de autenticación, funciona creando un par de llaves, una pública, y una privada.

La llave privada está siempre en la máquina cliente, es decir, quien quiere conectarse al sistema remoto, y siempre debe estar segura y ser mantenida en secreto.

La llave pública es la que se provee a los sistemas a los que después queremos acceder de forma segura.

Cuando intentamos conectarnos a un sistema remoto utilizando las llaves, el sistema remoto creará un mensaje para el sistema cliente (Nosotros) que sólo puede ser leído con la llave privada.

Después, nuestro sistema envía la respuesta apropiada de vuelta al remoto y así sabrá que quien intenta conectarse en verdad somos nosotros.

Todo este proceso se da de forma automática y transparente al usuario, pero es bueno conocerlo.

Creación de las llaves

El conjunto de llaves deberían ser generadas en el sistema desde el cual queremos conectarnos, que generalmente es nuestra PC.

También pueden generarse llaves en el sistema remoto, pero es altamente no recomendado.

Para crear el conjunto de llaves, ejecutamos lo siguiente en la línea de comandos:

ssh-keygen -t rsa

Presionamos enter para aceptar los valores por defecto, o podemos elegir dónde y cómo llamar al par de llaves. Una vez creadas, y en caso de haber elegido los valores por defecto, las llaves deberían estar en ~/.ssh/id_rsa.pub y ~/.ssh/id_rsa.

Si entramos al directorio .ssh y vemos los permisos de los archivos, veremos algo como esto:

Output  
-rw-r--r-- 1 demo demo  807 Sep  9 22:15 authorized_keys
-rw------- 1 demo demo 1679 Sep  9 23:13 id_rsa
-rw-r--r-- 1 demo demo  396 Sep  9 23:13 id_rsa.pub

Como podemos ver, el archivo id_rsa es sólo visible para el usuario que lo creó, y así debería quedar para ser secreto. El archivo id_rsa.pub, por otro lado, puede ser compartido y tiene los permisos necesarios para tal fin.

Instalando la llave pública

La instalación de nuestra llave pública en el sistema remoto es un paso muy importante para poder conectarnos más adelante.

La forma más sencilla de conseguir esto es ejecutando el siguiente comando

ssh-copy-id sistema_remoto

Esto va a iniciar una sesión SSH, en la que deberemos introducir la contraseña del usuario. Una vez hecho esto, la llave pública se copiará al archivo de llaves autorizadas del sistema remoto, lo que nos permitirá conectarnos con la llave la próxima vez.

Bonus

Uno de los problemas más comunes que nos enfrentamos cuando intentamos configurar el inicio de sesión con llaves en un servidor gestionado por nosotros, suele ser que el mismo servidor nos siga pidiendo la contraseña del usuario incluso después de configurar todo.

Este problema no se debe a que hayamos cometido un error durante todo el proceso, sino que muy seguramente el directorio home del usuario está encriptado.

Si tenemos en cuenta que el archivo de claves aceptadas de nuestro usuario está dentro de un directorio encriptado, tiene sentido que no podamos comprobar las llaves porque el archivo está encriptado.

Hay muchas maneras de solucionar este problema si somos capaces de buscarlo en internet, pero la solución que terminamos utilizando nostros es:

Creamos un directorio dentro del directorio de SSH:

sudo mkdir -p /etc/ssh/keys

Movemos el archivo authorized_keys de nuestro usuario dentro de esa carpeta y le cambiamos el nombre por nuestro usuario:

sudo mv /home/usuario/.ssh/authorized_keys /etc/ssh/keys/usuario

Creamos un enlace simbólico desde ese archivo a donde estaba el archivo original:

 sudo ln -s /etc/ssh/keys/usuario /home/usuario/.ssh/authorized_keys

Editamos el archivo sshd_config para que funcione esta nueva forma:

sudo vim /etc/ssh/sshd_config

Buscamos la línea que dice AuthorizedKeysFile y la cambiamos por:

AuthorizedKeysFile /etc/ssh/keys/%u

Guardamos el archivo, reiniciamos el servicio, y listo.

Esta última línea que modificamos, indica al servicio que busque dentro de esa carpeta, un archivo con el nombre del usuario, y utilice ese archivo para verificar las llaves autorizadas.

Si queremos agregar un nuevo usuario, sólo debemos recordar hacer los pasos 2 y 3 para que pueda ingresar al sistema.