Da es eine Rückfrage zu der verlinkten Anleitung in diesem Beitrag bzw. Thema gab, habe ich das mit einem aktuellen Debian nochmal nachgebaut.
Aufbau
Im Grunde wird mit systemd
auf bestimmten Ports gelauscht, die Anfragen an diese Ports über ein einfaches Skript in ein separates Log geschrieben, welches von fail2ban
überwacht wird. Bei einem Match wird die IP-Adresse dauerhaft gesperrt. Zum Großteil basiert dieses Vorgehen weiterhin auf der Anleitung von gehirn-mag.net mit nur ein paar kleinen Anpassungen.
systemd und fail2ban ist auf den meisten Servern bereits vorhanden, d.h. für einen Honeypot ist keine weitere Software notwendig.
- Getestet wurden die nachfolgenden Schritte mit einem frisch installierten Debian 12. Während der Installation wurde „Standard-Systemwerkzeuge“ ausgewählt.
- Wird ein anderes Betriebssystem als Debian verwendet, muss man ggf. Pfade anpassen oder andere Tools verwenden.
- Da mein privater Anschluss nur IPv4 kann, wurden IPv6-spezifische Dinge nicht getestet. Abhängig davon, ob IPv4 und/oder IPv6 verwendet wird, müsste man weitere Anpassungen vornehmen.
- In der Standardinstallation sind net-tools und fail2ban nicht vorinstalliert, daher mit
apt install net-tools fail2ban
nachinstallieren und fail2ban einrichten. - Damit der Honeypot auch Anfragen erhält, müssen die Ports von außen erreichbar sein - u.a. muss eine Portweiterleitung in Router/Firewall eingerichtet sein (ggf. bestehende Firewall-Regeln prüfen).
Wichtig: systemd, fail2ban und ufw sind weit verbreitete Standard-Tools. Sollten Anpassungen notwendig sein oder Probleme auftreten, sollte die erste Anlaufstelle die offizielle Dokumentation des jeweiligen Tools sein. Sollten darüber hinaus noch Fragen auftauchen, lassen sich viele mithilfe einer Suchmaschine beantworten. Der Großteil der Fragen wurden schon mal gestellt und beantwortet. Eine Suchmaschine ist auch bei Fehlermeldungen sehr hilfreich, sodass man meistens das eigentliche Problem und eine passende Lösung findet.
Alle Schritte als root durchführen.
systemd
/etc/systemd/system/honeypot.socket
[Unit]
Description=Honeypot
After=network.target
[Socket]
# fuer IPv4 only
# ListenStream=0.0.0.0:7
# ist standardmaessig IPv6
# kann aber auch IPv4 sein, wenn IPv6 z.B. im Kernel deaktiviert wurde
ListenStream=7
Accept=yes
CollectMode=inactive-or-failed # fehlgeschlagene Verbindungen aus dem Speicher freigegeben
[Install]
WantedBy=multi-user.target
Die ListenStream
-Zeilen enthalten die Portnummern, die als Honeypot verwendet werden. Diese lassen sich beliebig anpassen/erweitern.
Beispiel für eine Socket-Unit mit mehreren Ports
[Unit]
Description=Honeypot
After=network.target
[Socket]
ListenStream=7
ListenStream=20
ListenStream=22
ListenStream=23
ListenStream=115
Accept=yes
CollectMode=inactive-or-failed
[Install]
WantedBy=multi-user.target
Weitere Informationen findet man in der Dokumentation, u.a. eine Erklärung zu CollectMode
It is recommended to set CollectMode=inactive-or-failed for service instances activated via Accept=yes, to ensure that failed connection services are cleaned up and released from memory, and do not accumulate.
/etc/systemd/system/honeypot@.service
[Unit]
Description=Honeypot
After=network.target
[Service]
ExecStart=/usr/local/bin/honeypot.sh %I
StandardInput=socket
StandardOutput=append:/var/log/honeypot/honeypot.log
StandardError=append:/var/log/honeypot/honeypot.log
Restart=on-failure
[Install]
WantedBy=multi-user.target
/usr/local/bin/honeypot.sh
#!/bin/bash
echo "$(date '+%Y-%m-%d %H:%M:%S') connection from $REMOTE_ADDR" >> /var/log/honeypot/honeypot.log
- Skript ausführbar machen (
chmod +x /usr/local/bin/honeypot.sh
). - Log Verzeichnis anlegen (
mkdir /var/log/honeypot/
) - leeres Logfile anlegen, damit fail2ban im nächsten Abscnhitt keine Fehler wirft (
touch /var/log/honeypot/honeypot.log
)
Dienst starten und geöffnete Ports prüfen
systemctl daemon-reload
systemctl enable honeypot.socket
systemctl start honeypot.socket
Hinweis: honeypot@.service
muss nicht aktiviert oder gestartet werden, da diese Datei nur ein Template für Service-Units ist. Die Socket-Unit erstellt daraus dann Service-Units.
Mit netstat -tuln
lässt sich nun prüfen, ob die Ports geöffnet sind:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:7 0.0.0.0:* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*
Der systemd Abschnitt ist damit vollständig. Der oder die Ports sind geöffnet und Anfragen werden geloggt. Damit die Anfragen an den Honeypot auch geblockt werden, ist der nächste Abschnitt relevant.
fail2ban
/etc/fail2ban/filter.d/honeypot.local
[Definition]
datepattern = ^%%Y-%%m-%%d %%H:%%M:%%S
failregex = connection from <HOST>$
ignoreregex =
/etc/fail2ban/jail.d/honeypot.local
[honeypot]
backend = auto
enabled = true
filter = honeypot
logpath = /var/log/honeypot/honeypot.log
bantime = 604800 # = 1 woche
maxretry = 1
banaction = ufw
Abhängig von der übergeordneten Konfiguration (/etc/fail2ban/jail.local
) können einzelne Zeilen auch weggelassen werden. Sollte diese Datei nicht existieren, muss fail2ban noch „eingerichtet“ werden → Suchmaschine nutzen.
fail2ban neu starten
systemctl restart fail2ban.service
Tests
Nachdem nun alles eingerichtet wurde, lässt sich das Ergebnis mit curl
, fail2ban-client status honeypot
und ufw status
prüfen.
Mit einem bleibigen Clienten und bspw. cURL kann man einen Request an den Honeypot senden:
# curl SERVER-IP:PORT
curl 192.168.178.109:7
Am Client sieht das Ergebnis dann so aus:
curl: (56) Recv failure: Die Verbindung wurde vom Kommunikationspartner zurückgesetzt
fail2ban-client status honeypot
Status for the jail: honeypot
|- Filter
| |- Currently failed: 0
| |- Total failed: 1
| `- File list: /var/log/honeypot/honeypot.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 192.168.178.50
ufw status
Status: active
To Action From
-- ------ ----
Anywhere REJECT 192.168.178.50 # by Fail2Ban after 1 attempts against honeypot