GNU/Linux >> Linux Esercitazione >  >> Linux

Come SSH in un Docker Container

Come si usa SSH per entrare in un container Docker? L'approccio tradizionale si compone di due passaggi:

Passaggio 1 :SSH nel tuo server Linux remoto (se stai eseguendo il container in un sistema remoto).‌

ssh [email protected]_ip_address

Passaggio 2 :E poi accedi alla shell del tuo contenitore Docker in esecuzione in modalità interattiva in questo modo:

docker exec -it container_ID_or_name /bin/bash

Con ciò, puoi eseguire il comando Linux o eseguire un po' di manutenzione del servizio in esecuzione all'interno del contenitore.

Non c'è niente di sbagliato nel metodo sopra. Questo è il modo tradizionale e consigliato per inserire facilmente i contenitori.

Tuttavia, con alcuni sforzi, puoi effettivamente inviare SSH direttamente in un contenitore in esecuzione, senza prima accedere al sistema host.

SSH in un container Docker:ma perché?

Questo è un po' strano, vero? Accesso a un container, tramite SSH. Anche se suona non tradizionale, potrebbe ti sarà comunque utile, in base ai tuoi casi d'uso.

Ecco alcune cose che puoi ottenere con la capacità di SSH in un container:

  1. Puoi impostare un falso host per qualsiasi potenziale aggressore. Usando una porta non standard per il demone SSH del tuo host e servendo una connessione SSH sulla porta 22 per gli aggressori.
  2. Un livello di autorizzazione totalmente separato, ovvero accessi con password o chiavi ssh diverse, tutto a tua discrezione e separato da qualunque cosa il tuo host stia attualmente utilizzando.
  3. Esecuzione di qualsiasi processo remoto automatizzato, senza utilizzare le stesse chiavi ssh utilizzate per accedere dalle persone del tuo team.

Prima di mostrarti come fare tutte le cose di cui sopra, ti guiderò attraverso l'idea di come funziona effettivamente.

L'utilizzo di ssh login per il container esistente non è consigliato. Questo elimina l'intero punto di isolamento dell'host.

Configurazione dell'accesso SSH per i container Docker [da intermedio a esperto]

Se non sei interessato al funzionamento di questo, puoi tranquillamente ignorare questa sezione. Ve lo mostro con un contenitore fittizio. Puoi seguire i passaggi per esercitarti.

Esegui un container

Innanzitutto, devi avviare un contenitore Docker. Userò il piccolissimo alpine:latest immagine per ora. Avvia il contenitore con questo comando:

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

Alcuni punti notevoli relativi alle opzioni della riga di comando sono i seguenti

  • Con il --rm opzione, non è necessario rimuovere esplicitamente il contenitore in seguito.
  • Il -it le opzioni sono disponibili in modo da poter avere una shell interattiva e funzionante del contenitore.
  • Infine, stai associando la porta 22 del contenitore al numero di porta dell'host 7655 (o qualsiasi altro numero di porta che non sia già utilizzato dal demone SSH sul tuo sistema host). Tieni presente quale porta stai utilizzando.

Configura il demone SSH nel container

Ora devi installare il server ssh all'interno del contenitore. In Alpine Linux, puoi usare questi comandi:‌

apk update; apk add openssh-server

Successivamente, è necessario modificare rapidamente un parametro di configurazione per consentire gli accessi root. Puoi farlo modificando manualmente il file /etc/ssh/sshd_config o usando questo comando:

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

Genera le chiavi host con:

ssh-keygen -A

Infine, avvia il server ssh, esegui /usr/sbin/sshd & . Controlla se è in esecuzione con ps aux .

Imposta una password per l'account root del tuo container

Per impostazione predefinita, l'account root del tuo container non ha una password. Se stai aprendo l'accesso SSH, devi impostare la password per l'account root.

Puoi utilizzare il comando passwd senza alcuna opzione e seguire le istruzioni sullo schermo:

passwd

Accedi al container tramite SSH

Da un altro host, prova ad accedere al container ora.

ssh [email protected]_address_of_host_server -p port_number

Non hai bisogno del -p opzione se ti sei legato alla porta 22 in precedenza. Per l'IP utilizzare l'indirizzo IP del server host (non quello del contenitore).

Quando esegui il comando, dovresti vedere un output simile a questo:

