Zertifikate für entfernte Server zentral erneuern – Eine sichere und effiziente Methode mit Docker und SSH

Die Verwaltung von SSL/TLS-Zertifikaten ist eine wichtige Aufgabe, insbesondere wenn mehrere Server beteiligt sind. Eine Herausforderung dabei ist es, Zertifikate zu erneuern, ohne den Betrieb von Webservern zu unterbrechen oder Ports wie 80 und 443 freizugeben. Mit Certbot und Docker lässt sich dieser Prozess effizient und sicher gestalten. In diesem Artikel stelle ich vor, wie man Zertifikate für entfernte Server zentral erneuert, ohne deren Webserver zu beeinträchtigen. Der Einsatz von Docker isoliert den Certbot-Prozess und stellt sicher, dass der SSH-Schlüssel auf dem Server verbleibt, der die Erneuerung steuert.
mein GitHub -Repository zu diesem Thema

Problemstellung

Normalerweise ist es notwendig, Ports wie 80 oder 443 während der Zertifikatsbeantragung oder -verlängerung für Let's Encrypt zu öffnen. Dies kann problematisch sein, da es die Verfügbarkeit von Webdiensten beeinträchtigt. In Szenarien, in denen mehrere Webserver betrieben werden, ist eine zentralisierte Lösung von Vorteil, die:

  1. Keine Öffnung der Ports 80 oder 443 auf den Zielservern erfordert.
  2. Die Webserver ungestört weiterlaufen lässt.
  3. Die Zertifikatsverwaltung zentral steuert.

Die Lösung: Zertifikatsverwaltung via Docker und SSH

Mithilfe von Docker und einem kleinen Bash-Skript lässt sich Certbot auf einem zentralen Server nutzen, um SSL/TLS-Zertifikate für entfernte Server zu erneuern. Der gesamte Prozess wird dabei in einer abgeschotteten Docker-Umgebung ausgeführt, was für zusätzliche Sicherheit sorgt.

Vorteile dieser Methode:

  • Keine Unterbrechung der Webserver: Die entfernten Webserver benötigen keinen Port 80 oder 443, da die Zertifikate über den zentralen Server erneuert und anschließend übertragen werden.
  • Zentrale Kontrolle: Alle Zertifikate werden von einem zentralen Server aus erneuert, wodurch die Verwaltung und Überwachung erleichtert wird.
  • Sicherheit: Der SSH-Schlüssel verbleibt auf dem zentralen Server und wird nicht auf die Zielserver übertragen. Durch den Einsatz von Docker wird der Certbot-Prozess isoliert, was das Risiko für Störungen minimiert.

Aufbau des Systems

Zunächst wird ein Docker-Container erstellt, der Certbot und die notwendigen Tools wie SSH und Cron enthält. Die Kommunikation mit den entfernten Servern erfolgt über SSH, wodurch keine direkte Interaktion mit den Webservern der Zielsysteme erforderlich ist.

Dockerfile

Hier das Dockerfile, das die Umgebung für die Zertifikaterneuerung bereitstellt:

FROM ubuntu:20.04

# Installiere benötigte Pakete
RUN apt update
RUN apt install -y cron openssh-client certbot sshfs

# Arbeitsverzeichnis erstellen
WORKDIR /certbot

# Skript kopieren, das die Zertifikate erstellt und kopiert
COPY renew_and_transfer.sh /certbot/renew_and_transfer.sh
COPY crontab.txt /etc/cron.d/my-cron-zert

# Skript ausführbar machen
RUN chmod +x /certbot/renew_and_transfer.sh
RUN chmod 644 /etc/cron.d/my-cron-zert

# Cron starten
ENTRYPOINT cron -f # wichtig !!! sonst bendet sich der Container nach dem Start

Dieser Docker-Container enthält alle nötigen Tools: Cron, um Zertifikate regelmäßig zu erneuern, Certbot für die Zertifikaterstellung und SSH, um die Verbindung zu den entfernten Servern herzustellen.

Das Bash-Skript zur Zertifikaterneuerung

Das folgende Bash-Skript wird innerhalb des Docker-Containers ausgeführt. Es verbindet sich per SSH mit dem Remote-Server, erneuert das Zertifikat und sorgt dafür, dass es auf den richtigen Webserver übertragen wird.

#!/bin/bash

