Caddy: Reverse-Proxy in einfach?
Die Absicherung von HTTP-Verbindungen ist heutzutage relevant wie nie zuvor und auch an vielen Stellen vorgeschrieben. Die Implementierung ist aber je nach Infrastruktur kompliziert und erfordert häufig mehrere verschiedene Softwarekomponenten, um die Erstellung und auch den Austausch der benötigten HTTPS-Zertifikate sicherzustellen. Im Rahmen eines Projektes hatte sich daher die Frage gestellt, ob dieses Verfahren optimiert werden kann, um Zeit und Aufwand zu sparen und zu vermeiden, dass ein ablaufendes Zertifikat den produktiven Betrieb stört. Als hilfreiche und einfach zu konfigurierende Lösung hat sich hier Caddy herausgestellt, welchen wir Ihnen in diesem Beitrag vorstellen möchten.
Caddy ist ein in Go geschriebener Webserver, welcher eine sehr schnelle und einfache Einrichtung eines Reverse-Proxies mit automatischer Generierung und Verwaltung der SSL-Zertifikate ermöglicht.
Reverse-Proxy mit automatischer HTTPS-Konfiguration
Von den auf Linux-Systemen häufig genutzten Reverse-Proxy Varianten wie nginx, Apache HTTP Server oder HAProxy ist bekannt, dass die HTTPS-Konfiguration teilweise etwas aufwändiger sein kann und die Bereitstellung und Erneuerung der SSL-Zertifikate jeweils zusätzliche Schritte erfordert. Können Sie sich daher vorstellen, mit einem einzigen Befehl bereits einen funktionierenden Reverse-Proxy zu erhalten, der automatisch ein passendes SSL-Zertifikat hat?
Der Befehl …
caddy reverse-proxy --from www.example.com --to localhost:8080
… reicht aus, um Anfragen an die (eigene) Domain www.example.com an einen lokalen Dienst, der auf Port 8080 läuft, weiterzuleiten. Das notwendige HTTPS-Zertifikat für https://www.example.com wird in diesem Fall automatisch generiert. Diese manuelle Vorgehensweise ist für schnelle Tests sehr hilfreich, aber sollte so eher nicht produktiv verwendet werden.
Eine persistente Konfiguration ist stattdessen über die separate Konfigurationsdatei Caddyfile
möglich, welche ein eigenes, sehr simples Format nutzt. Alternativ kann die Konfiguration auch im JSON-Format bereitgestellt werden. Nachfolgend finden Sie den oben genannten Befehl als Caddyfile:
www.example.com { reverse_proxy localhost:8080 }
Dieser simple Code reicht aus, um alle Anfragen an „www.example.com“ an einen Backend-Service auf HTTP-Port „8080“ weiterzuleiten. Zusätzlich baut Caddy „out of the box“ eine Verbindung mit ACME-Servern auf, um automatisch ein kostenloses SSL-Zertifikat über ZeroSSL oder Let'sEncrypt zu beziehen. Caddy kümmert sich auch komplett automatisch um eine notwendige Aktualisierung der Zertifikate. Die Validierung beim ACME-Server erfolgt standardmäßig über HTTP.
Reverse-Proxy ohne öffentlich erreichbaren Webserver
Es gibt natürlich viele Umgebungen, in denen eine direkte HTTP-Validierung nicht ermöglicht werden kann, weil der Caddy Server nicht aus dem Internet erreichbar ist. Für diese Fälle gibt es weitere Möglichkeiten, um die SSL-Zertifikate zu validieren:
1. Falls in der internen Infrastruktur ein eigener ACME-Server betrieben wird, kann dieser genutzt werden. Dies ergibt vor allem Sinn, wenn eine interne Zertifizierungsstelle zur Ausstellung und Verwaltung der Zertifikate betrieben wird und von dieser die Zertifikate bezogen werden sollen.
2. Über passende TXT-Einträge in der DNS-Zone können ebenfalls Zertifikate validiert werden. Zu diesem Zweck muss der Caddy Server eine Verbindung über die API eines passenden (internen oder externen) DNS-Anbieters aufbauen können, um die für die Validierung erforderlichen Einträge zu setzen.
Beispiel-Konfiguration für einen Reverse-Proxy mit ACME-Anpassung in Cloudflare:
www.example.com { reverse_proxy backend-server:8080 tls { dns cloudflare } }
Beispiel-Konfiguration für einen Reverse-Proxy mit eigenem ACME-Server:
{ acme_server } tls { issuer acme { ca https://acme-server-url/ } } www.example.com { reverse_proxy backend-server:8080 }
Verwendung mit Docker
Caddy kann auch sehr einfach als Docker-Container betrieben und beispielsweise in eine Docker Compose Konfiguration integriert werden, um einen Web-Service mit HTTPS erreichbar zu machen. Eine docker-compose.yml könnte beispielsweise wie folgt aussehen:
services: caddy: image: caddy:latest ports: - 80:80 - 443:443 volumes: - ./Caddyfile:/etc/caddy/Caddyfile - ./certs:/data restart: always webapp: image: my-webapp:latest ports: - 8080:8080 restart: always
Damit Caddy funktioniert muss vorher noch das Verzeichnis „certs“ angelegt werden, in dem die Zertifikate persistent gespeichert werden, sowie das Caddyfile:
www.example.com { reverse_proxy webapp:8080 }
Anschließend lassen sich die Container mit „docker compose up -d“ starten
Plugins
Caddy kann mit vielen Plugins erweitert werden, die eine Vielzahl von freiwilligen Entwicklern bereitstellen. Über diese Erweiterungen können neben verschiedenen DNS-Providern auch Features wie WebDAV, verschiedene Autorisierungsmöglichkeiten, Rate-Limits, Webhooks und vieles Weitere implementiert werden. Weitere Informationen dazu sind hier zu finden:
Fazit
Der Caddy Webserver vereinfacht die Einrichtung von Reverse-Proxies mit HTTPS-Zugriff deutlich und unterstützt damit gleichzeitig bei der Verbesserung der Sicherheit. Mit seiner Benutzerfreundlichkeit, der automatischen HTTPS-Konfiguration, dynamischen Reverse-Proxy-Funktionen und dem Plugin-System bietet er eine moderne und umfassende Lösung.
Für weitere Informationen sind die offizielle Dokumentation und die Caddy-Community zu empfehlen:
Seminarempfehlungen
LINUX/UNIX GRUNDLAGEN FÜR EINSTEIGER BS-01
Zum SeminarLINUX SYSTEMADMINISTRATION GRUNDLAGEN BS-02
Zum SeminarLINUX SYSTEMADMINISTRATION FÜR FORTGESCHRITTENE BS-12
Zum SeminarConsultant bei ORDIX
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare