<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jairo Cuartas</title>
    <description>The latest articles on DEV Community by Jairo Cuartas (@jacs_dev).</description>
    <link>https://dev.to/jacs_dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F442602%2F2f759ecb-d7c3-4634-8b0c-90825ea508ba.jpeg</url>
      <title>DEV Community: Jairo Cuartas</title>
      <link>https://dev.to/jacs_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jacs_dev"/>
    <language>en</language>
    <item>
      <title>Creación de Contenedores con Servidores SSH: Enfoque Práctico y Seguro</title>
      <dc:creator>Jairo Cuartas</dc:creator>
      <pubDate>Sat, 19 Oct 2024 22:03:19 +0000</pubDate>
      <link>https://dev.to/jacs_dev/creacion-de-contenedores-con-servidores-ssh-enfoque-practico-y-seguro-c1g</link>
      <guid>https://dev.to/jacs_dev/creacion-de-contenedores-con-servidores-ssh-enfoque-practico-y-seguro-c1g</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objetivo del artículo
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparación del entorno y configuración del contenedor dependiendo de la necesidad
&lt;/h2&gt;

&lt;p&gt;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 &lt;a href="https://github.com/jacs4210/sshseerver-on-containers.git" rel="noopener noreferrer"&gt;&lt;code&gt;https://github.com/jacs4210/sshseerver-on-containers.git&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Se utilizará el Dockerfile “DockerfileSshUserPubKey” como ejemplo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuración inicial
&lt;/h3&gt;

&lt;p&gt;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.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clonar el repositorio&lt;/span&gt;
git clone https://github.com/jacs4210/sshseerver-on-containers.git

&lt;span class="nb"&gt;cd &lt;/span&gt;sshserver-on-containers

&lt;span class="c"&gt;# Construir la imagen Docker&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; sshserver-secure &lt;span class="nt"&gt;-f&lt;/span&gt; DockerfileSshUserPubKey &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El Dockerfile  está configurado para instalar y configurar automáticamente OpenSSH y otros componentes necesarios. &lt;/p&gt;

&lt;h3&gt;
  
  
  Personalización de la imagen de Docker
&lt;/h3&gt;

&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;
&lt;span class="c"&gt;# Crear un usuario no privilegiado&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;adduser &lt;span class="nt"&gt;-s&lt;/span&gt; /bin/bash &lt;span class="nt"&gt;-D&lt;/span&gt; sshuser &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"sshuser:sshuser"&lt;/span&gt; | chpasswd &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /home/sshuser/.ssh &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chmod &lt;/span&gt;700 /home/sshuser/.ssh

&lt;span class="c"&gt;# Configurar el servidor SSH para deshabilitar el acceso root y permitir solo a un usuario especifico&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PermitRootLogin no"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/ssh/sshd_config &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"AllowUsers sshuser"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h2&gt;
  
  
  Configuración segura del servidor SSH dentro del contenedor
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Restricción de acceso
&lt;/h3&gt;

&lt;p&gt;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 (&lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;
&lt;span class="c"&gt;# Configurar que se permita acceso con un usuario diferente de root y utilizando unicamente contraseña.&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PasswordAuthentication no"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/ssh/sshd_config &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PubkeyAuthentication yes"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Uso de usuarios no privilegiados
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  Entre otras cosas configuradas en el Dockerfile
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Copiar la llave pública autorizada, por lo tanto, se recomienda crear la llave ssh del usuario que desean proveerle el acceso.&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; id_rsa.pub /home/sshuser/.ssh/authorized_keys&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;600 /home/sshuser/.ssh/authorized_keys &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; sshuser:sshuser /home/sshuser/.ssh
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;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.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"tu-email@ejemplo.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;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.&lt;/p&gt;

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

&lt;p&gt;Adicionalmente, es fundamental que mantengas la llave privada (&lt;code&gt;id_rsa&lt;/code&gt;) 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:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/id_rsa
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusiones y recomendaciones
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Recursos adicionales
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repositorio &lt;a href="https://github.com/jacs4210/sshseerver-on-containers.git" rel="noopener noreferrer"&gt;&lt;code&gt;https://github.com/jacs4210/sshseerver-on-containers.git&lt;/code&gt;&lt;/a&gt;: Contiene ejemplos detallados y configuraciones adicionales para implementar servidores SSH en contenedores.&lt;/li&gt;
&lt;li&gt;Documentación oficial de Docker: &lt;code&gt;https://docs.docker.com/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Guía de seguridad para servidores SSH: &lt;code&gt;https://www.ssh.com/academy/ssh&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>learning</category>
      <category>security</category>
    </item>
  </channel>
</rss>