# Variablen
REMOTE_SERVER="xxx.xxx.xxx.xxx" # Remote-Server-IP oder Hostname
REMOTE_USER="sshuser"            # Benutzername auf dem Remote-Server
SSH_KEY="/sshuser/.ssh/id_rsa"   # Pfad zum privaten SSH-Schlüssel
DOMAIN="example.site"      # Domain für das Zertifikat
EMAIL="sshuser@example.site"    # Email für Certbot
WEBROOT="/home/sshuser/docker/proxy/html"
# WEBROOT-Pfad zum Webroot auf dem Remote-Server, der Pfad ist nach Installation unterschiedlich

# Certbot-Befehl über SSH auf dem Remote-Server ausführen
echo "Führe Certbot auf dem Remote-Server aus..."
ssh -i $SSH_KEY $REMOTE_USER@$REMOTE_SERVER "certbot certonly --webroot --webroot-path=$WEBROOT --agree-tos --email $EMAIL -d $DOMAIN"

# Überprüfen, ob der Befehl erfolgreich war
if [ $? -ne 0 ]; then
    echo "Fehler bei der Zertifikatserneuerung auf dem Remote-Server."
    exit 1
fi

# Erfolgsmeldung
echo "Zertifikat für $DOMAIN erfolgreich erneuert."

Dieses Skript führt den Certbot-Befehl auf dem Remote-Server über SSH aus. Die Webroot-Authentifizierungsmethode wird verwendet, um das Zertifikat zu erneuern, wobei der Webserver des Remote-Servers nicht beeinflusst wird.

der Ablageort der Zertifikate ist in aller Regel, wenn nicht anders konfiguriert:
/etc/letsencrypt/live/<domain>/

Zertifikate zentral verwalten

Der Vorteil dieser Methode liegt darin, dass Certbot in einer zentralisierten Umgebung läuft, während die eigentliche Erneuerung der Zertifikate auf den Zielservern geschieht. Das bedeutet, dass nur der zentrale Server den SSH-Schlüssel benötigt und die Kommunikation zwischen Servern auf ein Minimum beschränkt wird.

Die Zielserver müssen lediglich die Webroot-Verzeichnisse bereitstellen, die für die Zertifikatserneuerung notwendig sind. Dadurch bleiben die Ports 80 und 443 frei, und der Webserver auf den Zielsystemen läuft ohne Unterbrechung weiter.

Einrichtung des Cronjobs

Damit die Zertifikate regelmäßig erneuert werden, kann der Cron-Dienst im Docker-Container konfiguriert werden. Hier ein Beispiel für die Crontab-Datei (crontab.txt), die in das Docker-Image eingebunden wird:

0 3 * * 1 /certbot/renew_and_transfer.sh >> /var/log/cron.log 2>&1

Dieser Cronjob führt das Zertifikaterneuerungsskript jeden Montag um 03:00 Uhr aus und schreibt die Ausgaben in ein Logfile.

Verwendung der Webroot-Authentifizierung

Die Webroot-Authentifizierungsmethode, die in diesem Setup genutzt wird, ermöglicht es, Zertifikate zu erneuern, ohne den Webserver oder Ports wie 80 oder 443 zu unterbrechen. Certbot erstellt dabei eine temporäre Datei in einem Verzeichnis auf dem Remote-Server (das sogenannte "Webroot"), welches öffentlich über den Webserver zugänglich ist. Der Vorteil dieser Methode ist, dass keine zusätzlichen Dienste oder Ports geöffnet werden müssen, da nur der Zugriff auf dieses Webroot-Verzeichnis erforderlich ist. In unserem Skript wird der Pfad zum Webroot auf dem Remote-Server definiert, sodass Certbot die Zertifikatsüberprüfung über diesen Pfad durchführen kann.

Mehrere Cronjobs für verschiedene Domains und Server

Die Methode lässt sich problemlos skalieren, indem für jede Domain oder jeden Remote-Server ein eigener Cronjob angelegt wird. Dies ermöglicht es, Zertifikate für mehrere Domains und Server zentral zu verwalten.

Fazit

Mit dieser Methode lassen sich Zertifikate für entfernte Server zentral erneuern, ohne dass deren Webserver beeinträchtigt werden. Der Einsatz von Docker sorgt für eine isolierte Umgebung, in der der Certbot-Prozess ungestört abläuft. Zudem bleibt der SSH-Schlüssel sicher auf dem zentralen Server. Diese Lösung eignet sich besonders für Szenarien, in denen mehrere Server verwaltet werden und eine zentrale Zertifikatsverwaltung erforderlich ist.