[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:~#

Come funziona?

Questo può essere compreso meglio visivamente. Dai un'occhiata al diagramma seguente:‌

Pensa ai container come a una macchina virtuale la cui porta 22 è incollata insieme alla porta 7655 dell'host (oa quella che hai scelto). Ciò ti consente di avere due diversi processi ssh in esecuzione sulla stessa macchina associati a porte diverse.

Diciamo che usi un'altra porta per SSH sul sistema host e incolli la porta 22 con la porta del contenitore. Ora, se qualcuno tenta di connettersi al server host utilizzando la porta SSH predefinita 22, si troverà all'interno del file system radice del contenitore.

Configurazione di SSH per i container utilizzando Docker Compose [Esperti]

Non sarebbe giusto se ti lasciassi a questo punto senza fornire un'opzione affidabile per un contenitore di server SSH.

Se si desidera trarre vantaggio dall'avere un server ssh diverso e isolato con un file system radice separato in esecuzione sul sistema remoto, è possibile farlo, ma non seguendo la procedura precedente, ovvero l'installazione e la configurazione di sshd su una base in esecuzione contenitore.

Semplicemente perché non è facilmente riproducibile, ogni modifica apportata al contenitore in esecuzione, non è persistente, un contenitore si riavvia e tutto è sparito.

Quindi, qui ti offro un modo molto più semplice, facilmente riproducibile e configurabile per distribuire un container server SSH sul tuo host remoto.

Prerequisiti

È necessario che docker compose sia installato ovviamente. Qui è richiesta una conoscenza di base della composizione mobile.

Poiché accederai al server tramite chiavi SSH, devi aggiungere la chiave SSH pubblica del tuo sistema locale alla directory del server Linux host in cui si trova il file docker-compose e mantenere il nome "id_rsa.pub" solo per essere sicuro.

Prepara il file di composizione

Suggerisco di usare linuxserver/openssh-server Immagine. Questa è un'immagine molto leggera con opzioni di configurazione sufficientemente buone tramite variabili di ambiente.

Qui verrà incollato l'intero file di composizione. Copialo in una posizione sul tuo server e denomina il file 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 file di composizione piuttosto piccolo, vero? Lascia che ti spieghi diverse parti di questo file di composizione.

Volumi: Hai un solo montaggio bind, che monta la chiave pubblica all'interno del contenitore come pubkey . È anche di sola lettura.

Porte: Il processo sshd all'interno del contenitore viene eseguito sulla porta 2222. Ecco perché ho associato quella porta alla porta 22 del mio host. Cambia 22 in base alle tue esigenze, ma ricorda che ti servirà per accedere al contenitore tramite SSH in seguito.

Variabili d'ambiente:

  • USER_NAME :L'utente nel container, accederai come dal tuo computer locale.
  • PUID e PGID:UID e GID di USER_NAME. Questo è facoltativo, il contenitore assegnerà automaticamente una coppia di ID non root se le variabili di ambiente non sono impostate.
  • TZ:il tuo fuso orario attuale. Puoi ottenerlo da cat /etc/timezone .
  • PUBLIC_KEY_FILE:la posizione del file della chiave pubblica
  • SUDO_ACCESS &PASSWORD_ACCESS:Autoesplicativo.

Norme sul riavvio: Ho impostato la politica di riavvio "sempre" che riavvierà il contenitore anche se il demone viene ricaricato.

Distribuisci il servizio

Per semplificarti le cose, ho creato uno script Bash che ti farà un paio di domande e, in base alla risposta, distribuirà il servizio.

#! /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

Ho salvato lo script bash come deploy.sh nella stessa directory in cui si trovava il file docker-compose.

Ora, se esegui questo script, ti verranno poste alcune domande e quindi eseguirà il contenitore docker:

bash deploy.sh

Al termine, prova ad accedere al server:

ssh [email protected] -p port 

Questo conclude questo articolo su ssh con i contenitori docker. Se ti è piaciuto o hai qualcos'altro da menzionare, sentiti libero di commentare in basso o twittami @imdebdut.

Se vuoi che scriva qualche altro articolo non esitare a farmelo sapere.


Linux
  1. Come entrare in una directory specifica?

  2. Come eseguire MySQL in un contenitore Docker

  3. Come SSH in un contenitore Docker

  4. Come elencare i contenitori Docker

  5. Come uscire da un container Docker

Come eseguire SSH in un contenitore Docker ed eseguire comandi

Come eseguire PHPMyAdmin in un contenitore Docker

Come eseguire Grafana in un contenitore Docker

Come eseguire SSH nei contenitori Docker [Passo dopo passo]

Come configurare un container Docker Apache

Come gestire i container Docker