In dieser Anleitung zeige ich euch, wie ihr eine IP Adresse in CrowdSec whitelisten könnt. Dies bedeutet, dass die IP Adresse nicht blockiert wird, auch wenn “Angriffe” erkannt werden sollten. Mir passiert das häufig, wenn ich neue Anleitungen erstelle.
Datum | Änderungen |
---|---|
05.04.2023 | Erstellung dieser Anleitung |
02.12.2023 | Anpassung an neuere Traefik Anleitung |
15.11.2024 | Angepasst an Traefik v3, Whitelist DynDNS hinzugefügt. Danke an @pkirsche |
1. Grundvoraussetzung
Traefik V3 Installation, Konfiguration und CrowdSec-Security
2. Whitelist erstellen – feste IP Adresse
Dazu öffnet ihr folgende Datei. Den Namen der Datei könnt ihr beliebig anpassen.
nano /opt/containers/traefik-crowdsec-stack/data/crowdsec/config/parsers/s02-enrich/mywhitelists.yaml
Fügt dort folgendes ein:
name: crowdsecurity/whitelists description: "Whitelist events from my ip addresses" whitelist: reason: "my ip ranges" ip: - "80.x.x.x"
Ändert hier nun die IP Adresse entsprechend ab. Anschließend müsst ihr CrowdSec neu starten. Gebt dazu folgendes ein:
cd /opt/containers/traefik-crowdsec-stack/ docker compose up -d --force-recreate
Nun sollte eure IP Adresse nicht mehr gebannt werden. Wichtig zu wissen ist noch, dass sich eure IP Adresse in der Regel bei eurem DSL Anschluss täglich verändert. Dann wird eure Whitelist ungültig.
3. Whitelist erstellen – dynamische IP – DynDNS
Wenn ihr eine Whitelist für eine dynamische IP erstellen wollt (also zum Beispiel euren Homeserver zuhause, welcher unter einer festen Domain erreichbar ist), so könnt ihr folgendes tun. Zuerst legen wir einen neuen Ordner an:
mkdir /opt/containers/traefik-crowdsec-stack/data/crowdsec/config/postoverflows/s01-whitelist
Legt nun folgende Datei an (Name könnt ihr verändern):
nano /opt/containers/traefik-crowdsec-stack/data/crowdsec/config/postoverflows/s01-whitelist/whitelist-dyndns.yml
Inhalt:
name: me/dyndnswhitelist description: Whitelist fuer eure Domain whitelist: reason: dont ban my IP expression: - evt.Overflow.Alert.Source.IP in LookupHost('my.dyndns.fqdn')
Hier müsst ihr natürlich noch “my.dyndns.fqdn” korrekt abändern.
Anschließend müsst ihr CrowdSec neu starten. Gebt dazu folgendes ein:
cd /opt/containers/traefik-crowdsec-stack/ docker compose up -d --force-recreate
4. Kontrollieren
4.1 Statische IP Whitelist
Nun kontrollieren wir, ob die Whitelist genommen wurde. Dazu gebt ihr folgendes ein:
docker exec crowdsec cscli parsers list
Jetzt sollte eure Whitelist in der Ausgabe erscheinen:
PARSERS -------------------------------------------------------------------------------------------------------------------------------------- Name 📦 Status Version Local Path -------------------------------------------------------------------------------------------------------------------------------------- crowdsecurity/cri-logs ✔️ enabled 0.1 /etc/crowdsec/parsers/s00-raw/cri-logs.yaml crowdsecurity/dateparse-enrich ✔️ enabled 0.2 /etc/crowdsec/parsers/s02-enrich/dateparse-enrich.yaml crowdsecurity/docker-logs ✔️ enabled 0.1 /etc/crowdsec/parsers/s00-raw/docker-logs.yaml crowdsecurity/dovecot-logs ✔️ enabled 0.8 /etc/crowdsec/parsers/s01-parse/dovecot-logs.yaml crowdsecurity/geoip-enrich ✔️ enabled 0.2 /etc/crowdsec/parsers/s02-enrich/geoip-enrich.yaml crowdsecurity/http-logs ✔️ enabled 1.2 /etc/crowdsec/parsers/s02-enrich/http-logs.yaml crowdsecurity/nextcloud-whitelist ✔️ enabled 0.7 /etc/crowdsec/parsers/s02-enrich/nextcloud-whitelist.yaml crowdsecurity/nginx-logs ✔️ enabled 1.4 /etc/crowdsec/parsers/s01-parse/nginx-logs.yaml crowdsecurity/postfix-logs ✔️ enabled 0.4 /etc/crowdsec/parsers/s01-parse/postfix-logs.yaml crowdsecurity/postscreen-logs ✔️ enabled 0.2 /etc/crowdsec/parsers/s01-parse/postscreen-logs.yaml crowdsecurity/sshd-logs ⚠️ enabled,update-available 2.0 /etc/crowdsec/parsers/s01-parse/sshd-logs.yaml crowdsecurity/syslog-logs ✔️ enabled 0.8 /etc/crowdsec/parsers/s00-raw/syslog-logs.yaml crowdsecurity/traefik-logs ✔️ enabled 0.9 /etc/crowdsec/parsers/s01-parse/traefik-logs.yaml mywhitelists.yaml 🏠 enabled,local /etc/crowdsec/parsers/s02-enrich/mywhitelists.yaml --------------------------------------------------------------------------------------------------------------------------------------
4.2 Dynamische IP Whitelist
Dies kontrollieren wir mit folgendem Befehl:
docker exec crowdsec cscli postoverflows list
Jetzt sollte eure Whitelist in der Ausgabe erscheinen:
POSTOVERFLOWS ---------------------------------------------------------------------------------------------------------------- Name 📦 Status Version Local Path ---------------------------------------------------------------------------------------------------------------- me/dyndnswhitelist 🏠 enabled,local /etc/crowdsec/postoverflows/s01-whitelist/whitelist-dyndns.yml ----------------------------------------------------------------------------------------------------------------
4. Quelle
https://docs.crowdsec.net/docs/whitelist/create/
Ich nutze für das Whitelisting von dynamischen IP-Adressen die IP helpers von Crowdsec.
Dazu habe ich unter
eine .yaml Datei (Name beliebig, z.B. dyndns.yaml) mit folgendem Inhalt.
Damit ist dann im Status mit
auch ein entsprechender Eintrag in den Overflows erkennbar:
Für mich funktioniert der Weg sehr gut und ist auch in der offiziellen Crowdsec Doku erwähnt, aber wie gut diese Lösung im Vergleich zu anderen Ansätzen ist, kann ich nicht sagen.
Hallo,
ich habe die Problematik, dass nicht nur von mir selber, sondern auch von anderen Anschlüssen auf meine Dienste zugegriffen werden soll und diese dann gebannt werden. Da habe ich zum Beispiel Familie und Freunde, die auf Nextcloud oder auch Jellyfin zugreifen können sollen. Ich habe mir dafür ein erweitertes Script gebastelt, dass alle diese Problem löst. Das möchte ich euch nicht vorenthalten. Einzige Voraussetzung ist, dass jeder externe Nutzer einen DynDNS-Dienst nutzt. Darüber wird dann die entsprechende IP bestimmt, die in Crowdsec “gewhitelistet” wird. Das kann auch z. B. der Fritz!Box eigene MyFritz-Dienst sein.
Das Script wird regelmäßig per Cronjob ausgeführt und aktualisiert bei Änderungen die Whitelists-Datei und startet den Crowdsec-Dienst bei Bedarf neu.
Um das ganze einfach Handhaben zu können und man quasi auch schon eine kleine Dokumentation dabei hat, um wen es sich handelt, habe ich mir eine einfache Syntax ausgedacht.
In der Whitelist-YAML-Datei werden unter whitelist->ip Einträge in folgendem Format erstellt:
# Syntax
– “0.0.0.0” # @[dyndns-domain] Beschreibung
Die IP ist beliebig und wird, wenn eine Abweichung gefunden wird ersetzt. Bitte in doppelte Anführungszeichen setzen. Durch die Raute wird ein Kommentar eingeleitet, der nicht von Crowdsec geparsed wird. Daher kann dahinter beliebiger Inhalt geschrieben werden. Ich habe mir ausgesucht die URL als “@[DYNDNS-DOMAIN]” zu schreiben. Danach kann eine kurze Beschreibung eingegeben werden, damit man auch weiß, um wen es sich handelt. Eine Sonderfunktion hat @[THIS], denn diese IP wird durch die eigene externe IP-Adresse des Servers (und in den meisten Fällen wohl auch euch selber) ersetzt. Und es gibt noch @[STATIC]. Diese IPs werden nicht angerührt.Zum Beispiel für feste IP-Adressen vom Arbeitsplatz in der Firma.
Das könnte dann so ausschauen:
name: crowdsecurity/whitelists
description: “Whitelist events from my ip addresses”
whitelist:
reason: “Erlaubte IP Adressen”
ip:
– “0.0.0.0” # @[THIS] Eigene externe IP-Adresse des Servers
– “12.34.56.78” # @[STATIC] Arbeitgeber
– “0.0.0.0” # @[meine-externe-fritz-id.myfritz.net] Eltern
– “0.0.0.0” # @[testdomain.dyndns.de] Kumpel Alex
– “0.0.0.0” # @[anderes.dyndns.test] Freundin
Nach jedem Aufruf des Scripts werden abweichende IPs entsprechend angepasst. Ich bin jetzt nicht der BASH-Profi, aber ich habe einige Fehler-Abfragen eingebaut und verschiedene Befehle, falls nicht vorhanden als Alternative eingesetzt und zumindest bei mir läuft das so seit geraumer Zeit fehlerfrei (Debian 12).
Hier noch das zugehörige Script. Bitte bei Bedarf die Pfade zur Whitelist- und Compose-YAML anpassen.
#!/usr/bin/env bash
##############################
# CrowdSec-Whitelist-Refresh
##############################
#####################################
# Hier bei Bedarf die Pfade anpassen
#####################################
# Pfad zur Whitelist-YAML-Datei
WHITELIST=/opt/containers/traefik-crowdsec-stack/crowdsec/config/parsers/s02-enrich/whitelistme.yaml
# Pfad zur Compose-Datei
COMPOSE=/opt/containers/traefik-crowdsec-stack/docker-compose.yml
#######################################
# Ab hier am besten nichts mehr ändern
#######################################
# Prüfen ob die Whitelist-Datei vorhanden ist
if [ ! -f “$WHITELIST” ]; then
echo “Whitelist-Datei nicht gefunden: $WHITELIST” >&2
exit 1
fi
# Prüfen ob die Docker-Compose-Konfiguration vorhanden ist
if [ ! -f “$CROWDSEC” ]; then
echo “Compose-Datei nicht gefunden: $CROWDSEC” >&2
exit 1
fi
# Prüfen ob die Whitelst-Datei beschreibbar ist
if [ ! -w “$WHITELIST” ]; then
echo “Whitelist file is not writeable: $WHITELIST” >&2
exit 1
fi
# Holt die externe IP des Netzwerks in dem der Server steht
function getExternalIP() {
local ip=
# Ist curl vorhanden, benutze curl
if command -v curl &>/dev/null; then
ip=”$(curl -Ls –fail ident.me)”
# Ist wget vorhanden, benutze wget
elif command -v wget &>/dev/null; then
ip=”$(wget –timeout=3 -q -O- ident.me)”
# Ansonsten abbrechen
else
echo “Kein curl oder wget installiert -> Abbruch” >&2
return 1
fi
echo “$ip”
return 0
}
# Holt die zugehörige IP einer dynamischen DNS-Adresse
function getIP() {
local ip
# Ist dig vorhanden, benutze dies (am schnellsten)
if command -v dig &>/dev/null; then
ip=$(dig +short “$1” | tail -n1 2>/dev/null)
# Ist getent vorhanden, benutze dies
elif command -v getent &>/dev/null; then
ip=$(getent hosts “$1” | head -n1 | cut -d’ ‘ -f1 2>/dev/null)
# Ist host vorhanden, benutze dies
elif command -v host &>/dev/null; then
ip=$(host “$1” | head -n1 | cut -d’ ‘ -f4 2>/dev/null)
# Ist kein unterstützter Befehl vorhanden -> Abbruch
else
echo “Kein unterstütztes Tool gefunden.” >&2
exit 1
fi
# Ist vorab ein Fehler aufgetreten -> Fehlercode zurückgeben
if [ $? -ne 0 ]; then
echo “Domain konnte nicht aufgelöst werden: $1” >&2
return 1
fi
echo “$ip”
return 0
}
# Whitelist-YAML Zeile für Zeile abarbeiten
change=0
while IFS= read -r line; do
if ! echo “$line” | grep -E ‘@\[[^ ]+\]’ >/dev/null; then
continue
fi
address=$(echo “$line” | grep -oE ‘@\[[^ ]+\]’)
address=”${address:2: -1}”
if [ “$address” == “THIS” ]; then
ip=$(getExternalIP)
address=”$ip”
elif [ “$address” == “STATIC” ]; then
continue
else
ip=$(getIP “$address”)
fi
# Fehler beim Auflösen, dann einfach ignorieren
if [ $? -ne 0 ] || [ “$ip” == “” ]; then
continue
fi
old=$(echo “$line” | cut -c 8- | cut -d'”‘ -f1)
# Wenn IP-Adressen übereinstimmen, nichts tun
if [ “$ip” == “$old” ]; then
continue
fi
# Bei Abweichung ersetzen und als geändert markieren
sed -i ‘/’$address’/s/”‘$old'”/”‘$ip'”/g’ “$WHITELIST”
change=1
done <<< $(cat “$WHITELIST”)
# Ist eine Änderung gemacht worden, soll der Crowdsec-Container neu gestartet werden
if [ $change -ne 0 ]; then
docker compose -f “$COMPOSE” down crowdsec && docker compose -f “$COMPOSE” up crowdsec -d –force-recreate
exit $?
fi
exit 0
Das Script z. B. unter /usr/local/bin/crowdsec-whitelist.sh speichern und mit chmod +x /usr/local/bin/crowdsec-whitelist.sh ausführbar machen. Eventuell sudo benutzen. Es wird dann einfach per Cronjob aufgerufen. Da bei jeder Änderung der Crowdsec-Service neu gestartet wird, sucht euch selber eine Zeitspanne zum Aktualisieren aus. Je kürzer, desto genauer, aber je öfter muss auch der Dienst neu gestartet werden. Ein guter Kompromiss ist wohl ihn morgens früh laufen zu lassen, da die Zwangstrennung für eine neue IP bei den meisten in der Nacht ausgeführt wird. Eventuell nochmal alle paar Stunden tagsüber. Das wisst ihr selber am besten. Zum Beispiel:
10 6,9,12,16 * * * /usr/local/bin/crowdsec-whitelist.sh
Da ich bei mir einige Anpassungen gemacht habe, hoffe ich, dass ich hier alles korrekt hier hin kopiert habe. Falls ich etwas falsch ist und es Probleme gibt, gebt bitte kurz Bescheid.
Das Ganze habe ich nur mit IPv4 getestet. Ich weiß nicht, ob es mit IPv6 auch klappt. Da habe ich mir bisher keine Gedanken gemacht.
Ich hoffe, das hilft dem ein oder Anderen.
Viel Spaß damit 🙂
// UPDATE: Einige Fixes und Änderungen am Code vorgenommen, die die Robustheit des Scripts verbessern.
Vorerst vielen Dank für die detaillierten Anleitungen. Ich habe ein Cronjob entwickelt um die IP-Adresse in der Whitelist automatisch zu aktualisieren. Dazu sollte in Zeile 4 die URL zur FritzBox bzw. DynDNS eingetragen werden.
Ist der Pfad noch richtig?
Bei mir kann ich nach obiger Anleitung keine Datei anlegen…
Aber unter diesem Pfad ist wäre es möglich:
/opt/containers/traefik-crowdsec-stack/crowdsec/config/hub/parsers/s02-enrich/crowdsecurity
Ist das bei Euch auch so?
VG Hardy
Gibt es auch eine Lösung, die IP wieder von der Bannliste zu nehmen? Die Anleitung klappt ja nur, wenn man es vorher schon einstellt.
Der Anleitung unter Grundvoraussetzung folgend liegt der Inhalt ja unter /opt/containers/traefik-crowdsec-stack.
Wäre der richtige Ort demzufolge:
/opt/containers/traefik-crowdsec-stack/crowdsec/config/parsers/s02-enrich
?
Hier läge auch schon eine whitelists.yaml. Allerdings als Symlink, der ins nichts führt:
Denn unter /etc/crowdsec habe ich lediglich eine Datei (./bouncers/crowdsec-firewall-bouncer.yaml).
Wie wäre hier nun das korrekte Vorgehen?