Cómo realizar SSH en un contenedor Docker

SSH es uno de los comandos más utilizados en la caja de herramientas de un administrador de sistemas, pero no se ve comúnmente junto con Docker. A continuación, le mostramos cómo puede SSH en un contenedor en ejecución y por qué debería pensarlo dos veces antes de hacerlo.

Índice de contenidos()

    ¿Debería usar SSH con contenedores Docker?

    Poner SSH en un contenedor Docker es generalmente una mala práctica que debes evitar. Casi siempre es mejor utilizar el docker exec comando para obtener una cáscara dentro de un contenedor.

    Los recién llegados a Docker pueden tener la tentación de usar SSH para actualizar archivos dentro de un contenedor. Los contenedores están destinados a ser desechables, por lo que deben tratarse como inmutables después de la creación, con la excepción de los datos persistentes almacenados dentro de los volúmenes. Cree una nueva imagen y reinicie el contenedor cuando edite el código fuente.

    Además del proceso de configuración de varios pasos, la instalación de SSH en una imagen de Docker agrega varios paquetes de dependencia y expone otro vector de ataque potencial. En un sistema con varios contenedores activos, ejecutará múltiples procesos SSH independientes y deberá recordar el puerto correcto para cada contenedor.

    En lugar de agregar SSH a contenedores individuales, instálelo una vez en el host físico que ejecuta Docker. Use SSH para conectarse a su host, luego ejecute docker exec -it my-container bash para acceder a los contenedores individuales.

    Tiempo docker exec es el enfoque preferido, todavía hay escenarios en los que SSH podría ser útil. Podría introducirlo como una medida temporal para la integración con los sistemas de distribución heredados. También puede ser utilizado por algunos IDE y herramientas de compilación para proporcionar funcionalidad de recarga en tiempo real durante el desarrollo.

    Instalación del servidor SSH en un contenedor Docker

    Las imágenes base de Docker más populares se mantienen simplificadas intencionalmente. Deberá agregar el servidor OpenSSH usted mismo, incluso en imágenes derivadas de distribuciones comunes del sistema operativo.

    Aquí hay un ejemplo Dockerfile para una imagen basada en Debian:

    RUN apt-get update && apt-get install -y openssh-server
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

ENTRYPOINT service ssh start && bash

    Se ha cambiado la configuración de SSH para que pueda iniciar sesión como root, el usuario predeterminado en un contenedor Docker. Para mayor seguridad, configure una cuenta de usuario dedicada en su lugar:

    RUN useradd -m -s /bin/bash sshuser

    Esto crea un nuevo usuario llamado sshuser con un directorio de inicio-m). los -s El conmutador establece el shell de inicio de sesión predeterminado del usuario en Bash.

    El uso de ENTRYPOINT asegura que el servicio SSH siempre se inicia cuando lo hace el contenedor. Luego, la ejecución se pasa a Bash como un proceso en primer plano del contenedor. Puede reemplazarlo con el binario de su aplicación.

    Configurar la autenticación

    A continuación, debe configurar un sistema de autenticación. Podrías asignar una contraseña a la tuya sshuser cuenta e inicie sesión con eso:

    RUN echo "sshuser:Changeme" | changepasswd

    Una forma más segura es configurar la autenticación de clave SSH. Deberá crear un par de claves en su computadora cliente y luego copiar la parte pública en el contenedor. De esta manera, el demonio SSH puede verificar la identidad de su máquina cuando se conecta.

    Edita tu Dockerfile para configurar el .ssh carpeta de configuración para su usuario. Copie a una clave pública de su directorio de trabajo, con un docker cp comando oa COPY educación en Dockerfile. En este último caso, la clave se insertaría en la imagen, visible para cualquier persona con acceso.

    COPY id_rsa.pub /home/sshuser/.ssh/authorized_keys
