Einleitung

Eines der ältesten Probleme in meiner Homelab Journey ist das Management von TLS Zertifikaten für meine Server. Seitdem es Certbot, LEGO usw. gibt, ist das Thema bereits um ein vielfaches einfacher und automatisierbar, jedoch bis dato bei mir immer verteilt gewesen, da ich zwar die Möglichkeit habe alles zu automatisieren, aber dann per Host Basis oder alternativ mit Scripten zum Deploy.
Dafür habe ich in der Vergangenheit einen zentralen Certbot Server verwendet und ein rudimentäres deployscript als post hook. Dazu musste ich jedoch per SSHFS, NFS oder SMB jeweils auf die Zielsysteme zugreifen und die Systeme haben regelmäßig auf aktualisierte Files geprüft und notwendige Services restartet...
Hört sich dumm an, ist es auch...
Derzeit baue ich meine gesamte Infrastruktur neu auf, sodass ich Dinge wie SSO nutzen kann, aber auch bessere Performance und mehr Sicherheit im System habe sowie besseres deployment meiner Systeme.
Aus diesem Grund habe ich auch nach einer neuen Lösung gesucht, um meine Zertifikate zentral zu verwalten und an alle internen und externen Dienste auszugeben.

Bei der Recherche bin ich bei Certwarden hängngeblieben.

Was kann Certwarden?

Cert Warden ist ein Zertifikatsmanager für ACME-basierte Zertifikate wie Let’s Encrypt auch. Statt aber auf jedem einzelnen Server eigene ACME-Clients, Cronjobs oder Certbot-Installationen zu betreiben, werden Zertifikate an einer zentralen Stelle erstellt, verwaltet und automatisch erneuert.
Über eine Weboberfläche lassen sich ACME-Accounts, DNS-01- oder HTTP-01-Challenges, private Schlüssel und Zertifikate verwalten, incl. eingebauter Möglichkeit für dutzende Plugins für z.B. Cloudflare, IONOS, Netcup, DNSSEC etc..
Anschließend können die ausgestellten Zertifikate per API, Certwarden Client oder eigenen Skripten automatisiert an interne Systeme wie Reverse Proxys, Home Assistant, Proxmox, OPNsense oder andere Dienste verteilt werden.
Dadurch eignet sich Cert Warden besonders für Homelabs, interne Infrastrukturen und kleinere Umgebungen mit mehreren TLS-gesicherten Diensten (wie in diesem Fall meinem).

Screenshot der Certwarden Weboberfläche
Certwarden Dashboard

Dieser Beitrag wird sich damit beschäftigen, wie Certwarden aufgesetzt werden kann und wie man das System absichern sollte, denn die Kompromitierung dieses Systems würde die Verschlüsselung aller Systeme, die Zertifikate von dem System einsetzen kompromitieren.

Hauptteil

Jetzt zum eingemachten - was muss alles gemacht werden? Ziel dieses Beitrags ist folgender Aufbau:

  • Ein separater Cert-Warden-Server im internen Netz
  • Certwarden selbst soll per HTTPS angesprochen werden
  • Zertifikate über Let’s Encrypt per DNS-01-Challenge
  • Automatische Verlängerung der Zertifikate
  • Abruf der Zertifikate per API oder Cert-Warden-Client
  • Saubere Trennung zwischen Zertifikatsverwaltung und den eigentlichen Diensten

In diesem Beitrag werden ich zeigen, wie ich Certwarden für mein System aufgesetzt habe. Dazu werde ich ein entsprechendes Ansible Script zur Verfügung stellen bzw. genauer gesagt einige Rollen.
Die Ansible Rolle wird:

  • Certwarden auf dem Zielhost installieren
  • Certwarden konfigurieren, sodass nach der Erstellung eines Zertifikats mit dem Namen "certwarden" und einem Neustart Certwarden sofort per HTTPS erreichbar ist und nicht mehr per HTTP.

Voraussetzungen

Dieser Beitrag startet nicht komplett bei Null sondern geht davon aus, dass bereits ein System besteht auf dem Certwarden installiert werden kann.

In meinem Fall handelt es sich um einen proxmox LXC.
Dieser Beitrag zeigt wie das System mit Ansible aufgesetzt wird. Daher setzt dieser Beitrag ebenfalls voraus, dass bekannt ist, wie Ansible verwendet wird.
Ansonsten kann dies hier nachgelesen werden.

Ansonstne natürlich alles was ein Zertifikat naturgemäß zum "überleben" braucht...

- Eine öffentlich erreichbare Domain
- Grundverständnis zu DNS und TLS
- und optional (sofern DNS-01 genutzt werden soll) - einen passenden DNS Provider

Cert Warden unterstützt HTTP-01 und DNS-01. Für interne Dienste ist DNS-01 in der Regel die bessere Wahl, weil der eigentliche Dienst nicht öffentlich erreichbar sein muss. Bei DNS-01 wird ein TXT-Record im DNS gesetzt, den der ACME-Server anschließend prüft. Aus diesem Grund (und weil für mein dafürhalten DNS-01 auch angenehmer in der Nutzung ist) wird DNS-01 verwendet.

