GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

Wie verwenden Sie SSH, um in einen Docker-Container einzutreten? Der herkömmliche Ansatz besteht aus zwei Schritten:

Schritt 1 :SSH in Ihren Remote-Linux-Server (wenn Sie den Container in einem Remote-System ausführen).‌

ssh [email protected]_ip_address

Schritt 2 :Und dann betreten Sie die Shell Ihres laufenden Docker-Containers im interaktiven Modus wie folgt:

docker exec -it container_ID_or_name /bin/bash

Damit können Sie den Linux-Befehl ausführen oder den im Container ausgeführten Dienst warten.

An der obigen Methode ist nichts auszusetzen. Dies ist die traditionelle und empfohlene Art, Container mühelos zu betreten.

Mit einigem Aufwand können Sie sich jedoch direkt per SSH in einen laufenden Container einloggen, ohne sich zuerst beim Hostsystem anzumelden.

SSH in einen Docker-Container:Aber warum?

Das ist irgendwie seltsam, nicht wahr? Anmeldung bei einem Container über SSH. Obwohl es nicht traditionell klingt, könnte es dennoch für Sie nützlich sein, je nach Ihren Anwendungsfällen.

Hier sind einige Dinge, die Sie mit der Fähigkeit erreichen können, per SSH in einen Container zu gelangen:

  1. Sie können eine Fälschung einrichten Host für jeden potenziellen Angreifer. Indem Sie einen nicht standardmäßigen Port für den SSH-Daemon Ihres Hosts verwenden und den Angreifern eine SSH-Verbindung an Port 22 bereitstellen.
  2. Eine völlig separate Autorisierungsebene, d. h. Passwort-Logins oder unterschiedliche SSH-Schlüssel, alles bis zu Ihnen und getrennt von dem, was Ihr Host gerade verwendet.
  3. Ausführen eines beliebigen automatisierten Remote-Prozesses, ohne die gleichen SSH-Schlüssel zu verwenden, die verwendet werden, um sich von den Mitarbeitern Ihres Teams anzumelden.

Bevor ich Ihnen zeige, wie Sie all die oben genannten Dinge tun, werde ich Sie durch die Idee führen, wie dies tatsächlich funktioniert.

Die Verwendung der SSH-Anmeldung für einen vorhandenen Container wird nicht empfohlen. Das macht den ganzen Punkt der Host-Isolation zunichte.

Einrichten des SSH-Zugriffs für Docker-Container [Fortgeschrittener bis Experte]

Wenn Sie nicht an der Funktionsweise interessiert sind, können Sie diesen Abschnitt getrost ignorieren. Ich werde es Ihnen mit einem Dummy-Container zeigen. Sie können den Schritten zum Üben folgen.

Führen Sie einen Container aus

Zunächst müssen Sie einen Docker-Container starten. Ich verwende das extrem kleine alpine:latest Bild vorerst. Starten Sie den Container mit diesem Befehl:

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

Einige auffällige Punkte in Bezug auf die Befehlszeilenoptionen sind wie folgt

  • Mit dem --rm Option, müssen Sie den Container danach nicht explizit entfernen.
  • Das -it Optionen sind da, damit Sie eine funktionierende, interaktive Hülle des Containers haben können.
  • Schließlich binden Sie den Port 22 des Containers an die Portnummer 7655 des Hosts (oder jede andere Portnummer, die nicht bereits vom SSH-Daemon auf Ihrem Hostsystem verwendet wird). Denken Sie daran, welchen Port Sie verwenden.

Richten Sie den SSH-Daemon im Container ein

Jetzt müssen Sie den SSH-Server im Container installieren. In Alpine Linux können Sie diese Befehle verwenden:‌

apk update; apk add openssh-server

Als Nächstes müssen Sie schnell einen Konfigurationsparameter ändern, um Root-Anmeldungen zuzulassen. Sie können dies tun, indem Sie die Datei /etc/ssh/sshd_config manuell bearbeiten oder diesen Befehl verwenden:

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

Generieren Sie die Hostschlüssel mit:

ssh-keygen -A

Starten Sie abschließend den ssh-Server, führen Sie /usr/sbin/sshd & aus . Überprüfen Sie, ob es mit ps aux läuft .

Legen Sie ein Passwort für das Root-Konto Ihres Containers fest

Standardmäßig hat das Root-Konto Ihres Containers kein Passwort. Wenn Sie den SSH-Zugriff darauf öffnen, müssen Sie das Passwort für das Root-Konto festlegen.

Sie können den Befehl passwd ohne Option verwenden und den Anweisungen auf dem Bildschirm folgen:

passwd

Melden Sie sich per SSH beim Container an

Versuchen Sie sich jetzt von einem anderen Host aus beim Container anzumelden.

ssh [email protected]_address_of_host_server -p port_number

Sie brauchen das -p nicht Option, wenn Sie zuvor an Port 22 gebunden waren. Verwenden Sie für IP die IP-Adresse des Hostservers (nicht die des Containers).

Wenn Sie den Befehl ausführen, sollten Sie eine Ausgabe ähnlich der folgenden sehen:

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

Wie funktioniert das?

Dies kann visuell besser verstanden werden. Sehen Sie sich das folgende Diagramm an:‌

Stellen Sie sich die Container als eine virtuelle Maschine vor, deren Port 22 mit dem Port 7655 des Hosts (oder dem von Ihnen gewählten) zusammengeklebt ist. Dadurch können Sie zwei verschiedene SSH-Prozesse auf derselben Maschine ausführen, die an unterschiedliche Ports gebunden sind.

