Hoe SSH in een Docker-container te plaatsen

0
221

SSH is een van de meest gebruikte commando's in een sysadmin’ s toolbox, maar het wordt niet vaak gezien naast Docker. Hier leest u hoe u SSH in een actieve container kunt plaatsen en waarom u twee keer moet nadenken voordat u dit doet.

Moet u gebruiken SSH met Docker-containers?

SSH-ing in een Docker-container is over het algemeen een slechte gewoonte die u moet vermijden. Het is bijna altijd beter om de opdracht docker exec te gebruiken om een ​​shell in een container te krijgen.

Docker-nieuwkomers kunnen in de verleiding komen om SSH te gebruiken om bestanden in een container bij te werken. Containers zijn echter bedoeld om wegwerpbaar te zijn, dus moeten ze na het maken als onveranderlijk worden behandeld, met uitzondering van persistente gegevens die in volumes zijn opgeslagen. Maak een nieuwe afbeelding en herstart uw container wanneer u de broncode bewerkt.

Afgezien van het configuratieproces dat uit meerdere stappen bestaat, voegt het installeren van SSH in een Docker-afbeelding verschillende afhankelijkheidspakketten toe en legt een andere potentiële aanvalsvector bloot. Op een systeem met meerdere actieve containers, zul je meerdere onafhankelijke SSH-processen uitvoeren en moet je de juiste poort voor elke container onthouden.

In plaats van SSH toe te voegen aan individuele containers, installeer het één keer op de fysieke host waarop Docker draait. Gebruik SSH om verbinding te maken met uw host en voer vervolgens docker exec -it my-container bash uit om toegang te krijgen tot afzonderlijke containers.

Advertentie

Hoewel docker exec de voorkeur heeft, zijn er nog steeds scenario's waarin SSH mogelijk is bruikbaar. Je zou het kunnen introduceren als een noodmaatregel om te integreren met legacy-implementatiesystemen. Het kan ook door sommige IDE's en buildtools worden gebruikt om live herlaadmogelijkheden te bieden tijdens de ontwikkeling.

De SSH-server installeren in een Docker-container

De meest populaire Docker-basisimages zijn opzettelijk gestroomlijnd gehouden. U moet de OpenSSH-server zelf toevoegen, zelfs op afbeeldingen die zijn afgeleid van populaire besturingssysteemdistributies.

Hier is een voorbeeld Dockerfile voor een op Debian gebaseerde afbeelding:

RUN apt-get update && apt-get install -y openssh-server RUN sed -i 's/PermitRootLogin verbieden-wachtwoord/PermitRootLogin yes/' /etc/ssh/sshd_config ENTRYPOINT-service ssh start && bash

De SSH-configuratie is aangepast zodat u kunt inloggen als root, de standaardgebruiker in een Docker-container. Stel voor meer veiligheid een speciaal gebruikersaccount in:

RUN useradd -m -s /bin/bash sshuser

Hiermee wordt een nieuwe gebruiker aangemaakt met de naam sshuser met een homedirectory (-m). De schakeloptie -s stelt de standaard login-shell van de gebruiker in op Bash.

Het gebruik van ENTRYPOINT zorgt ervoor dat de SSH-service altijd start wanneer de container dat doet. De uitvoering wordt vervolgens overgedragen aan Bash als het voorgrondproces van de container. Je zou dit kunnen vervangen door het binaire bestand van je applicatie.

Verificatie configureren

Vervolgens moet je een authenticatiesysteem instellen. U kunt een wachtwoord aan uw sshuser-account toewijzen en daarmee inloggen:

RUN echo “sshuser:Changeme” | changepasswd Advertentie

Een veiligere manier is om SSH-sleutelauthenticatie in te stellen. U moet een sleutelpaar maken op uw clientcomputer en vervolgens het openbare gedeelte naar de container kopiëren. Op deze manier kan de SSH-daemon de identiteit van uw machine verifiëren wanneer u verbinding maakt.

Wijzig uw Dockerfile om de .ssh-configuratiemap voor uw gebruiker in te stellen. Kopieer een openbare sleutel uit uw werkdirectory, ofwel met een docker cp-commando of een COPY-instructie in het Dockerfile. In het laatste geval zou de sleutel in de afbeelding worden ingebakken, zichtbaar voor iedereen met toegang.

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

Deze reeks opdrachten creëert SSH&#8217 ;s Authorized_keys bestand met de openbare sleutel id_rsa.pub in uw werkmap. De machtigingen van het bestandssysteem zijn aangepast aan de vereisten van SSH.

