Cómo usar SSH en un contenedor Docker

Hola soy Enrique. Os traigo un nuevo post sobre el sistema operativo mas molón. Un placer linuxeros.

¿Cómo se usa SSH para iniciar sesión en un contenedor Docker? El enfoque tradicional consta de dos pasos:

Nivel 1: SSH en su servidor Linux remoto (si está utilizando el contenedor en un sistema remoto) .‌

ssh user_name@server_ip_address

Paso 2: Y luego ingrese el shell de su contenedor Docker en funcionamiento en modo interactivo de la siguiente manera:

docker exec -it container_ID_or_name /bin/bash

Con esto, puede ejecutar un comando de Linux o realizar algún soporte para el servicio que se ejecuta en el contenedor.

No hay nada de malo en el método anterior. Esta es la forma tradicional y recomendada de ingresar a los contenedores sin problemas.

Sin embargo, con un poco de esfuerzo, en realidad puede SSH directamente en un contenedor de trabajo sin primero iniciar sesión en el sistema host.

SSH en un contenedor Docker: ¿pero por qué?

Eso es un poco extraño, ¿no? Entrar en un contenedor a través de SSH. Aunque suene poco convencional, aún puede ser útil según su uso.

A continuación, se muestran algunas cosas que puede lograr con la capacidad de SSH en un contenedor:

Puede configurar un host falso para cualquier atacante potencial. Usando un puerto no estándar para el demonio SSH de su host y dando servicio a la conexión SSH en el puerto 22 para atacantes. Nivel de autorización completamente separado, es decir. iniciar sesión con una contraseña o claves ssh diferentes depende de usted y, por separado, de lo que su host esté usando actualmente. Inicie un proceso remoto automatizado sin utilizar las mismas claves ssh que utilizan las personas de su equipo para iniciar sesión.

Antes de mostrarle cómo hacer todo lo anterior, lo guiaré a través de la idea de cómo funciona realmente.

No se recomienda usar la entrada ssh para un contenedor existente. Esto mata todo el propósito del aislamiento del anfitrión.

Si no está interesado en trabajar en esto, puede ignorar esta sección con seguridad. Te lo mostraré con un contenedor ficticio. Puedes seguir los pasos para practicar.

Lanzar el contenedor

Primero, necesita ejecutar un contenedor Docker. Usaré el extremadamente pequeño alpine:latest imagen por ahora. Inicie el contenedor con este comando:

docker run --rm --name ssh-test -it -p 7655:22 alpine:latest ash 

Algunos puntos notables con respecto a las opciones de la línea de comandos son los siguientes

C --rm opción, no es necesario eliminar explícitamente el contenedor después de eso. El -it Hay opciones disponibles para que pueda tener una envoltura de contenedor interactiva que funcione. Finalmente, vincula el puerto 22 del contenedor al número de puerto del host 7655 (o cualquier otro número de puerto que ya no sea utilizado por el demonio SSH en su sistema host). Tenga en cuenta qué puerto está utilizando.

Configurar el demonio SSH en el contenedor

Ahora necesita instalar el servidor ssh dentro del contenedor. EN Linux alpino, puede utilizar estos comandos: ‌

apk update; apk add openssh-server

A continuación, debe cambiar rápidamente el parámetro de configuración para permitir el inicio de sesión de root. Puede hacer esto editando manualmente el archivo / etc / ssh / sshd_config o usando este comando:

sed -E 's/^#(PermitRootLogin )no/1yes/' /etc/ssh/sshd_config -i 

Genere claves de host con:

ssh-keygen -A

Finalmente, inicie el servidor ssh, inicie /usr/sbin/sshd &. Compruebe si se está ejecutando desde ps aux.

Establezca una contraseña para la cuenta principal de su contenedor

De forma predeterminada, su cuenta de contenedor principal no tiene contraseña. Si abre el acceso SSH, debe configurar la contraseña para la cuenta principal.

Puede usar el comando passwd sin una opción y seguir las instrucciones en pantalla:

passwd

Ingrese al contenedor a través de SSH

Intente iniciar sesión en el contenedor desde otro host ahora.

ssh root@IP_address_of_host_server -p port_number

No necesitas -p opción si está conectado al puerto 22 antes. Para IP, use la dirección IP del servidor host (no el contenedor).

Cuando ejecute el comando, debería ver una salida similar a esta:

debdut@shinchan:/mnt/data/documents/Linux Handbook/container-ssh$ ssh root@domain.com
   root@domain.com's password: 
   Welcome to Alpine!
   
   The Alpine Wiki contains a large amount of how-to guides and general
   information about administrating Alpine systems.
   See <http://wiki.alpinelinux.org/>.
   
   You can setup the system with the command: setup-alpine
   
   You may change this message by editing /etc/motd.
   
   c4585d951883:~#

¿Como funciona esto?

Esto se puede entender mejor visualmente. Tenga en cuenta el siguiente diagrama: ‌

