CrowdSec auf der OPNsense ist eine feine Sache und erkennt und blockiert standardmäßig bereits gängige Reconnaissance-Angriffe wie z.B. Port-Scanning. Wer aber NGINX als Reverse Proxy auf der OPNsense einsetzt, der möchte eventuell den Schutz auch auf NGINX ausweiten. Hierzu kann man einfach das NGINX-Szenario aus CrowdSec nachinstallieren, und auf den ersten Blick funktioniert danach auch zunächst alles – aber nur auf den ersten Blick.
Spätestens nach ein paar Tagen wird nämlich bei Betrachtung der Logs auffallen, dass anscheinend keine neuen Angriffe geloggt bzw. geblockt werden – ein Neustart von CrowdSec löst dann das Problem, aber wieder nur vorübergehend. Das mag zunächst verwunderlich wirken, wo doch der CrowdSec Daemon ordnungsgemäß läuft – das Problem ist aber eigentlich recht einfach zu finden. Die Kurzfassung: CrowdSec liest die NGINX logs standardmäßig über Symlinks, also quasi Verweise auf die jeweils aktuellen Log-Dateien ein. OPNsense rotiert diese Logdateien jedoch regelmäßig, was dazu führt, dass CrowdSec sozusagen „die Spur verliert“ und nun eine alte oder nicht mehr existierende Log-Datei einliest. Das passiert deshalb, weil CrowdSec zu Beginn dem Symlink zur eigentlichen Logdatei folgt, aber dann nicht bemerkt, wenn die Logdatei rotiert wird. Um das zu beheben, müssen wir ein paar Konfig-Dateien anpassen bzw. anlegen, aber das ist in wenigen Minuten erledigt.
Im Prinzip müssen wir CrowdSec nur mitteilen, dass es periodisch die Symlinks überprüfen oder (noch besser) direkt die konkreten Logdateien einlesen soll. Die Logs, die von der NGINX-Integration in CrowdSec eingelesen werden, stehen standardmäßig in /usr/local/etc/crowdsec/acquis.yaml
. Bei mir sah diese Datei so aus:
filenames:
- /var/log/nginx/*.log
- ./tests/nginx/nginx.log
#this is not a syslog log, indicate which kind of logs it is
labels:
type: nginx
---
filenames:
- /var/log/auth.log
- /var/log/syslog
labels:
type: syslog
---
filenames:
- /var/log/httpd-access.log
- /var/log/httpd-error.log
labels:
type: apache2
Theoretisch könnten wir nun einfach diese Datei bearbeiten, allerdings besteht dann die Gefahr, dass diese Änderungen in Updates wieder überschrieben werden – daher ist es besser, wir legen extra Dateien speziell fürs Einlesen der NGINX-Logs und des Syslogs an, die Apache-Logs brauchen wir auf OPNsense nicht. Wir legen also im Ordner /usr/local/etc/crowdsec/acquis.d/
eine neue Datei mit dem Namen nginx.yaml
an und fügen diesen Inhalt ein:
filenames:
- /var/log/nginx/*access.log
- /var/log/nginx/*error.log
force_inotify: true
poll_without_inotify: true
labels:
type: nginx
Die beiden wichtigen Befehle, die zukünftig verhindern dass CrowdSec die Rotation oder das entstehen neuer Logfiles verpasst, sind force_inotify: true
und poll_without_inotify: true
.
Das gleiche machen wir dann noch für den Syslog-Block, dazu erstellen wir die Datei /usr/local/etc/crowdsec/acquis.d/
syslog.yaml:
filenames:
- /var/log/auth.log
force_inotify: true
poll_without_inotify: true
labels:
type: syslog
/var/log/syslog
brauchen wir nicht, da es in BSD nicht existiert.
Anschließend legen wir die Datei /usr/local/etc/crowdsec/config.yaml.local
an. Diese Datei überlebt Updates und die darin festgelegten Optionen überschreiben die standardmäßige config.yaml
. In diese Datei setzen wir nun folgende Zeilen, um zu verhindern, dass CrowdSec weiterhin die config.yaml
einliest:
crowdsec_service:
acquisition_path: "" # ignore acquis.yaml
acquisition_dir: /usr/local/etc/crowdsec/acquis.d
Jetzt starten wir CrowdSec mit dem Befehl configctl crowdsec reload
neu. Anschließend sollte CrowdSec die acquis.yaml
ignorieren und die Logs über die eben angelegten Dateien einlesen, ohne dabei den Anschluss an rotierte Logs zu verlieren. Um zu testen, dass alles richtig funktioniert, sollten wir die nächste Zeit noch ein Auge auf die CrowdSec Stats haben, wenn wir mit einigem Abstand den Befehl cscli metrics
ausführen, sollte sich die Anzahl der eingelesenen Zeilen bei den einzelnen Logdateien erhöhen. Außerdem sollte CrowdSec nicht mehr nach einigen Tagen aufhören, Logs einzulesen.

Das wars schon! Jetzt sollten eure Selfhosted-Services etwas sicherer sein.