Implementación de SSH con Docker

Como se describe en el documento los fundamentos de SSH, tenemos un escenario donde no queremos exponer un servidor de base de datos. Las razones por las cuales nos queremos conectar al servidor es para realizar tareas administrativas como crear un usuario, modificar los permisos, o crear objetos nuevos. Cuando este requerimiento es necesario, entonces podemos establecer un redireccionamiento de puerto o entunelamiento SSH, como se conoce. En este caso, lo necesitamos para conectarnos a un servicio en una red interna desde el exterior (internet).

En el diagrama a continuación se muestra en el recuadro la parte que vamos a configurar. Es válido mencionar que aunque se está simulando una red LAN, perfectamente se puede hacer para una red WAN.

Figura 1. Diagrama de red LAN básico con SSH.

Instalación y configuración de SSH

El servicio SSH se puede configurar de dos maneras: por medio de usuario/contraseña o con utilización de llaves. Se puede configurar de la primera manera y luego seguir con la segunda, de modo que si todo funciona correctamente entonces podemos deshabilitar la autenticación por contraseña.

Configuración con contraseña

La configuración con contraseña es sencilla, solo debemos instalar OpenSSH, activar el servicio y asegurarnos que se puede recibir conexiones en el puerto destinado, TCP 22. Primero, debemos ejecutar un contenedor donde podamos instalar y configurar SSH. He creado una imagen personalizada que contiene lo siguiente:

  • OpenSSH instalado
  • Usuario admin creado con los permisos correspondientes
  • Configuración para que pueda ejecutar comandos
  • Configuración del puerto de conexión SSH

Podemos ejecutar una instancia (en modo interactivo) basado en la imagen con el siguiente comando:

docker run --rm -it --name ssh_mysql --hostname ssh_mysql hcastelloncom/ssh:v1.1 sh

Con el prompt del contenedor, podemos verificar que SSH está instalado utilizando el comando which y le pasamos el nombre del daemon:

which sshd

El resultado debería ser la ruta del daemon tal como se puede observar en la figura 2:

Figura 2. Verificación SSH está instalado.

Ahora podemos averiguar el estado del servicio con el comando service que ejecuta un script del System V init. service ssh status

Si encontramos que el servicio no está corriendo, tal como se muestra en la <u>figura 3</u>, entonces podemos utilizar el mismo comando para iniciarlo, cambiando la orden status por start

service ssh start
Figura 3. Verificación estado de SSH e iniciación del servicio.

Verificación del servicio

Antes de configurar SSH para que utilice llaves, debemos verificar que hasta el momento funciona correctamente. Para ello, vamos a instanciar un cliente ssh para que se conecte al contenedor del paso anterior. Vamos a utilizar Alpine de la siguiente manera:

docker run -it --rm --name sshclient alpine sh

Luego de ejecutar el comando, observamos que estamos en el contenedor por el prompt. Actualizamos los paquetes de Alpine e instalamos openssh, que nos da acceso al cliente ssh con los siguientes comandos:

apk update && apk add openssh

Ahora bien, estamos configurando solo el servicio SSH entre un cliente y un servidor. Por tanto, necesitamos conocer la dirección IP del servidor para realizar la prueba. La dirección IP del servidor la podemos obtener con el comando docker container inspect nombre_contenedor y buscar el valor para IPAddress. Una vez que tenemos la dirección IP, entonces podemos comprobar que tenemos conectividad con el servidor con la herramienta ping

ping 172.17.0.2

El resultado del comando debería ser similar al siguiente:

Figura 4. Verificación estado de SSH e iniciación del servicio.

Sólo resta establecer la conexión al servidor. La sintaxis del comando es ssh nombre_usuario@host, donde el host puede ser una dirección o un nombre de dominio, tal como se muestra a continuación:

ssh admin@172.17.0.2

Luego de escribir la contraseña, nos debería mostrar la consola de la instancia remota en la cual podemos ejecutar comandos o realizar tareas.

Figura 5. Verificación de conexión SSH al servidor.

En la segunda parte de este serie, estaremos configurando el servicio para que utilice llaves en lugar de contraseña.

Leave a comment