Blacklistd ist ein Daemon der auf Sockets lauscht, um Benachrichtigungen von anderen Daemons über fehlgeschlagene oder erfolgreiche Verbindungsversuche zu erhalten. Dieser Daemon wird häufig verwendet, um zu viele Verbindungsversuche auf offenen Ports zu blockieren. Ein Beispiel ist SSH, das viele Anfragen von Bots oder Skripten erhält, die versuchen, Passwörter zu erraten und Zugriff zu erhalten. Mit Hilfe von blacklistd kann der Daemon die Firewall benachrichtigen, eine Filterregel zu erstellen, um übermäßige Verbindungsversuche einer einzigen Quelle nach einer Reihe von Versuchen zu blockieren. Blacklistd wurde ursprünglich auf NetBSD entwickelt und erschien dort in der Version 7. FreeBSD 11 hat blacklistd von NetBSD importiert.
In diesem Kapitel wird die Einrichtung und Konfiguration von blacklistd besprochen. Sie finden aber auch Beispiele für die Verwendung von blacklistd. Sie sollten allerdings mit grundlegenden Firewall-Konzepten wie Filterregeln vertraut sein. Weitere Informationen finden Sie im Kapitel Firewalls. In diesen Beispielen wird PF benutzt, aber auch andere unter FreeBSD verfügbare Firewalls sollten in der Lage sein mit blacklistd zusammen zu arbeiten.
Die Konfiguration für blacklistd wird in
blacklistd.conf(5) gespeichert. Um das Laufzeitverhalten
von blacklistd zu beeinflussen, sind verschiedene
Kommandozeilenoptionen verfügbar. Die permanente
Konfiguration über Neustarts hinweg sollte in
/etc/blacklistd.conf
gespeichert
werden. Um den Daemon während des Systemstarts zu aktivieren,
fügen Sie eine Zeile blacklistd_enable
in
/etc/rc.conf
hinzu:
#
sysrc blacklistd_enable=yes
Sie können den Daemon auch manuell starten:
#
service blacklistd start
Die Regeln für blacklistd werden in blacklistd.conf(5) mit einem Eintrag pro Zeile konfiguriert. Jede Regel enthält ein Tupel, das durch Leerzeichen oder Tabulator getrennt ist. Eine Regel gilt entweder für einen lokalen oder einen entfernten Rechner.
Ein typischer Eintrag für eine lokale Regel in
/etc/blacklistd.conf
sieht wie
folgt aus:
[local] ssh stream * * * 3 24h
Alle Regeln, die dem Abschnitt
[local]
folgen, werden als lokale Regeln
behandelt, die für den lokalen Rechner gelten. In einem
[remote]
-Abschnitt gelten alle Regeln für
entfernte Maschinen.
Die sieben Felder einer Regel werden entweder durch
Tabulator oder Leerzeichen getrennt. Die ersten vier Felder
identifizieren den Netzwerkverkehr, welcher geblockt werden
soll. Die drei folgenden Felder definieren das Verhalten
von blacklistd. Wildcards werden mit einem Sternchen
(*
) gekennzeichnet und stimmen mit allen
anderen in diesem Feld überein. Das erste Feld definiert
den Standort. In den lokalen Regeln sind dies die Ports.
Die Syntax ist wie folgt:
[address
|interface
][/mask
][:port
]
Adressen können als IPv4 im numerischen Format oder IPv6
in eckigen Klammern angegeben werden. Ebenfalls kann der
Name der Schnittstelle wie
verwendet
werden.em0
Im zweiten Feld wird der Socket-Typ definiert.
TCP-Sockets sind vom Typ stream
,
wohingegen UDP als dgram
bezeichnet wird.
Das obige Beispiel verwendet TCP, weil SSH dieses Protokoll
benutzt.
Im dritten Feld kann ein Protokoll definiert werden.
Die folgenden Protokolle können verwendet werden:
tcp
, udp
,
tcp6
, udp6
oder
numerisch. Eine Wildcard, wie im Beispiel, wird
typischerweise verwendet, um alle Protokolle abzubilden, es
sei denn, es gibt einen Grund, den Verkehr nach einem
bestimmten Protokoll zu differenzieren.
Im vierten Feld wird der effektive Benutzer oder Eigentümer des Daemon-Prozesses definiert, welcher das Ereignis meldet. Hier kann der Benutzer oder die UID sowie eine Wildcard verwendet werden (siehe Beispiel oben).
Der Name der Firewallregel wird im fünften Feld
definiert. In der Voreinstellung setzt blacklistd
alle geblockten Pakete unter einen pf-Anker namens
blacklistd
in
pf.conf
wie folgt:
anchor "blacklistd/*" in on $ext_if block in pass out
Für separate Blacklists kann in diesem Feld ein
Ankername benutzt werden. In anderen Fällen genügt eine
Wildcard. Ein Name mit vorangestelltem Bindestrich
(-
) bedeutet, das ein Anker mit dem
voreingestellten Regelnamen verwendet werden sollte. Ein
modifiziertes Beispiel von oben mit dem Bindestrich würde
so aussehen:
ssh stream * * -ssh 3 24h
Mit einer solchen Regel werden alle neuen
Blacklistregeln zu einem Anker namens
blacklistd-ssh
hinzugefügt.
Um ganze Subnetze für eine einzelne Regelverletzung zu
blockieren, kann ein /
im Regelnamen
benutzt werden. Dadurch wird der verbleibende Teil des
Namens als Maske interpretiert, die auf die in der Regel
angegebene Adresse angewendet wird. Diese Regel würde
beispielsweise jede Adresse blockieren, die an
/24
angrenzt:
22 stream tcp * */24 3 24h
Es ist wichtig, hier das richtige Protokoll anzugeben.
IPv4 und IPv6 behandeln /24
unterschiedlich, deshalb kann *
im
dritten Feld für diese Regel nicht benutzt werden.
Diese Regel bewirkt, dass, wenn ein Rechner in diesem Netzwerk wegen seines Verhaltens blockiert wird, auch alle anderen Rechner aus diesem Netzwerk blockiert werden.
Das sechste Feld, genannt nfail
, legt
die Anzahl der Anmeldeversuche fest, die erforderlich sind,
um die betreffende IP auf die Blacklist zu setzen. Eine
Wildcard an dieser Stelle bedeutet, dass niemals geblockt
wird. Im obigen Beispiel ist eine Anzahl von 3 definiert,
was bedeutet, dass die IP nach drei fehlgeschlagenen
Anmeldeversuchen über SSH
gesperrt wird.
Das letzte Feld in der Regel gibt an, wie lange ein
Rechner auf der Blacklist steht. Die Standardeinheit ist
Sekunden, aber Suffixe wie m
(Minuten),
h
(Stunden) und d
(Tage) können auch angegeben werden.
Die Regel im Beispiel besagt, dass nach dreimaliger
Authentifizierung über SSH eine
neue PF-Regel für diesen Rechner angelegt wird. Beim
Überprüfen der Regeln werden zuerst lokale Regeln, von sehr
spezifisch bis am wenigsten spezifisch, geprüft. Wenn eine
Übereinstimmung auftritt, werden die
remote
-Regeln angewendet und die Felder
name
, nfail
und
disable
werden durch die entsprechende
remote
-Regel geändert.
Mit Remote-Regeln wird das Verhalten von blacklistd, in Abhängigkeit vom aktuell ausgewerteten Remote-Rechner, festgelegt. Die einzelnen Felder einer Remote-Regel sind identisch mit den Feldern einer lokalen Regel. Der einzige Unterschied besteht darin, wie blacklistd sie verwendet. Zur besseren Verständlichkeit wird folgende Regel benutzt:
[remote] 203.0.113.128/25 * * * =/25 = 48h
Das Adressfeld kann eine IP-Adresse (entweder v4 oder v6), einen Port oder beides beinhalten. Dies ermöglicht es, wie in diesem Beispiel, spezielle Regeln für einen bestimmten entfernten Adressbereich festzulegen. Die Felder für den Socket-Typ, Protokoll und Besitzer werden genauso wie in den lokalen Regeln interpretiert.
Die Felder für den Namen sind jedoch unterschiedlich.
Das Gleichheitszeichen (=
) in einer
Remote-Regel weist blacklistd an, den Wert aus der
entsprechenden lokalen Regel zu verwenden. Das bedeutet,
dass der Eintrag der Firewall-Regel übernommen und das
Präfix /25
(eine
Netzmaske von 255.255.255.128
) hinzugefügt
wird. Wenn eine Verbindung aus diesem Adressbereich
geblockt wird, ist das gesamte Subnetz betroffen. Ein
PF-Ankername kann auch hier verwendet werden. In diesem
Fall fügt blacklistd Regeln für diesen Adressbereich dem
Namen des Ankers hinzu. Die Standardtabelle wird verwendet,
wenn eine Wildcard angegeben wird.
Für eine Adresse kann im Feld nfail
die Anzahl von Fehlversuchen definiert werden. Dies ist
nützlich für Ausnahmen, um weniger strenge Anwendungen zu
ermöglichen, oder um Anmeldeversuche ein wenig nachsichtiger
zu gestalten. Die Sperrung wird aufgehoben, wenn im
sechsten Feld eine Wildcard benutzt wird.
Remote-Regeln ermöglichen eine strengere Durchsetzung der Beschränkungen bei Anmeldeversuchen im Vergleich zu Anmeldeversuchen die aus dem lokalen Netzwerk kommen.
Es gibt einige Softwarepakete in FreeBSD, die die
Funktionalität von blacklistd nutzen können. Die beiden
bekanntesten sind ftpd(8) und sshd(8). Beide
Programme nutzen blacklistd, um übermäßige Verbindungsversuche
zu unterbinden. Um blacklistd im SSH-Daemon zu aktivieren,
muss folgend Zeile in
/etc/ssh/sshd_config
hinzugefügt
werden:
UseBlacklist yes
Damit die Änderungen wirksam werden, muss sshd im Anschluss neu gestartet werden.
Für ftpd(8) wird blacklistd mit dem Schalter
-B
aktiviert. Entweder in
/etc/inetd.conf
oder in
/etc/rc.conf
:
ftpd_flags="-B"
Das ist alles, was benötigt wird, damit diese Programme mit blacklist kommunizieren.
Blacklistd stellt dem Benutzer das Verwaltungswerkzeug
blacklistctl(8) zur Verfügung. Es zeigt blockierte
Adressen und Netzwerke an, die nach den in
blacklistd.conf(5) definierten Regeln auf der Blacklist
stehen. Um die Liste der aktuell blockierten Rechner
anzuzeigen, benutzen Sie dump
zusammen mit
der Option -b
:
#
blacklistctl dump -b
address/ma:port id nfail last access 213.0.123.128/25:22 OK 6/3 2019/06/08 14:30:19
Dieses Beispiel zeigt, dass es sechs von drei erlaubten
Anmeldeversuchen auf Port 22 aus dem Adressbereich 213.0.123.128/25
gab. Es sind
mehr Versuche aufgelistet, als erlaubt sind, da SSH es einem
Client erlaubt, mehrere Anmeldungen über eine einzige
TCP-Verbindung zu tätigen. Eine derzeit laufende Verbindung
wird nicht von blacklistd unterbunden. Der letzte
Verbindungsversuch ist in der letzten Spalte der Ausgabe
aufgeführt.
Um die verbleibende Zeit zu sehen, die sich dieser Rechner
auf der Blacklist befindet, fügen Sie -r
zum
vorherigen Befehl hinzu:
#
blacklistctl dump -br
address/ma:port id nfail remaining time 213.0.123.128/25:22 OK 6/3 36s
In diesem Beispiel bleiben noch 36 Sekunden, bis dieser Rechner nicht mehr blockiert wird.
Manchmal ist es notwendig, einen Rechner aus der Blocklist
zu entfernen, bevor die verbleibende Zeit abgelaufen ist.
Leider bietet blacklistd keine Möglichkeit dies zu tun. Es
ist jedoch möglich, die Adresse mit pfctl
aus der PF-Tabelle zu entfernen. Für den blockierten Port
gibt es einen untergeordneten Anker innerhalb des definierten
blacklistd-Ankers in /etc/pf.conf
. Wenn
es beispielsweise einen untergeordneten Anker zum Blockieren
von Port 22 gibt, wird dieser als
blacklistd/22
bezeichnet. In diesem
untergeordneten Anker befindet sich eine Tabelle, die die
blockierten Adressen enthält. Diese Tabelle wird Port
genannt, gefolgt von der Portnummer. In diesem Beispiel würde
es port22
heißen. Mit diesen Informationen
und pfctl(8) ist es nun möglich, alle geblockten Adressen
anzuzeigen:
#
pfctl -a
... 213.0.123.128/25 ...blacklistd/22
-tport22
-T show
Nachdem Sie die entsprechende Adresse ermittelt wurde, kann sie mit folgendem Befehl aus der Liste entfernt werden:
#
pfctl -a
blacklistd/22
-T delete213.0.123.128/25
Die Adresse ist nun aus PF entfernt, erscheint aber immer
noch in der Liste von blacklistctl
, da
dieser keine Kenntnis von Änderungen an PF hat. Der Eintrag
in blacklist's Datenbank wird irgendwann ablaufen und dann aus
der Ausgabe entfernt werden. Der Eintrag wird wieder
hinzugefügt, falls der Rechner erneut gegen eine der Regeln
von blacklistd verstößt.
Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an
<de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an
<de-bsd-translators@de.FreeBSD.org>.