GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo usar SSH en un contenedor Docker

¿Cómo usa SSH para ingresar a un contenedor Docker? El enfoque tradicional consta de dos pasos:

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

ssh [email protected]_ip_address

Paso 2 :Y luego ingrese el shell de su contenedor Docker en ejecución en modo interactivo como este:

docker exec -it container_ID_or_name /bin/bash

Con eso, puede ejecutar el comando de Linux o hacer algo de mantenimiento del servicio que se ejecuta dentro del contenedor.

No hay nada malo con el método anterior. Esta es la forma tradicional y recomendada de entrar en contenedores sin esfuerzo.

Sin embargo, con algunos esfuerzos, puede acceder directamente a un contenedor en ejecución mediante SSH, sin iniciar sesión primero en el sistema host.

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

Esto es un poco raro, ¿no? Iniciar sesión en un contenedor, a través de SSH. Aunque suene poco tradicional, podría seguirá siendo útil para usted, de acuerdo con sus casos de uso.

Aquí hay algunas cosas que puede lograr con la capacidad de SSH en un contenedor:

  1. Puede configurar un falso host para cualquier atacante potencial. Mediante el uso de un puerto no estándar para el demonio SSH de su host y sirviendo una conexión SSH en el puerto 22 para los atacantes.
  2. Un nivel de autorización totalmente independiente, es decir, inicios de sesión con contraseña o diferentes claves ssh, todo depende de usted y es independiente de lo que su host esté usando actualmente.
  3. Ejecutar cualquier proceso remoto automatizado, sin usar las mismas claves ssh que usan las personas de su equipo para iniciar sesión.

Antes de mostrarte cómo hacer todas las cosas anteriores, te guiaré a través de la idea de cómo funciona esto realmente.

No se recomienda usar el inicio de sesión ssh para el contenedor existente. Eso mata todo el punto del aislamiento del host.

Configuración del acceso SSH para contenedores Docker [intermedio a experto]

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

Ejecutar un contenedor

Primero, debe iniciar 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 comando son los siguientes

  • Con el --rm opción, no tiene que eliminar explícitamente el contenedor después.
  • El -it las opciones están ahí para que pueda tener un caparazón interactivo y funcional del contenedor.
  • Finalmente, está vinculando el puerto 22 del contenedor al número de puerto 7655 del host (o cualquier otro número de puerto que no esté siendo 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 Alpine Linux, puede usar estos comandos:‌

apk update; apk add openssh-server

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

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

Genere las claves de host con:

ssh-keygen -A

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

Establezca una contraseña para la cuenta raíz de su contenedor

De forma predeterminada, la cuenta raíz de su contenedor no tiene contraseña. Si está abriendo el acceso SSH, debe establecer la contraseña para la cuenta raíz.

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

passwd

Inicie sesión en el contenedor a través de SSH

Desde otro host, intente iniciar sesión en el contenedor ahora.

ssh [email protected]_address_of_host_server -p port_number

No necesitas el -p opción si se conectó al puerto 22 anteriormente. Para IP, use la dirección IP del servidor host (no la del contenedor).

Cuando ejecute el comando, debería ver un resultado similar a este:

[email protected]:/mnt/data/documents/Linux Handbook/container-ssh$ ssh [email protected]
   [email protected]'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:~#

¿Cómo funciona esto?

Esto se puede entender mejor visualmente. Echa un vistazo al siguiente diagrama:‌

Piense en los contenedores como una máquina virtual cuyo puerto 22 está pegado con el puerto 7655 del host (o el que elija). Esto le permite tener dos procesos ssh diferentes ejecutándose en la misma máquina vinculada a diferentes puertos.

Supongamos que usa algún otro puerto para SSH en el sistema host y pega el puerto 22 con el puerto del contenedor. Ahora, si alguien intenta conectarse al servidor host utilizando el puerto 22 predeterminado de SSH, estará dentro del sistema de archivos raíz del contenedor.

Configuración de SSH para contenedores usando Docker Compose [Expertos]

No sería justo si lo dejo en este lugar sin brindarle alguna opción confiable para un contenedor de servidor SSH.

Si quisiera aprovechar las ventajas de tener un servidor ssh diferente y aislado con un sistema de archivos raíz separado ejecutándose en su sistema remoto, podría hacerlo, pero no siguiendo el tutorial anterior, es decir, instalando y configurando sshd en una base en ejecución envase.

Simplemente porque no es fácilmente reproducible, cada cambio que realiza en el contenedor en ejecución no es persistente, un contenedor se reinicia y todo desaparece.

Por lo tanto, aquí le doy una forma mucho más simple, fácilmente reproducible y configurable de implementar un contenedor de servidor SSH en su host remoto.

Requisitos

Necesitas tener docker compose instalado obviamente. El conocimiento básico de docker compose es imprescindible aquí.

Dado que accederá al servidor a través de claves SSH, debe agregar la clave SSH pública de su sistema local al directorio de su servidor host Linux donde se encuentra el archivo docker-compose y mantener el nombre "id_rsa.pub" solo para estar seguro.

Prepare el archivo de redacción

Sugiero usar linuxserver/openssh-server imagen. Esta es una imagen muy liviana con opciones de configuración lo suficientemente buenas a través de variables de entorno.

Aquí se pegará todo el archivo de composición. Copie esto en alguna ubicación 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"

Un archivo de redacción bastante pequeño, ¿no? Permítanme explicar las diferentes partes de este archivo de composición.

Volúmenes: Solo tiene un montaje de enlace único, que monta la clave pública dentro del contenedor como pubkey . También es de solo lectura.

Puertos: El proceso sshd dentro del contenedor se ejecuta en el puerto 2222. Es por eso que vinculé ese puerto al puerto 22 de mi host. Cambie 22 según sus necesidades, pero recuerde que lo necesitará para iniciar sesión en el contenedor a través de SSH más adelante.

Variables de entorno:

  • 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á un par de ID no raíz automáticamente si las variables de entorno no están configuradas.
  • TZ:su zona horaria actual. Puede obtenerlo por cat /etc/timezone .
  • PUBLIC_KEY_FILE:La ubicación del archivo de clave pública
  • SUDO_ACCESS &PASSWORD_ACCESS:Se explica por sí mismo.

Política de reinicio: Establecí la política de reinicio "siempre" que reiniciará el contenedor incluso si se vuelve a cargar el demonio.

Implementar el servicio

Para facilitarle las cosas, he creado un script de Bash que le hará un par de preguntas y, en función de la respuesta, implementará 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 deployment.sh en el mismo directorio donde se encontraba el archivo docker-compose.

Ahora, si ejecuta este script, le hará algunas preguntas y luego ejecutará el contenedor docker:

bash deploy.sh

Una vez hecho esto, intente iniciar sesión en el servidor:

ssh [email protected] -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 comentar a continuación o enviarme un tweet a @imdebdut.

Si desea que escriba algún otro artículo, no dude en hacérmelo saber.


Linux
  1. ¿Cómo SSH en un directorio específico?

  2. ¿Cómo iniciar sesión en el contenedor Lxc?

  3. Cómo ejecutar MySQL en un contenedor Docker

  4. Cómo usar SSH en un contenedor Docker

  5. Cómo instalar Vim en un contenedor Docker

Cómo usar SSH en un contenedor Docker y ejecutar comandos

Cómo ejecutar PHPMyAdmin en un contenedor Docker

Cómo ejecutar Grafana en un contenedor Docker

Cómo usar SSH en contenedores Docker [paso a paso]

Cómo configurar un contenedor Apache Docker

Cómo gestionar contenedores Docker