Docker: Fernzugriff auf Port 2376 konfigurieren

In diesem Tutorial erfahren Sie, wie Sie den Fernzugriff auf den Docker-Daemon über Port 2376 konfigurieren, wodurch Sie Ihre Container remote verwalten oder sogar überwachen können.

Es gibt zwei Anschlüsse für den Fernzugriff:

  • 2375, das weder im Hinblick auf den Datenfluss noch auf den Zugriff sicher ist.
  • 2376, das mit TLS gesichert ist und ein Zertifikatsset zur Sicherung des Zugriffs verwendet

In beiden Fällen erfolgt keine Authentifizierung mittels Benutzername und Passwort; nur die Verwendung von Port 2376 ermöglicht einen sicheren Zugriff mithilfe eines Zertifikatssatzes.

Da zahlreiche Operationen durchzuführen sind, habe ich zwei Skripte geschrieben, die die Durchführung der Aktionen erleichtern.

Im ersten Schritt müssen die Zertifikate für die TLS-Verbindung zwischen dem Docker-Server und dem Client, mit dem Sie eine Verbindung herstellen möchten, generiert werden.

Erstelle eine Datei in einem Ordner openssl.cnf Der Inhalt lautet wie folgt:

[ req ]
distinguished_name  = req_distinguished_name
req_extensions = v3_req

[ req_distinguished_name ]
# Information to be displayed for the user
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = docker-server

[ v3_req ]
# Extensions to add to a certificate request
subjectAltName = @alt_names

[ alt_names ]
IP.1 = 192.168.X.X # Adresse IP de l'hôte
DNS.1 = docker-server.local  # Nom d'hôte (par exemple, l'hôte Docker)

Passen Sie die Zeilen 15 und 16 an Ihren Docker-Server an.

Nun befinden Sie sich im selben Ordner, in dem Sie die Datei erstellt haben. openssl.cnf Erstellen Sie die Datei generate-certificate.sh.

#!/bin/bash

# Définir le répertoire des certificats
CERT_DIR="/etc/docker/certs"
CA_DIR="$CERT_DIR/ca"
SERVER_DIR="$CERT_DIR/server"
CLIENT_DIR="$CERT_DIR/client"

# Créer les répertoires s'ils n'existent pas
mkdir -p $CA_DIR $SERVER_DIR $CLIENT_DIR

# Vérifier si les certificats existent déjà
if [ ! -f "$CA_DIR/ca.pem" ]; then
    echo "Génération des certificats TLS..."

    # Générer la clé privée de l'autorité de certification (CA)
    openssl genrsa -aes256 -out $CA_DIR/ca-key.pem -passout pass:password 4096

    # Générer le certificat de l'autorité de certification (CA)
    openssl req -new -x509 -days 365 -key $CA_DIR/ca-key.pem -sha256 -passin pass:password \
        -subj "/CN=Docker-CA" -out $CA_DIR/ca.pem

    # Générer la clé privée du serveur
    openssl genrsa -out $SERVER_DIR/server-key.pem 4096

    # Créer une demande de signature de certificat (CSR) pour le serveur en utilisant le fichier de config avec SAN
    openssl req -new -key $SERVER_DIR/server-key.pem -out $SERVER_DIR/server.csr -config openssl.cnf

    # Signer le certificat du serveur avec l'autorité de certification
    openssl x509 -req -days 365 -sha256 -in $SERVER_DIR/server.csr -CA $CA_DIR/ca.pem \
        -CAkey $CA_DIR/ca-key.pem -passin pass:password -CAcreateserial -out $SERVER_DIR/cert.pem -extensions v3_req -extfile openssl.cnf

    # Générer la clé privée du client
    openssl genrsa -out $CLIENT_DIR/client-key.pem 4096

    # Créer une demande de signature de certificat (CSR) pour le client
    openssl req -new -key $CLIENT_DIR/client-key.pem -out $CLIENT_DIR/client.csr \
        -subj "/CN=docker-client"

    # Signer le certificat du client avec l'autorité de certification
    openssl x509 -req -days 365 -sha256 -in $CLIENT_DIR/client.csr -CA $CA_DIR/ca.pem \
        -CAkey $CA_DIR/ca-key.pem -passin pass:password -CAcreateserial -out $CLIENT_DIR/cert.pem

    # Pour uptime kuma
    cp $CLIENT_DIR/client-key.pem $CLIENT_DIR/key.pem
    cp $CA_DIR/ca.pem $CLIENT_DIR/ca.pem

    echo "Certificats générés avec succès."
