So führen Sie SSH in einen Docker-Container ein

0
572

SSH ist einer der am häufigsten verwendeten Befehle in einem Systemadministrator’ s Toolbox, wird aber nicht häufig zusammen mit Docker verwendet. Hier erfahren Sie, wie Sie SSH in einen laufenden Container übertragen können und warum Sie es sich zweimal überlegen sollten.

Sollten Sie verwenden SSH mit Docker-Containern?

SSH-Eingabe in einen Docker-Container ist im Allgemeinen eine schlechte Praxis, die Sie vermeiden sollten. Es ist fast immer besser, den docker exec-Befehl zu verwenden, um eine Shell in einen Container zu bekommen.

Docker-Neulinge können versucht sein, SSH zu verwenden, um Dateien in einem Container zu aktualisieren. Container sind jedoch als wegwerfbar gedacht, daher sollten sie nach der Erstellung als unveränderlich behandelt werden, mit Ausnahme von persistenten Daten, die in Volumes gespeichert sind. Erstellen Sie ein neues Image und starten Sie Ihren Container neu, wenn Sie den Quellcode bearbeiten.

Neben dem mehrstufigen Konfigurationsprozess fügt die Installation von SSH in einem Docker-Image mehrere Abhängigkeitspakete hinzu und enthüllt einen weiteren potenziellen Angriffsvektor. Auf einem System mit mehreren aktiven Containern führen Sie mehrere unabhängige SSH-Prozesse aus und müssen sich den richtigen Port für jeden Container merken.

Anstatt SSH zu einzelnen Containern hinzuzufügen, installieren Sie es einmal auf dem physischen Host, auf dem Docker ausgeführt wird. Verwenden Sie SSH, um eine Verbindung zu Ihrem Host herzustellen, und führen Sie dann docker exec -it my-container bash aus, um auf einzelne Container zuzugreifen.

Werbung

Obwohl docker exec der bevorzugte Ansatz ist, gibt es immer noch Szenarien, in denen SSH verwendet werden könnte sinnvoll. Sie könnten es als Notlösung zur Integration in Legacy-Bereitstellungssysteme einführen. Es kann auch von einigen IDEs und Build-Tools verwendet werden, um während der Entwicklung Live-Reload-Funktionen bereitzustellen.

Installation des SSH-Servers in einem Docker-Container

Die gängigsten Docker-Basisimages wurden absichtlich optimiert. Sie müssen den OpenSSH-Server selbst hinzufügen, selbst bei Images, die von gängigen Betriebssystemdistributionen abgeleitet sind.

Hier ist ein Beispiel für ein Dockerfile für ein Debian-basiertes Image:

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

Die SSH-Konfiguration wird geändert, sodass Sie sich als Root anmelden können, den Standardbenutzer in einem Docker-Container. Für mehr Sicherheit richten Sie stattdessen ein dediziertes Benutzerkonto ein:

RUN useradd -m -s /bin/bash sshuser

Dadurch wird ein neuer Benutzer namens sshuser mit einem Home-Verzeichnis (-m) erstellt. Der Schalter -s setzt die Standard-Login-Shell des Benutzers auf Bash.

Die Verwendung von ENTRYPOINT stellt sicher, dass der SSH-Dienst immer dann startet, wenn der Container dies tut. Die Ausführung wird dann als Vordergrundprozess des Containers an Bash übergeben. Sie können dies durch die Binärdatei Ihrer Anwendung ersetzen.

Authentifizierung konfigurieren

Als Nächstes müssen Sie ein Authentifizierungssystem einrichten. Sie könnten Ihrem sshuser-Konto ein Passwort zuweisen und sich damit anmelden:

RUN echo “sshuser:Changeme” | changepasswd-Werbung

Eine sicherere Methode besteht darin, die SSH-Schlüsselauthentifizierung einzurichten. Sie müssen auf Ihrem Clientcomputer ein Schlüsselpaar erstellen und dann den öffentlichen Teil in den Container kopieren. Auf diese Weise kann der SSH-Daemon die Identität Ihres Computers überprüfen, wenn Sie eine Verbindung herstellen.

Ändern Sie Ihr Dockerfile, um den .ssh-Konfigurationsordner für Ihren Benutzer einzurichten. Kopieren Sie einen öffentlichen Schlüssel aus Ihrem Arbeitsverzeichnis, entweder mit einem docker cp-Befehl oder einer COPY-Anweisung in der Dockerfile. Im letzteren Fall wird der Schlüssel in das Bild eingebrannt und ist für jeden mit Zugriff sichtbar.

COPY id_rsa.pub /home/sshuser/.ssh/authorized_keys AUSFÜHREN chown -R sshuser:sshuser /home/sshuser/.ssh AUSFÜHREN chmod 600 /home/sshuser/.ssh/authorized_keys