Verbinding maken met de container

Nu ben je klaar om verbinding te maken met uw container. Voer de container uit met poort 22 gebonden aan de host:

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

Als u ssh sshuser@example.com uitvoert, krijgt u een shell in uw container.

U kunt het binden van de poort overslaan als u verbinding maakt vanaf de machine die de Docker-container host. Gebruik docker inspect om het IP-adres van uw container op te halen en geef het vervolgens door aan het SSH-verbindingscommando.

docker inspect <id-or-name> | grep 'IP-adres' | head -n 1 Advertentie

Gebruik de SSH-client op uw computer om verbinding te maken met de container:

ssh root@172.17.0.1 # OR ssh sshuser@172.17.0.1

U moet een alternatieve poort gebruiken als u een aparte SSH-server op de host gebruikt of als u meerdere containers hebt die poort 22 nodig hebben. Hier leest u hoe u een verbinding start wanneer SSH is gebonden aan poort 2220:

docker run -p 22:2220 my-image:latest ssh root@172.17.0.1 -p 2220

Containersnelkoppelingen instellen met SSH-configuratie

U kunt uw SSH-configuratiebestand manipuleren om verbindingen met afzonderlijke containers te vereenvoudigen. Bewerk ~/.ssh/config om steno-hosts met vooraf geconfigureerde poorten te definiëren:

Host my-container HostName 172.17.0.1 Poort 2220 Gebruiker sshuser

Nu kun je ssh my-container uitvoeren om rechtstreeks in je container te laten vallen. Dit maakt het gemakkelijker om met meerdere verbindingen te jongleren zonder container-IP's en poorten te onthouden.

Gebruik Dockssh om in plaats daarvan containerbeheer te vereenvoudigen

Het Dockssh-project gaat nog een stap verder door een andere daemon te bieden waarmee je ssh my-container@example.com kunt draaien, zonder handmatige SSH-configuratie. U hoeft geen SSH-server in uw containers te installeren; Dockssh proxeert automatisch SSH-verbindingen en voert in plaats daarvan de juiste docker exec-opdracht uit.

U moet eerst Redis installeren om de configuratiegegevens van Dockssh op te slaan:

sudo apt install redis Advertisement

Definieer vervolgens de containers die u wilt vrijgeven door een Redis-record toe te voegen met de naam van de container en een wachtwoord voor SSH-verbindingen:

redis-cli set dockssh:my-container:pass “container-password-here”

Download 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

Nu kunt u verbinding maken met uw container:

ssh my -container@example.com -p 22022

Dockssh luistert standaard op poort 22022. De firewall wordt geopend om inkomende verbindingen via de poort toe te staan.

U wordt gevraagd om het wachtwoord van de container wanneer u verbinding maakt. Dit is ingesteld als container-wachtwoord-hier in ons Redis-record hierboven.

Het gebruik van Dockssh maakt het gemakkelijk om SSH naar een groot aantal Docker-containers te sturen. Deze aanpak is ideaal wanneer u regelmatig verbinding maakt met uw containers vanaf een externe host, omdat het de tweestaps “SSH then docker exec” stroomlijnt. sequentie in een enkele gedenkwaardige opdracht.

Registreer Dockssh als een systeemservice voor langdurig gebruik:

sudo nano /etc/systemd/system/dockssh.service [Unit] Description=Dockssh-service After=network.target [Service] type=simple Restart=altijd RestartSec=1 User=root ExecStart=/usr/local/bin/dockssh [ Install] WantedBy=multi-user.target

Schakel de service in met systemctl:

sudo systemctl enable dockssh.service sudo systemctl start dockssh

Dockssh start nu automatisch wanneer je systeem opstart.

< h2 id="summary">Samenvatting

Het combineren van SSH met Docker-containers wordt algemeen beschouwd als een anti-patroon, maar het wordt nog steeds gebruikt in ontwikkelings-, test- en legacy-omgevingen. Als er geen alternatief is, kunt u de SSH-server aan uw container toevoegen, een openbare sleutel kopiëren en verbinding maken via het IP-adres van de container of een hostpoortbinding.

Systeembeheerders die grote aantallen Docker-containers op afstand wilt beheren, kan Dockssh uitproberen. Hiermee kun je bekende ssh-commando's uitvoeren via een naadloze mapping achter de schermen naar docker exec, waardoor je het beste van twee werelden krijgt met ongewijzigde afbeeldingen.