Hur man SSH in i en Docker -behållare

0
172

SSH är ett av de mest använda kommandona i en sysadmin ’ s verktygslåda men det är inte vanligt vid sidan av Docker. Så här kan du SSH in i en behållare som körs och varför du bör tänka två gånger innan du gör det.

Ska du använda SSH med Docker-behållare?

SSH-ingång i en Docker-behållare är i allmänhet en dålig metod som du bör undvika. Det är nästan alltid bättre att använda kommandot docker exec för att få ett skal inuti en behållare.

Docker -nykomlingar kan frestas att använda SSH för att uppdatera filer i en behållare. Behållare är dock avsedda att vara engångsbruk, så de bör behandlas som oföränderliga efter skapandet, förutom ihållande data som lagras inuti volymer. Skapa en ny bild och starta om behållaren när du redigerar källkoden.

Bortsett från konfigurationsprocessen i flera steg, lägger flera SSH-installationer till ett beroendeprogram och en annan potentiell attackvektor exponeras. På ett system med flera aktiva behållare kör du flera oberoende SSH -processer och måste komma ihåg rätt port för varje behållare.

Istället för att lägga till SSH till enskilda behållare, installera det en gång på den fysiska värden som kör Docker. Använd SSH för att ansluta till din värd, kör sedan docker exec -it my -container bash för att komma åt enskilda behållare.

Annonsering

Medan docker exec är det föredragna tillvägagångssättet finns det fortfarande scenarier där SSH kan vara användbar. Du kan introducera det som en stoppmått för att integrera med äldre distributionssystem. Det kan också användas av vissa IDE: er och bygga verktyg för att tillhandahålla live-omladdningsfunktioner under utvecklingen.

Installera SSH -servern i en Docker -behållare

De mest populära Docker -basbilderna hålls avsiktligt. Du måste lägga till OpenSSH-servern själv, även på bilder som härrör från populära operativsystemdistributioner.

Här är ett exempel på Dockerfile för en Debian-baserad bild:

RUN apt-get uppdatering & amp; & amp; apt-get install -y openssh-server RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/'/etc/ssh/sshd_config ENTRYPOINT service ssh start & amp; & amp; bash

SSH -konfigurationen har ändrats så att du kan logga in som root, standardanvändaren i en Docker -behållare. För ökad säkerhet, ställ in ett dedikerat användarkonto istället:

RUN useradd -m -s/bin/bash sshuser

Detta skapar en ny användare som heter sshuser med en hemkatalog (-m). Omkopplaren -s ställer in användarens standardinloggningsskal till Bash.

Användningen av ENTRYPOINT säkerställer att SSH -tjänsten alltid startar när behållaren gör det. Utförandet överlämnas sedan till Bash som behållarens förgrundsprocess. Du kan ersätta detta med programmets binära.

Konfigurera autentisering

Därefter måste du konfigurera ett autentiseringssystem. Du kan tilldela ett lösenord till ditt sshuser -konto och logga in med det:

RUN echo “sshuser: Changeme” | changepasswd Annonsering

Ett säkrare sätt är att konfigurera SSH -nyckelautentisering. Du måste skapa ett nyckelpar på din klientmaskin och sedan kopiera den offentliga delen till behållaren. På så sätt kan SSH -demonen verifiera maskinens identitet när du ansluter.

Ändra din Dockerfile för att konfigurera .ssh -konfigurationsmappen för din användare. Kopiera in en offentlig nyckel från din arbetskatalog, antingen med ett docker cp -kommando eller en COPY -instruktion i Dockerfilen. I det senare fallet skulle nyckeln bakas in i bilden, synlig för alla med åtkomst.

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

Denna kommandosekvens skapar SSH &#8217 ; s autoriserade_nycklar med den offentliga nyckeln id_rsa.pub i din arbetskatalog. Filsystemets behörigheter justeras för att matcha SSH: s krav.

Ansluter till behållaren

Nu är du redo för att ansluta till din behållare. Kör behållaren med port 22 bunden till värden:

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

Genom att köra ssh sshuser@example.com får du ett skal inuti behållaren.

Du kan hoppa över att binda porten om du ansluter från maskinen som är värd för Docker -behållaren. Använd docker inspect för att få behållarens IP-adress och skicka den sedan till SSH-anslutningskommandot.

docker inspektera & lt; id-or-name & gt; | grep 'IPAddress' | head -n 1 Annons

Använd SSH -klienten på din dator för att ansluta till behållaren:

ssh root@172.17.0.1 # ELLER ssh sshuser@172.17.0.1

Du kommer att behöva använda en alternativ port om du kör en separat SSH -server på värden eller om du har flera behållare som behöver port 22. Så här startar du en anslutning när SSH är bunden till port 2220:

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

Konfigurera behållargenvägar med SSH -konfiguration

Du kan manipulera din SSH -konfigurationsfil för att förenkla anslutningar till enskilda behållare. Redigera ~/.ssh/config för att definiera stenografi-värdar med förkonfigurerade portar:

Host my-container HostName 172.17.0.1 Port 2220 User sshuser

Nu kan du köra ssh my-container för att släppa direkt i behållaren. Detta gör det lättare att jonglera med flera anslutningar utan att komma ihåg behållarens IP-adresser och portar.

Använd Dockssh för att förenkla behållarhantering istället

Dockssh-projektet tar detta ett steg längre genom att tillhandahålla ytterligare en demon som låter dig köra ssh my-container@example.com, utan någon manuell SSH-konfiguration. Du behöver inte installera en SSH -server i dina behållare; Dockssh tar automatiskt fram SSH -anslutningar och kör rätt docker exec -kommando istället.

Du måste först installera Redis för att lagra Docksshs konfigurationsdata:

sudo apt install redis Advertisement

Definiera sedan behållarna du vill exponera genom att lägga till en Redis -post med behållarens namn och ett lösenord för SSH -anslutningar:

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

Ladda sedan ner 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 kan du ansluta till din behållare:

ssh my -container@example.com -p 22022

Dockssh lyssnar som standard på port 22022. Brandväggen öppnas för att tillåta inkommande anslutningar med porten.

Du kommer att bli ombedd att ange behållarens lösenord när du ansluter. Detta angavs som container-lösenord-här i vår Redis-post ovan.

Att använda Dockssh gör det enkelt att SSH till ett stort antal Docker-behållare. Detta tillvägagångssätt är perfekt när du regelbundet ansluter till dina behållare från en fjärrvärd eftersom det effektiviserar tvåstegs “ SSH och sedan docker exec ” sekvens till ett enda minnesvärt kommando.

Registrera Dockssh som en systemtjänst för långvarig användning:

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 [ Installera] WantedBy = multi-user.target

Aktivera tjänsten med systemctl:

sudo systemctl aktivera dockssh.service sudo systemctl start dockssh

Dockssh startar nu automatiskt när systemet startar.

< h2 id = "summary"> Sammanfattning

Att kombinera SSH med Docker-behållare anses i stort sett vara ett antimönster men har fortfarande sin användning i utvecklings-, test- och äldre miljöer. När det inte finns något alternativ kan du lägga till SSH -servern i din behållare, kopiera i en offentlig nyckel och ansluta via behållarens IP eller en värdportbindning.

Systemadministratörer som vill fjärrhantera ett stort antal Docker -behållare kan prova Dockssh. Det låter dig köra välbekanta ssh-kommandon via en sömlös bakom kulisserna mappning till docker exec, vilket ger dig det bästa av två världar med omodifierade bilder.