else
    echo "Les certificats existent déjà. Aucune génération nécessaire."
fi

Führen Sie das Skript aus: sudo bash generate-certificate.sh

Die Zertifikate wurden nun generiert, wir fahren jetzt mit der Konfiguration des Docker-Daemons fort.

Dazu müssen Sie die Datei bearbeiten oder neu erstellen. daemon.json Was sollte in der Datei stehen? /etc/docker/.

sudo nano /etc/docker/daemon.json

Fügen Sie der Datei folgenden Inhalt hinzu:

{
    "hosts": [
      "tcp://0.0.0.0:2376",
      "unix:///var/run/docker.sock"
    ],
    "tls": true,
    "tlscacert": "/etc/docker/certs/ca/ca.pem",
    "tlscert": "/etc/docker/certs/server/cert.pem",
    "tlskey": "/etc/docker/certs/server/server-key.pem",
    "tlsverify": true
  }

Hier konfigurieren wir Docker so, dass es auf Port 2376 lauscht, und geben den Speicherort der Zertifikate an.

Abschließend müssen wir die Startparameter des Docker-Dienstes anpassen; dazu verwenden wir ein override.conf Um die Konfiguration zu ändern, finden Sie hier das Skript:

#!/bin/bash

# Variables
DOCKER_SERVICE_OVERRIDE_DIR="/etc/systemd/system/docker.service.d"
OVERRIDE_CONF_FILE="$DOCKER_SERVICE_OVERRIDE_DIR/override.conf"

# Création du répertoire d'override si nécessaire
if [ ! -d "$DOCKER_SERVICE_OVERRIDE_DIR" ]; then
  echo "Création du répertoire d'override systemd pour Docker..."
  sudo mkdir -p "$DOCKER_SERVICE_OVERRIDE_DIR"
fi

# Création du fichier override.conf
echo "Création du fichier d'override Docker pour exposer Docker sur le port 2376 avec TLS..."
sudo tee "$OVERRIDE_CONF_FILE" > /dev/null EOL
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
EOL

# Recharger la configuration systemd
echo "Rechargement de la configuration systemd..."
sudo systemctl daemon-reload

# Redémarrage du service Docker
echo "Redémarrage du service Docker..."
sudo systemctl restart docker

# Vérification du statut du service Docker
echo "Vérification du statut du service Docker..."
sudo systemctl status docker

# Fin
echo "La configuration de Docker pour utiliser TLS sur le port 2376 a été appliquée avec succès."

Führen Sie das Skript aus, das die Datei erstellt. override.conf Für den Docker-Dienst müssen die Daemons neu geladen und Docker neu gestartet werden.

sudo bash docker-tls-override.sh

Die Docker-Konfiguration ist abgeschlossen.

Je nachdem, welche Clients Sie verwenden werden, müssen Sie die Clientzertifikate abrufen von /etc/docker/certs/client.

Die Dateien finden Sie hier: https://git.rdr-it.com/root/docker-tls-config/

Romain Drouche
Systemarchitekt | MCSE: Kerninfrastruktur
IT-Infrastrukturexperte mit über 15 Jahren Berufserfahrung. Aktuell tätig als Projektmanager für Systeme und Netzwerke sowie als Experte für Informationssystemsicherheit, nutze ich mein Fachwissen, um die Zuverlässigkeit und Sicherheit technologischer Umgebungen zu gewährleisten.

Schreibe einen Kommentar