Diese Befehlsfolge erzeugt SSH&#8217 ;s Datei “authorized_keys” mit dem öffentlichen Schlüssel id_rsa.pub in Ihrem Arbeitsverzeichnis. Die Dateisystemberechtigungen werden an die Anforderungen von SSH angepasst.

Verbindung zum Container herstellen

Jetzt sind Sie bereit um sich mit Ihrem Container zu verbinden. Führen Sie den Container mit Port 22 aus, der an den Host gebunden ist:

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

Wenn Sie ssh sshuser@example.com ausführen, erhalten Sie eine Shell in Ihrem Container.

Sie können das Binden des Ports überspringen, wenn Sie eine Verbindung von der Maschine herstellen, die den Docker-Container hostet. Verwenden Sie docker inspect, um die IP-Adresse Ihres Containers abzurufen, und übergeben Sie sie dann an den SSH-Verbindungsbefehl.

docker inspect <id-or-name> | grep 'IPAdresse' | head -n 1 Werbung

Verwenden Sie den SSH-Client auf Ihrem Computer, um eine Verbindung zum Container herzustellen:

ssh root@172.17.0.1 # ODER ssh sshuser@172.17.0.1

Sie müssen einen alternativen Port verwenden, wenn Sie einen separaten SSH-Server auf dem Host betreiben oder mehrere Container haben, die Port 22 benötigen. So initiieren Sie eine Verbindung, wenn SSH ist an Port 2220 gebunden:

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

Container-Shortcuts mit SSH Config einrichten

Sie können Ihre SSH-Konfigurationsdatei bearbeiten, um Verbindungen zu einzelnen Containern zu vereinfachen. Bearbeiten Sie ~/.ssh/config, um abgekürzte Hosts mit vorkonfigurierten Ports zu definieren:

Host my-container HostName 172.17.0.1 Port 2220 Benutzer sshuser

Jetzt können Sie ssh my-container ausführen, um direkt in Ihren Container zu fallen. Dies macht es einfacher, mehrere Verbindungen zu jonglieren, ohne sich Container-IPs und -Ports zu merken.

Verwenden Sie stattdessen Dockssh, um die Containerverwaltung zu vereinfachen

Das Dockssh-Projekt geht noch einen Schritt weiter, indem es einen weiteren Daemon bereitstellt, mit dem Sie ssh my-container@example.com ohne manuelle SSH-Konfiguration ausführen können. Sie müssen keinen SSH-Server in Ihren Containern installieren. Dockssh stellt automatisch SSH-Verbindungen her und führt stattdessen den richtigen docker exec-Befehl aus.

Sie müssen zuerst Redis installieren, um die Konfigurationsdaten von Dockssh zu speichern:

sudo apt install redis Werbung

Definieren Sie als Nächstes die Container, die Sie freigeben möchten, indem Sie einen Redis-Eintrag mit dem Namen des Containers und einem Passwort für SSH-Verbindungen hinzufügen:

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

Dann laden Sie Dockssh herunter:

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 # DockSSH-Server starten dockssh

Jetzt können Sie sich mit Ihrem Container verbinden:

ssh my -container@example.com -p 22022

Dockssh lauscht standardmäßig auf Port 22022. Die Firewall wird geöffnet, um eingehende Verbindungen über den Port zuzulassen.

Wenn Sie eine Verbindung herstellen, werden Sie nach dem Passwort des Containers gefragt. Dies wurde hier in unserem Redis-Record oben als Container-Passwort festgelegt.

Die Verwendung von Dockssh macht es einfach, SSH in eine große Anzahl von Docker-Containern zu übertragen. Dieser Ansatz ist ideal, wenn Sie regelmäßig von einem Remote-Host aus eine Verbindung zu Ihren Containern herstellen, da er die zweistufigen Schritte “SSH, dann Docker-Exec” Sequenz zu einem einzigen einprägsamen Befehl.

Registrieren Sie Dockssh als Systemdienst für die langfristige Nutzung:

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

Aktivieren Sie den Dienst mit systemctl:

sudo systemctl enable dockssh.service sudo systemctl start dockssh

Dockssh startet jetzt automatisch, wenn Ihr System bootet.

< h2 id="summary">Zusammenfassung

Die Kombination von SSH mit Docker-Containern wird allgemein als Anti-Pattern angesehen, wird jedoch in Entwicklungs-, Test- und Legacy-Umgebungen verwendet. Wenn es keine Alternative gibt, können Sie den SSH-Server zu Ihrem Container hinzufügen, einen öffentlichen Schlüssel kopieren und über die IP des Containers oder eine Host-Port-Bindung eine Verbindung herstellen.

Systemadministratoren, die eine große Anzahl von Docker-Containern remote verwalten möchten, können Sie Dockssh ausprobieren. Sie können bekannte SSH-Befehle über eine nahtlose Zuordnung hinter den Kulissen zu Docker Exec ausführen, sodass Sie das Beste aus beiden Welten mit unveränderten Bildern erhalten.