Piense en los contenedores como una máquina virtual cuyo puerto 22 está pegado al puerto 7655 (o al que seleccionó). Esto le permite tener dos procesos ssh diferentes ejecutándose en la misma máquina conectados a diferentes puertos.

Suponga que está utilizando otro puerto SSH en el sistema host y pega el puerto 22 con el puerto del contenedor. Ahora, si alguien intenta conectarse al servidor host a través del puerto SSH 22 de forma predeterminada, estará dentro del sistema de archivos raíz del contenedor.

Configurar SSH para contenedores con Docker Compose [Experts]

No sería justo si lo dejara en este lugar sin proporcionar una opción confiable de contenedor de servidor SSH.

Si desea aprovechar la posibilidad de tener un servidor ssh aislado y diferente con un sistema de archivos raíz separado que se ejecuta en su sistema remoto, puede hacerlo, pero sin seguir la migración anterior, es decir. instale y configure sshd en una base de contenedor de trabajo.

Simplemente porque no es fácilmente reproducible, cada cambio que realice en un contenedor de trabajo no es permanente, el contenedor se reinicia y todo desaparece.

Entonces, aquí le doy una forma mucho más simple, fácilmente reproducible y configurable de implementar el contenedor del servidor SSH en su host remoto.

Supuestos

Obviamente, debe tener instalado Docker Compose. El conocimiento básico de la composición de una ventana acoplable es imprescindible aquí.

Dado que podrá acceder al servidor a través de claves SSH, debe agregar la clave SSH pública de su sistema local al directorio del servidor de su servidor host Linux, donde se encuentra el archivo de compilación de Docker, y mantener el nombre «id_rsa.pub «para usted está seguro.

Prepare el archivo para la compilación

Te sugiero que uses linuxserver/openssh-server imagen. Esta es una imagen muy clara con opciones de configuración suficientemente buenas a través de variables ambientales.

Aquí se colocará todo el archivo de compilación. Copie esto en algún lugar de su servidor y nombre el archivo docker-compose.yaml.‌

version: "3.7"

services:
    ssh:
        image: "linuxserver/openssh-server"
        ports:
            - "22:2222"
        volumes:
            - "./id_rsa.pub:/pubkey:ro"
        environment:
            PUID: $ID
            PGID: $ID
            TZ: $TZ
            PUBLIC_KEY_FILE: "/pubkey"
            SUDO_ACCESS: "false"
            PASSWORD_ACCESS: "false"
            USER_NAME: $USER_NAME
        restart: "always"

Archivo bastante pequeño para componer, ¿verdad? Permítanme explicar las diferentes partes de este archivo de composición.

Volúmenes: Solo tiene una conexión que monta la clave pública en el contenedor como pubkey. Además, es de solo lectura.

Puertos: El proceso sshd dentro del contenedor se ejecuta en el puerto 2222. Es por eso que conecté este puerto al puerto de mi host 22. Modifique 22 según sus necesidades, pero recuerde que tendrá que iniciar sesión en el contenedor a través de SSH más tarde.

Variables ambientales:

USER_NAME: el usuario en el contenedor iniciará sesión desde su máquina local. PUID y PGID: UID y GID de USER_NAME. Esto es opcional, el contenedor asignará automáticamente un par de identificadores no root si las variables de entorno no están configuradas. TZ: su zona horaria actual. Puedes conseguirlo de cat /etc/timezone. PUBLIC_KEY_FILE: Ubicación del archivo de clave pública SUDO_ACCESS & PASSWORD_ACCESS: Se explica por sí mismo.

Reiniciar reglas: He establecido una política de reinicio «siempre» que reiniciará el contenedor, incluso si se vuelve a cargar el demonio.

Expandir el servicio

Para facilitarle las cosas, hice un script Bash que le hará algunas preguntas y, en función de la respuesta, desplegará el servicio.

#! /usr/bin/env bash

vars=("ID" "USER_NAME")
defaults=("991" "dummy")
questions=("What'd be your preferred UID & GID for the username of your choice? [default] " "Your preferred username for the container? [dummy] ")

put()

    echo "$1" >> .env


for i in 1..0; do
    read -p "$questions[$i]" ans
    case $ans in
        ""|"default")
            put "$vars[$i]=$defaults[$i]" ;;
        *)
            put "$vars[$i]=$ans" ;;
    esac
done

put "TZ=$(cat /etc/timezone)"

docker-compose up -d

Guardé el script bash como deploy.sh en el mismo directorio que el archivo de creación de docker-compose.

Ahora, si ejecuta este script, le hará algunas preguntas y luego iniciará el contenedor de la ventana acoplable:

bash deploy.sh

Cuando haya terminado, intente iniciar sesión en el servidor:

ssh user@ip -p port 

Con esto concluye este artículo sobre ssh con contenedores Docker. Si te gustó o tienes algo más que mencionar, no dudes en comentarlo a continuación o enviarme un tweet. @u2345.

Si quieres que escriba otro artículo, no dudes en hacérmelo saber.

Leave a Reply