Zusätzliche Absicherung mit Port-Knocking
— letzte Aktualisierung am
460 Wörter, Lesezeit: 3 min
Genug ist genug! Fail2ban funktioniert zwar wunderbar auf meinen Linux-Servern, aber leider sehe ich schon mehrere tausend geblockte IPs im sshd-Jail. Ich möchte daher zusätzlicher Maßnahmen ergreifen und habe mich hierbei für Port-Knocking entschieden. Unter Debian gibt es hierfür das Paket knockd. Installiert. Konfiguriert. Gestartet. Fertig 😌!
sudo apt install knockd
Ich nutze UFW, um die Portfreigaben zu managen. In der UFW-Config wird ein entsprechender Eintrag für SSH angelegt:
# /etc/ufw/applications.d/openssh-server
[OpenSSH]
title = Secure shell server
description = OpenSSH is a free implementation of the Secure Shell protocol
ports = xxx/tcp
Für knockd wird ebenfalls eine Config benötigt:
# /etc/knockd.conf
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 1000, 2000, 3000 # meine ganz private Port-Sequenz :)
seq_timeout = 10
command = /usr/sbin/ufw allow 'OpenSSH'
tcpflags = syn
[closeSSH]
sequence = 3000, 2000, 1000 # meine ganz private Port-Sequenz :)
seq_timeout = 10
command = /usr/sbin/ufw delete allow 'OpenSSH'
tcpflags = syn
Ich habe mich für eine Sequenz von zehn Ports aus dem High-Port-Range (49152 – 65535) entschieden, z. B. 60984, 55971, 50909, 56630, 60859, 53125, 60162, 49719, 62155, 63385. Das ergibt etwa 1.4e+42 Kombinationen 😁. Das sind umgerechnet etwa 2.3 Emol (Examol) Kombinationen. Zur Erinnerung: 1 Mol = 6.02214076e+23 Teilchen = 602 Z (Zeta = Trilliarden) Teilchen.
Knockd aktivieren und starten:
sudo systemctl enable knockd.service && sudo systemctl start knockd.service
Auf meinem lokalen PC habe ich mir zwei kleine Skripte zum Öffnen und Schließen gebaut. Ich nutze aber nur das Skript zum Öffnen, da auf dem Server ein cronjob läuft, der die Verbindung alle fünf Minuten wieder schließt. Das ist auch unproblematisch, da offene Verbindungen gehalten werden.
Öffnen:
#!/bin/sh
# open SSH with port knock
# 500 ms delay between ports
knock -d 500 -v mein.server.de 1000 2000 3000 # meine ganz private Port-Sequenz :)
Schließen:
#!/bin/sh
# close SSH with port knock
# 500 ms delay between ports
knock -d 500 -v mein.server.de 3000 2000 1000 # meine ganz private Port-Sequenz :)
Cronjob:
# /etc/cron.d/knock_close
# +--------- Minute (0-59) | Output Dumper: >/dev/null 2>&1
# | +------- Hour (0-23) | Multiple Values Use Commas: 3,12,47
# | | +----- Day Of Month (1-31) | Do every X intervals: */X -> Example: */15 * * * * Is every 15 minutes
# | | | +--- Month (1 -12) | Aliases: @reboot -> Run once at startup; @hourly -> 0 * * * *;
# | | | | +- Day Of Week (0-6) (Sunday = 0) | @daily -> 0 0 * * *; @weekly -> 0 0 * * 0; @monthly ->0 0 1 * *;
# | | | | | | @yearly -> 0 0 1 1 *;
# * * * * * COMMAND |
*/5 * * * * root /usr/sbin/ufw deny 'OpenSSH'