Installation von Certwarden mit Ansible

Die Installation unterteilt sich effektiv in 2 (3) Schritte.
In meinem Fall ist es:

1. Installation von Standardsoftware, die auf allen meinen Systemen laufen soll
2. Installation von Certwarden in der Basis
3. Konfiguration von Certwarden

Ich habe die Automation hier hochgeladen, sodass diese einfacher Nutzbar ist.

Certwarden-Enroll Playbook

Die wichtigste Datei ist das Playbook selbst unter playbooks/enroll-certwarden.yml. Dieses vereint alles in einer Datei und ermöglicht die Ausführung.
Das Playbook enthält zwei Rollen:
1. Install-Certwarden
2. Configure-Certwarden

Wir gehen einmal durch, was die Rollen jeweils machen.

Install-Certwarden

Die Install-Certwarden Rolle macht potenziell 2. Dinge
1. Sie Installiert Certwarden, wenn es nicht installiert ist oder
2. Certwarden wird auf das aktuelle Release hochgezogen.

Dazu lädt die Rolle zuerst die aktuellen Release Informationen herunter und prüft ob die Datei {{ certwarden_install_dir }}/ansible_state.json" existiert. Wenn nicht, wird neu installiert.

Dazu wird das aktuelle Release heruntergeladen und entpackt in einem separaten Ordner, nach dem entpacken alles in das Zielverzeichnis kopiert und die inkludierte "install.sh" aufgerufen, sodass der Dienst als Service registriert wird und aktiviert wird.
Sofern alles klappt, wird die ansible_state Datei erstellt und mit der Versionsnummer (und ein paar anderen Infos) befüllt.

Sofern die Datei existiert, wird geprüft ob die installierte Version (die Version im Statefile) die gleiche ist, wie das aktuellste Release. Sofern diese nicht gleich sind, wird die Software aktualisiert.

Configure-Certwarden

Dieser Schritt ist eigentlich eher über das Webinterface / CLI zu machen, aber wir möchten es ja so gut es geht alles automatisch haben.

Die Rolle Configure Certwarden kopiert eine vorkonfigurierte Datei in den Config Folder für Certwarden und startet den Dienst neu. Die Config kann (vorkonfiguriert für die Nutzung von DESec) hier abgerufen werden.
Bitte beachten, dass ggf. die Werte für deinen DNS Provider angepasst werden müssen und es muss in jedem Fall ein token angegeben werden. Mehr Info zu deinem provider kannst du hier finden:
https://go-acme.github.io/lego/dns/index.html

Der Certwardenserver läuft ab dann auf Port 80 und 443. Da es aber noch kein Zertifikat gibt und soweit ich weiß ist die Konfiguration per CLI nicht möglich ( falls mein Stand falsch ist, gerne eine Mail an hallo@logikstube.de ) müssen wir uns im nächsten Schritt per HTTP einloggen.
Das Standardkenntwort ist admin:password (aus der Certwarden Dokumentation).

Grundkonfiguration zur Nutzung von Certwarden

Die meisten Einstellungen können direkt über die Weboberfläche vorgenommen werden. Im ersten Schritt muss jedoch ein ACME Account erstellt werden.

ACME Server erstellen

Unter ACME Servers sind normalerweise Let’s Encrypt Production und Let’s Encrypt Staging bereits vorhanden. Cert Warden bringt diese beiden Server standardmäßig mit.

Ich empfehle, die ersten Tests immer gegen Staging laufen zu lassen. Dadurch vermeidet man unnötige Probleme mit Rate Limits, falls bei der DNS-Challenge noch etwas nicht passt.

Um den Account zu erstellen müssen wir unter Private Keys einen neuen key erstellen.

Screenshot Certwarden - neuer private key erstellen
Private Key in Certwarden erstellen

Sobald der Key existiert kann dieser für den ACME Account verwendet werden -> ACME Accounts -> New Account

Screenshot neuen acme account erstellen
Neuen ACME Account erstellen

Zuletzt erstellen wir unter "Zertifikate" > "Neues Zertifikat" ein neues Zertifikat mit dem Namen "certwarden". Der Name muss gleich sein, damit der Server dieses danach aufruft!

Sobald alle Informationen eingegeben sind, kann man untern auf Submit und dann weiter unten auf "Place new order" klicken. Damit wird das Zertifikat beantragt und kann slange noch nicht ausgestellt unter "ACME QUEUE" angesehen werden.

Damit ist das Grundsetup für Certwarden fertig. Im nächsten Schritt (Beitrag), erstellen wir dann ein Zertifikat und rollen dieses auf andere Dienste aus.

Schluss

Wir haben jetzt eine nutzbare Certwarden Installation. Im nächsten Schritt werden wir diese verwenden um per Ansible unterschiedliche andere Services, sowohl intern, als auch extern erreichbar mit diesen Zertifikaten zu versorgen und damit zentralisiert abzusichern.