Webservices in meinem Homelab hatte ich die ganze Zeit mit Nginx Proxy Manager als Dockerimage mit dem Crowdsec Replacement von LePresidente inkl. OpenResty Remediation Component veröffentlicht. Doch bei jedem Update wurde es stressiger und fehleranfälliger. Beim letzten Update startete OpenResty nicht mehr im NGINX. Es ging mir voll auf die Nerven! Ich suchte etwas einfaches und wurde mit dem Projekt „Caddy“ fündig. Der Reverse Proxy hatte alles was ich im Homelab brauche: automatische Erstellung der LetsEncrypt Zertifikate und einen Bouncer für Crowdsec. Es existiert ebenfalls eine Collection für Crowdsec mit Parser und Scenarios. Unter Proxmox habe ich mich für einen LXC Container mit Ubuntu 24.04 entschieden. Die Installation skizziere ich hier grob. Als erstes muss man das Repository von Caddy einbinden und den Dienst installieren:apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install caddy
Nun ist Caddy installiert und erzeugt ein Systemd Startscript. Die Konfigurationsparameter habe ich mir aus verschiedenen Quellen zusammengesucht und in der Konfigurationsdatei eingebunden. Hier ein Beispiel:cat /etc/caddy/Caddyfile
{
crowdsec {
api_url http://192.168.X.Y:8080/
api_key sdfffYgQ17QvQB+LPXyL81ppHCya9p6VTMD3g0Lq7XI4
}
}
<subdomain>.klehr.de {
route {
crowdsec
}
reverse_proxy http://192.168.X.Y:3000
log {
output file /var/log/caddy/subdomain-access.log {
roll_size 10mb
roll_keep 20
roll_keep_for 720h
}
}
}
Beim Start von Caddy wird ein Portforward von Port 80 benötigt, denn Caddy erzeugt jetzt über die HTTP-API-01 ein Lets Encrypt Zertifikat für die Subdomains die veröffentlicht werden. Diese Zertifikate liegen in folgendem Ordner:/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory
Ich lasse den Port 80 nicht die ganze Zeit geöffnet und überwache die Zertifikate mit CheckMK. Sollte ein Zertifkat ablaufen, so öffne ich den Port 80, lösche das Zertifikat im Ordner und starte Caddy neu. Dabei wird ein neues Zertifkat generiert. Etwas umständlich, aber damit kann ich laben.
In dem Beispiel ist die Sektion für Crowdsec schon enthalten. Es reicht bei einem verteilten Crowdsec Setup wie ich es betreibe (mit Remote LAPI) den Bouncer zu installieren und mit dem Crowdsec Server zu verbinden. Dazu müssen wir den Crowdsec Bouncer installieren:caddy add-package github.com/hslatman/caddy-crowdsec-bouncer
Auf dem Crowdsec Server muss der Bouncer bekannt gemacht werden der sich verbinden soll. Ein API Key wird erzeugt und dieser muss in die Konfiguration von Caddy:root@CrowdSec ~ # cscli bouncers add caddy
API key for 'caddy':
sdfffYgQ17QvQB+LPXyL81ppHCya9p6VTMD3g0Lq7XI4
Please keep this key since you will not be able to retrieve it!
Wenn Caddy neu gestartet wurde, sollte man auf dem Crowdsec LAPI Server den Bouncer „sehen“:root@CrowdSec ~ # cscli bouncers list
caddy 192.168.X.Y ✔️ 2025-02-11T09:36:26Z caddy-cs-bouncer v0.7.0 api-key
Eigentlich würde jetzt alles laufen, aber wir haben im Ordner „/var/log/caddy/“ schöne Logfiles liegen die wir ebenfalls parsen und damit Angriffe erkennen könnten. Ich untersuche die Logfiles der veröffentlichten Services direkt auf den Servern auf denen sie ausgeführt werden. Doch die Logfiles von Caddy selbst wollte ich jetzt auch noch in Crowdsec einbinden. Also muss man Crowdsec installieren und im acquis File die Logs vom Type „caddy“ konfigurieren. Wie gesagt: muss nicht sein, der Bouncer funktioniert und sperrt IPs die von den Services gemeldet werden über die LAPI. Aber wie heisst es so schön: Haben ist besser als brauchen 🙂curl -s https://install.crowdsec.net | sudo sh
apt update
apt install crowdsec
Nun den Server bei der LAPI anmelden und verbinden:cscli lapi register --machine caddy --url http://192.168.X.Y:8080/
systemctl reload crowdsec
Auf dem Crowdsec Server die Instanz des Caddyservers validieren:cscli machines validate caddy
Dann die Collection für „caddy“ installieren und das acquis File editieren:cscli collections install crowdsecurity/caddy
cat /etc/crowdsec/acquis.yaml
filenames:
- /var/log/caddy/*.log
labels:
type: caddy
Am besten den ganzen Service Crowdsec neu starten und im Logfile nachsehen ob alles erkannt wird:systemctl restart crowdsec
time="2025-02-11T09:59:29+01:00" level=info msg="Adding file /var/log/caddy/subdomain-access.log to datasources" type=file
Nun ist neben dem Bouncer in Caddy mit Verbindung zum LAPI Server auch ein Logparser aktiv der die Ergebnisse an die LAPI meldet. Gibt es einen Treffer, wird von der LAPI aus eine Sperrung der IP bei den Bouncern veranlasst.
Viel Spaß bei der Umsetzung!