Caddy Webserver

Caddy ist ein erweiterbarer, Cross-Platform, Open-Source Webserver, der in Go geschrieben ist.

Die verwendete Lizenz ist Apache 2.0 und daher nicht so streng wie GPL. Ein wesentliches Merkmal von Caddy ist, dass der Webserver mit modernen und sicheren Standardeinstellungen ausgestattet ist, die vor allem durch die Go-Standardbibliothek beeinflusst werden. So ist bei Caddy HTTPS standardmäßig aktiv, wenn eine Domain als Host angegeben ist. Der Webserver besorgt sich somit automatisch ein Let’s Encrypt Zertifikat welches automatisch verlängert wird und richtet HTTPS inklusive HTTP zu HTTPS-Weiterleitung ein.

Da Caddy cross-platform ist, lässt sich der Webserver auf jedem Betriebssystem und jeder Prozessor-Architektur nutzen, sofern diese von Go selber unterstützt werden. Caddy wird manchmal auch Caddy 2 oder Caddy v2 genannt, da die zweite Version viele Neuerungen brachte und von Grund auf neu geschrieben wurde, wodurch auch Inkompatibilitäten zu v1 und v0 entstanden sind.

Caddy lässt sich sogar ohne Konfiguration in die Produktion bringen. Ein Beispielbefehl:

caddy file-server -domain beispiel.toowoxx.de -root /var/www/html

Dieser Befehl startet Caddy mit einem Dateiserver über HTTPS mit automatischer HTTP-Weiterleitung und Let’s Encrypt-Zertifikat für die Domain beispiel.toowoxx.de (DNS-Konfiguration muss vorab bereits geschehen sein). Dieser Dateiserver stellt das Verzeichnis /var/www/html, worin sich eine Webseite befinden könnte, somit zur Verfügung.

Caddy wird meist als Alternative zu Apache oder nginx verwendet, da die Konfiguration sehr einfach ist und sich viele Dinge schnell und unkompliziert lösen lassen.

Caddyfile

Caddy wird oft mittels eines Caddyfile konfiguriert. Das Caddyfile ist eine sehr simple und strukturierte Konfigurationssprache, die der Syntax von nginx-Konfiguration ähnelt. Die Dokumentation zum Caddyfile mit zahlreichen Beispielen ist unter https://caddyserver.com/docs/caddyfile verfügbar.

Folgendes Beispiel bildet das oben genannte Beispiel ab:

beispiel.toowoxx.de
root * /var/www/html
file_server

Caddy unterstützt auch mehrere virtuelle Hosts, eine Konfiguration kann also auch wie folgt aussehen:

beispiel.toowoxx.de {
    # File-Server aus /var/www/html (ähnlich zu DocumentRoot in Apache 2)
    root * /var/www/html
    file_server
}

service.toowoxx.de {
    # Reverse-Proxy zu localhost:8080
    reverse_proxy localhost:8080
}

localhost:9200 {
    # Load-Balancer für API
    reverse_proxy /api/* server1:1200 server2:1300 server3:1400 {
        # Header an Upstream weitergeben
        header_up Origin "localhost"
        # Header an Downstream entfernen
        header_down -Powered-By
    }

    # PHP-App aus /var/www/app
    root * /var/www/app
    php_fastcgi 127.0.0.1:9000
    file_server

    # Server-Header entfernen
    header -Server
    
    # CORS Header hinzufügen
    header Access-Control-Allow-Origin "*"
    header Access-Control-Allow-Methods GET
}

http://http-only.toowoxx.de {
    # Statischen Text zurückgeben
    respond "Only HTTP supported on this page"
}

Diese Konfiguration ist etwas komplexer, aber trotzdem gut lesbar. Wird eine solche Konfiguration in die Datei Caddyfile gespeichert, kann der Webserver mit dem Befehl caddy start aus diesem Verzeichnis gestartet werden. Es wird dann die Konfiguration im aktuellen Verzeichnis verwendet.

Konfigurationsmöglichkeiten

Caddy kann nicht nur mit einem Caddyfile, sondern vielen anderen Sprachen und Formaten konfiguriert werden. Bei Caddy werden sogenannte Konfigurationsadapter verwendet, die die jeweilige Konfigurationsdatei ausliest und Caddy damit konfiguriert.

Caddy kann auch mit dem nativen JSON-Format konfiguriert werden, welches viel mehr Möglichkeiten bietet, aber auch komplexer ist und mehr Schreibarbeit erfordert. Aus eigener Erfahrung ist dies aber nicht notwendig.

Kleine Liste an Konfigurationsadaptern:

So kann beispielsweise mithilfe des nginx-Adapters mit etwas Glück eine einfache nginx-Konfigurationsdatei direkt in Caddy verwendet werden.

Erweiterbarkeit und Plugins

Caddy ist nicht nur ein Web Server sondern vielmehr eine Web-Plattform. Durch das einfache Plugin-System lassen sich beliebige Plugins in Go schreiben, wodurch die Möglichkeiten praktisch unendlich sind.

Durch das Tool xcaddy lässt sich Caddy sehr einfach mit beliebigen Plugins zusammenbauen.

Auch wir haben Plugins geschrieben, zum Beispiel das Confidentiality Index Plugin, welches auf jeder Seite eine Ampel mit der geltenden Informationsklassifizierung anzeigt.

Caddy kann auch als Basis für neue Backends und Web-Apps verwendet werden. Manche Anwendungsfälle lassen sich mithilfe von Caddy und einem Caddyfile umsetzen, ohne eigene Software entwickeln zu müssen.

Beispiele für Plugins:

Für die Entwicklung

Caddy kann sehr gut als Webserver bei der Entwicklung genutzt werden, um produktionsnah testen zu können. Es können selbstsignierte Zertifikate automatisiert verwendet werden, denn Caddy kann diese selbstständig generieren und installiert diese kurzlebigen Zertifikate sogar im Zertifikatsspeicher des Betriebssystems, damit HTTPS-Zugriff auch auf dem lokalen Rechner ohne Warnungen vom Browser oder von Anwendungen funktioniert.

tls-internal

Sicherheit

Da Caddy die Go-Standardbibliothek nutzt, ist die Sicherheit des Webservers zum großen Teil durch die Standardbibliothek gegeben. HTTP, TCP, Netzwerkkommunikation, TLS und viel mehr sind bereits in der Go-Standardbibliothek durch erfahrene Entwickler programmiert und ausführlich getestet worden. So ist die Sicherheit der wichtigsten Kernkomponenten nicht in den Händen der Caddy-Entwickler, sondern in denen der Go-Entwickler.

In vielen Tests schneidet Caddy mit der Standardkonfiguration sehr gut ab, so zum Beispiel der Qualys SSL-Test mit A+.

Caddy Qualys SSL-Test

Caddy entspricht im Thema Sicherheit nicht nur den Industriestandards sondern übertrifft diese mit den Standardeinstellungen ohne zusätzliche Konfiguration.

Geschwindigkeit

Da Caddy in Go geschrieben ist, ist die Geschwindigkeit allgemein sehr schnell und mit anderen in Go geschriebenen Backends vergleichbar. Die CPU-Auslastung sowie RAM-Nutzung ist bei Caddy allgemein sehr niedrig. So nutzt ein bei uns seit 2 Wochen produktiv laufender Caddy-Webserver 28 MB Arbeitsspeicher und hat in dieser Zeit ca. 3:30 Stunden CPU-Zeit verbraucht, was eine Durchschnittsauslastung von 1% bedeutet.

Vorteile und Features

Caddy bringt viele Vorteile und Features mit sich, darunter:

  • Webserver-Funktionalität
  • Reverse Proxy und Load Balancer mit Health Checks usw.
  • Unterstützung für PHP über FastCGI
  • Automatisches HTTPS über Let’s Encrypt, alternativ ZeroSSL (oder ein benutzerdefinierter ACME-Server)
  • Plugin-System
  • Hohe Geschwindigkeit, nutzt wenig Systemressourcen
  • Eigenes PKI-System zur Nutzung von selbstsignierten Zertifikaten
  • Cross-Platform und auch als Docker-Image verfügbar
  • Logging und Monitoring-Möglichkeiten
  • Admin-API zur Verwaltung des Webservers ohne Neustart/Downtime
  • Authentifizierung
  • Komprimierung (gzip und zstd), durch Plugins auch andere wie z. B. Brotli
  • Konfigurierbares Error-Handling
  • Directory Browsing (Web-GUI, um Dateien zu durchstöbern)
  • HTTP-Umleitungen/Weiterleitungen
  • HTTP/1.1, HTTP/2 (Standard), und HTTP/3 (experimentell)
  • HTTP/2 Server Push
  • IPv4/IPv6
  • Markdown-Rendering
  • Request-Matcher
  • Templates (ähnlich zu Server-Side Includes)
  • TLS (TLS 1.3, unterstützt auch TLS 1.2 und ältere TLS-Versionen)
  • Standardmäßig TLS 1.2/1.3
  • URL Rewrites
  • Variablen
  • Virtuelle Hosts
  • WebSockets
  • Zero-downtime reloads

Wer betreibt das Projekt?

Das Caddy-Projekt ist von Matt Holt gegründet worden. Matt hat einen Master-Abschluss in Computer Science und hat im April 2015 die erste Caddy-Version herausgegeben. Er wird auch durch einige Firmen und Personen gesponsort, darunter ein Go Security Lead und ein EFF-Mitglied für Let’s Encrypt.

Caddy arbeitet mit Ardan Labs zusammen und ist Teil der Stack Holdings GmbH aus Wien geworden. Zur Stack Holdings gehört auch apilayer, die viele nützliche Dienste anbieten und von großen Firmen wie Amazon, Apple und airbnb verwendet werden, darunter auch ZeroSSL, was bei uns Verwendung findet. Die Stack Holdings GmbH hält das Warenzeichen für Caddy. Caddy wird hauptsächlich durch ZeroSSL und den Sponsoren von Matt finanziert.

Caddy’s Wichtigkeit

Caddy wurde als Basis für andere Softwareprojekte und kommerzielle Dienstleistungen verwendet und die Reichweite dessen erstreckt sich bis in die akademische Forschung und die Diskussion in der Industrie.

CoreDNS wurde von Miek Gieben aus einem Fork von Caddy v1 erstellt, der modifiziert wurde, um DNS anstelle von HTTPS bereitzustellen. Es nutzte das Caddyfile-Konfigurationsformat von Caddy, die Plugin-Architektur und die Verwendung der Go-Programmiersprache.

Cloudflare implementierte einen MITM-Erkennungsdienst, der ursprünglich auf Caddy basierte und seine nativen MITM-Erkennungsfunktionen verwendet. Dieselbe Firma benutzte Caddy auch, um eine experimentelle TLS 1.3-Implementierung bereitzustellen, während sie an der Bildung der endgültigen TLS 1.3-Spezifikation beteiligt war.

Let’s Encrypt betrachtet Caddys Implementierung von ACME als den goldenen Standard von ACME-Clients, und Caddy ist daher auch zu einem Vorbild für andere Software geworden.

Caddy hat an einer Reihe von wissenschaftlichen Arbeiten mitgewirkt und verschiedene Recherchen ermöglicht:

  • Validierung der Machbarkeit des ACME-Protokolls in Produktionsservern
  • Bereitstellung von QUIC im Internet
  • Ein Test-Framework für Cloud-Failover-Mechanismen
  • Messung des Sicherheitsschadens von schwacher TLS-Kryptografie
  • Plädiert für Secure-by-Default-TLS
  • Verbesserung der Benutzerfreundlichkeit der Bereitstellung von HTTPS

Caddy bei Toowoxx

Toowoxx verwendet Caddy für Eigenentwicklungen, Entwicklungsumgebungen sowie auch produktiv für unsere Infrastruktur. Wir nutzen Caddy auch auf Azure in Containern, um HTTPS unkompliziert nach außen verfügbar zu machen. Wir bieten auch zwei Caddy-Plugins auf GitHub an:

Wir tragen auch aktiv zum Caddy-Projekt bei indem wir uns an der Entwicklung beteiligen.