Angenommen, Sie verwenden einen anderen Port für SSH auf dem Hostsystem und kleben den Port 22 mit dem Port des Containers zusammen. Wenn nun jemand versucht, sich über den SSH-Standardport 22 mit dem Hostserver zu verbinden, befindet er sich im Root-Dateisystem des Containers.

Einrichten von SSH für Container mit Docker Compose [Experten]

Es wäre nicht fair, Sie an dieser Stelle allein zu lassen, ohne eine zuverlässige Option für einen SSH-Server-Container anzubieten.

Wenn Sie einen anderen, isolierten SSH-Server mit einem separaten Root-Dateisystem auf Ihrem Remote-System ausführen möchten, können Sie dies tun, aber nicht, indem Sie der vorherigen Anleitung folgen, dh sshd auf einer laufenden Basis installieren und konfigurieren Container.

Einfach weil es nicht einfach reproduzierbar ist, jede Änderung, die Sie am laufenden Container vornehmen, nicht persistent ist, ein Container-Neustart und alles ist weg.

Hier zeige ich Ihnen also eine viel einfachere, leicht reproduzierbare und konfigurierbare Möglichkeit, einen SSH-Server-Container auf Ihrem Remote-Host bereitzustellen.

Voraussetzungen

Docker Compose muss natürlich installiert sein. Grundkenntnisse in Docker Compose sind hier ein Muss.

Da Sie über SSH-Schlüssel auf den Server zugreifen, müssen Sie den öffentlichen SSH-Schlüssel Ihres lokalen Systems zum Verzeichnis Ihres Host-Linux-Servers hinzufügen, in dem sich die Docker-Compose-Datei befindet, und den Namen „id_rsa.pub“ beibehalten, um sicherzugehen.

Bereiten Sie die Compose-Datei vor

Ich schlage vor, den linuxserver/openssh-server zu verwenden Bild. Dies ist ein sehr einfaches Bild mit ausreichend guten Konfigurationsoptionen durch Umgebungsvariablen.

Hier wird die gesamte Compose-Datei eingefügt. Kopieren Sie diese an einen Ort auf Ihrem Server und nennen Sie die Datei 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"

Eine ziemlich kleine Compose-Datei, nicht wahr? Lassen Sie mich verschiedene Teile dieser Compose-Datei erklären.

Volumen: Sie haben nur einen einzigen Bind-Mount, der den öffentlichen Schlüssel innerhalb des Containers als pubkey einbindet . Es ist auch schreibgeschützt.

Anschlüsse: Der sshd-Prozess innerhalb des Containers läuft auf Port 2222. Deshalb habe ich diesen Port an den Port 22 meines Hosts gebunden. Ändern Sie 22 nach Ihren Bedürfnissen, aber denken Sie daran, da Sie ihn später benötigen, um sich über SSH beim Container anzumelden.

Umgebungsvariablen:

  • USER_NAME :Der In-Container-Benutzer, Sie melden sich von Ihrem lokalen Computer aus an.
  • PUID &PGID:UID und GID von USER_NAME. Dies ist optional, der Container weist automatisch ein Paar Nicht-Root-IDs zu, wenn die Umgebungsvariablen nicht gesetzt sind.
  • TZ:Ihre aktuelle Zeitzone. Das können Sie mit cat /etc/timezone abrufen .
  • PUBLIC_KEY_FILE:Der Speicherort der öffentlichen Schlüsseldatei
  • SUDO_ACCESS &PASSWORD_ACCESS:Selbsterklärend.

Neustartrichtlinie: Ich habe die Neustartrichtlinie "immer" eingestellt, die den Container neu startet, selbst wenn der Daemon neu geladen wird.

Stellen Sie den Dienst bereit

Um es Ihnen leicht zu machen, habe ich ein Bash-Skript erstellt, das Ihnen einige Fragen stellt und basierend auf der Antwort den Dienst bereitstellt.

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

Ich habe das Bash-Skript als deploy.sh in demselben Verzeichnis gespeichert, in dem sich die docker-compose-Datei befand.

Wenn Sie nun dieses Skript ausführen, stellt es Ihnen einige Fragen und führt dann den Docker-Container aus:

bash deploy.sh

Versuchen Sie anschließend, sich beim Server anzumelden:

ssh [email protected] -p port 

Damit ist dieser Artikel über ssh mit Docker-Containern abgeschlossen. Wenn es Ihnen gefallen hat oder Sie etwas anderes zu erwähnen haben, können Sie es gerne unten kommentieren oder mir @imdebdut twittern.

Wenn Sie möchten, dass ich einen anderen Artikel schreibe, lassen Sie es mich wissen.


Linux
  1. Wie man in ein bestimmtes Verzeichnis ssh?

  2. Wie melde ich mich beim Lxc-Container an?

  3. Wie man ein Host-Verzeichnis in einen Docker-Container einbindet

  4. So weisen Sie einem Docker-Container eine statische IP zu

  5. So beenden Sie einen Docker-Container

Wie man SSH in einen Docker-Container einfügt und Befehle ausführt

So führen Sie PHPMyAdmin in einem Docker-Container aus

So führen Sie Grafana in einem Docker-Container aus

So führen Sie SSH in Docker-Container ein [Schritt für Schritt]

So richten Sie einen Apache Docker-Container ein

So verwalten Sie Docker-Container