RUN chown -R sshuser:sshuser /home/sshuser/.ssh
RUN chmod 600 /home/sshuser/.ssh/authorized_keys

    Esta secuencia de comandos crea SSH authorized_keys archivo con el id_rsa.pub clave pública en el directorio de trabajo. Los permisos del sistema de archivos se ajustan para cumplir con los requisitos de SSH.

    Conexión al contenedor

    Ahora está listo para conectarse a su contenedor. Ejecute el contenedor con el puerto 22 asociado con el host:

    docker run -p 22:22 my-image:latest

    Corriendo ssh [email protected] le dará un caparazón dentro de su contenedor.

    Puede omitir la vinculación de puertos si se conecta desde la máquina que aloja el contenedor Docker. Uso docker inspect para obtener la dirección IP de su contenedor, luego páselo al comando de conexión SSH.

    docker inspect <id-or-name> | grep 'IPAddress' | head -n 1

    Utilice el cliente SSH en su máquina para conectarse al contenedor:

    ssh [email protected]

# OR

ssh [email protected]

    Deberá usar un puerto alternativo si está ejecutando un servidor SSH separado en el host o si tiene varios contenedores que necesitan el puerto 22. A continuación, le mostramos cómo iniciar una conexión cuando SSH está vinculado al puerto 2220:

    docker run -p 22:2220 my-image:latest

ssh [email protected] -p 2220

    Configurar accesos directos a contenedores con configuración SSH

    Puede manipular su archivo de configuración SSH para simplificar las conexiones a contenedores individuales. Modificar ~/.ssh/config para definir hosts abreviados con puertos preconfigurados:

    Host my-container
    HostName 172.17.0.1
    Port 2220
    User sshuser

    Ahora puedes correr ssh my-container para dejar caer directamente en su contenedor. Esto hace que sea más fácil hacer malabares con múltiples conexiones sin recordar las direcciones IP y los puertos del contenedor.

    En su lugar, use Dockssh para simplificar la administración de contenedores

    El proyecto Dockssh va un paso más allá al proporcionar otro demonio que le permite ejecutar ssh [email protected], sin ninguna configuración SSH manual. No es necesario instalar un servidor SSH en los contenedores; Dockssh envía automáticamente las conexiones SSH y realiza las docker exec comando en su lugar.

    Primero debe instalar Redis para almacenar los datos de configuración de Dockssh:

    sudo apt install redis

    Luego, defina los contenedores que desea exponer agregando un registro de Redis con el nombre del contenedor y una contraseña para las conexiones SSH:

    redis-cli set dockssh:my-container:pass "container-password-here"

    Luego descarga Dockssh:

    sudo curl https://github.com/alash3al/dockssh/releases/download/v1.1.0/dockssh_linux_amd64 -O /usr/local/bin/dockssh
sudo chmod +x /usr/local/bin/dockssh
sudo ufw allow 22022

# Start DockSSH server
dockssh

    Ahora puede conectarse a su contenedor:

    ssh [email protected] -p 22022

    Dockssh está escuchando en el puerto 22022 de forma predeterminada. El firewall se abre para permitir conexiones entrantes usando el puerto.

    Se le pedirá la contraseña del contenedor cuando se conecte. Esto se estableció como container-password-here en nuestro registro de Redis anterior.

    El uso de Dockssh simplifica SSH en una gran cantidad de contenedores Docker. Este enfoque es ideal cuando se conecta regularmente a sus contenedores desde un host remoto, ya que simplifica "SSH luego en dos pasos docker exec”Secuencia en un solo comando memorable.

    Registre Dockssh como un servicio del sistema para uso a largo plazo:

    sudo nano /etc/systemd/system/dockssh.service
    [Unit]
Description=Dockssh service
After=network.target

[Service]
type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/usr/local/bin/dockssh

[Install]
WantedBy=multi-user.target

    Habilite el servicio usando systemctl:

    sudo systemctl enable dockssh.service
sudo systemctl start dockssh

    Dockssh ahora se iniciará automáticamente al iniciar el sistema.

    Resumen

    La combinación de SSH con contenedores Docker generalmente se considera un anti-patrón, pero aún tiene sus usos en entornos de desarrollo, prueba y heredados. Cuando no hay alternativa, puede agregar el servidor SSH a su contenedor, copiar una clave pública y conectarse a través de la IP del contenedor o el enlace del puerto de host.

    Los administradores del sistema que quieran administrar de forma remota una gran cantidad de contenedores Docker pueden probar Dockssh. Te permite estar familiarizado ssh comandos a través de un perfecto mapeo detrás de escena para docker exec, ofreciéndole lo mejor de ambos mundos utilizando imágenes sin editar.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir