DEV Community

Jairo Cuartas
Jairo Cuartas

Posted on

Creación de Contenedores con Servidores SSH: Enfoque Práctico y Seguro

Introducción

Los contenedores se han convertido en una solución fundamental para desplegar y gestionar aplicaciones de manera eficiente y escalable. Utilizar contenedores para alojar servidores SSH no solo simplifica la administración y el despliegue de estos servicios, sino que también permite una mejor seguridad y control. En este artículo, exploraremos cómo configurar un servidor SSH en un contenedor Docker, siguiendo un enfoque que prioriza la seguridad y la facilidad de implementación.

Objetivo del artículo

El objetivo principal de este artículo es guiar a los desarrolladores y administradores a través del proceso de configuración de un servidor SSH en un contenedor de manera práctica y segura. Nos centraremos en cómo asegurar el acceso al servidor SSH y cómo implementar políticas de seguridad para protegerlo contra posibles ataques.

Preparación del entorno y configuración del contenedor dependiendo de la necesidad

A continuación se mostrará un ejemplo practico, simple y cumpliendo con algunas consideraciones de seguridad para proteger el contenedor ante posibles ataques y también utilizar buenas practicas en la construcción de un contenedor de docker. Esto se basa en el repositorio https://github.com/jacs4210/sshseerver-on-containers.git.

Se utilizará el Dockerfile “DockerfileSshUserPubKey” como ejemplo:

Configuración inicial

Para empezar, clonaremos el repositorio mencionado y utilizaremos el Dockerfile para crear una imagen personalizada. Este Dockerfile está diseñado para configurar un entorno optimizado para ejecutar un servidor SSH seguro.

# Clonar el repositorio
git clone https://github.com/jacs4210/sshseerver-on-containers.git

cd sshserver-on-containers

# Construir la imagen Docker
docker build -t sshserver-secure -f DockerfileSshUserPubKey .
Enter fullscreen mode Exit fullscreen mode

El Dockerfile está configurado para instalar y configurar automáticamente OpenSSH y otros componentes necesarios.

Personalización de la imagen de Docker

En esta etapa, es importante incluir configuraciones de seguridad adicionales, como establecer permisos de usuario y definir las opciones de autenticación. Esto se puede hacer con las siguientes configuraciones en el Dockerfile:


# Crear un usuario no privilegiado
RUN adduser -s /bin/bash -D sshuser && echo "sshuser:sshuser" | chpasswd && \
    mkdir -p /home/sshuser/.ssh && chmod 700 /home/sshuser/.ssh

# Configurar el servidor SSH para deshabilitar el acceso root y permitir solo a un usuario especifico
RUN echo "PermitRootLogin no" > /etc/ssh/sshd_config && \
    echo "AllowUsers sshuser" >> /etc/ssh/sshd_config
Enter fullscreen mode Exit fullscreen mode

Estas configuraciones aseguran que el acceso al servidor SSH esté limitado a un usuario específico, en este caso, sshuser, y que no se permita el inicio de sesión directo como root. Tener en cuenta que el valor definido en password será ajustado por el usuario que utilice este ejemplo.

Configuración segura del servidor SSH dentro del contenedor

Restricción de acceso

Una de las medidas más importantes para proteger un servidor SSH es deshabilitar el inicio de sesión mediante contraseña y requerir el uso de llaves públicas para la autenticación. Esto se puede hacer añadiendo las siguientes líneas al archivo de configuración del servidor SSH (/etc/ssh/sshd_config):


# Configurar que se permita acceso con un usuario diferente de root y utilizando unicamente contraseña.
RUN echo "PasswordAuthentication no" >> /etc/ssh/sshd_config && \
    echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config
Enter fullscreen mode Exit fullscreen mode

Este enfoque garantiza que solo los usuarios con la llave pública correcta puedan acceder al servidor, eliminando el riesgo de ataques por fuerza bruta a las contraseñas.

Uso de usuarios no privilegiados

En lugar de ejecutar el servidor SSH como root, utilizamos un usuario no privilegiado, como sshuser. Esta práctica ayuda a minimizar el impacto de posibles vulnerabilidades o ataques, ya que cualquier proceso comprometido tendría permisos limitados.

Entre otras cosas configuradas en el Dockerfile

  • Uso de una imagen alpine para garantizar que la imagen sea liviana con arquitectura ARM64 para host MacOS con chip M1, cabe aclarar que se puede utilizar la que se ajuste a la arquitectura del host donde se construya la imagen.
  • Copiado de llave publica y autorización de llave para que pueda acceder de inmediato al contenedor por ssh, sin embargo, es posible eliminar las lineas del Dockerfile y copiar la llave ssh por aparte.

    # Copiar la llave pública autorizada, por lo tanto, se recomienda crear la llave ssh del usuario que desean proveerle el acceso.
    COPY id_rsa.pub /home/sshuser/.ssh/authorized_keys
    RUN chmod 600 /home/sshuser/.ssh/authorized_keys && \
        chown -R sshuser:sshuser /home/sshuser/.ssh
    

    Por lo tanto, para crear una llave ssh tener en cuenta lo siguiente se puede ejecutar el siguiente comando en caso de no tener una en el sistema local.

    ssh-keygen -t rsa -b 4096 -C "tu-email@ejemplo.com"
    

    Este comando creará una nueva llave SSH usando el algoritmo RSA con un tamaño de 4096 bits. Sigue las instrucciones en la terminal para guardar la llave en la ubicación predeterminada y proporcionar una frase de paso para mayor seguridad.

    Una vez que la llave SSH esté generada, la llave pública (id_rsa.pub) se puede copiar al contenedor como se muestra en el ejemplo del Dockerfile.

    Adicionalmente, es fundamental que mantengas la llave privada (id_rsa) segura y nunca la compartas con nadie. La seguridad de tu conexión SSH depende de que la llave privada permanezca exclusivamente en tu posesión. Almacénala en un lugar seguro en tu sistema local y asegúrate de utilizar permisos restrictivos, como los que se muestran a continuación:

    chmod 600 ~/.ssh/id_rsa
    

    Este comando asegura que solo el propietario del archivo pueda leer y escribir en la llave privada, lo cual es una medida esencial para prevenir accesos no autorizados.

Conclusiones y recomendaciones

El uso de contenedores para alojar servidores SSH ofrece ventajas claras en términos de replicación, gestión y seguridad. Al aplicar las mejores prácticas de seguridad, como el uso de llaves públicas para la autenticación y la ejecución de procesos con usuarios no privilegiados, es posible reducir significativamente los riesgos asociados con el acceso no autorizado.

Recomendamos mantener un enfoque de mejora continua en las configuraciones de seguridad, revisando regularmente las políticas y aplicando actualizaciones según sea necesario.

Recursos adicionales

  • Repositorio https://github.com/jacs4210/sshseerver-on-containers.git: Contiene ejemplos detallados y configuraciones adicionales para implementar servidores SSH en contenedores.
  • Documentación oficial de Docker: https://docs.docker.com/
  • Guía de seguridad para servidores SSH: https://www.ssh.com/academy/ssh

Top comments (0)