Port-Knocking ist eine Methode zum dynamischen Öffnen von Netzwerkports durch "Knocking" (d. h. Verbinden) einer vordefinierten Sequenz von Ports. Dies ist besonders nützlich, um einen offenen Netzwerkport vor dem Port-Scannen zu verbergen, da der betreffende Port geschlossen wird, wenn die Port-Knocking-Sequenz nicht ausgeführt wird. Eine ausreichend lange Port-Knocking-Sequenz ist mit Brute Force praktisch unmöglich:Um beispielsweise (durch Brute Force) eine Kombination von 3 TCP-Ports erfolgreich zu erraten, müsste ein Angreifer versuchen, jede der 281 Billionen möglichen Kombinationen anzuklopfen und danach zu scannen offene Ports nach jeder Port-Knocking-Sequenz. Wie Sie sich wahrscheinlich vorstellen können, würde dies sehr, sehr lange dauern.
Diese Anleitung hilft Ihnen bei der Installation von knockd, einem flexiblen Port-Knocking-Daemon, unter Debian 10. Zu Demonstrationszwecken werden wir ihn so konfigurieren, dass er den SSH-Port verschleiert, obwohl jeder andere Port/Dienst mit diesem Ansatz geschützt werden kann.
Anforderungen
- Ein Server mit Debian 10.
- Root-Zugriff auf Ihren Server.
- Die Umgebungsvariable $EDITOR sollte gesetzt werden.
- Ein zweites System zum Testen.
HINWEIS:Wenn Sie beabsichtigen, Port Knocking zu verwenden, um den SSH-Port zu verschleiern, stellen Sie sicher, dass Sie über eine alternative Zugriffsmethode verfügen (z. B. über die Konsole), die sich als nützlich erweist, wenn Sie sich versehentlich aussperren.
Überprüfen Sie vor der Installation von knockd den Namen der öffentlichen Netzwerkschnittstelle Ihres Systems mit dem folgenden Befehl:
ip link show | grep -v lo
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
Notieren Sie sich den Schnittstellennamen (in diesem Fall ens18). Es wird später benötigt.
Schritt 1:Knockd installieren
knockd ist ein Port-Knocking-Daemon, der auf Verbindungen lauscht und Ports entsprechend öffnet. Wir werden knockd mit iptables-Regeln verwenden, um Port-Knocking zu implementieren. Installieren Sie die erforderlichen Pakete wie folgt:
apt update apt install knockd iptables-persistent
Schritt 2:Knockd-Konfiguration
Knockd verwendet eine einzige Konfigurationsdatei, /etc/knockd.conf, um Klopfsequenzen und andere Parameter zu definieren. Es gibt zwei praktische Betriebsarten. Der erste erfordert eine einzelne Klopfsequenz, um den vordefinierten Port zu öffnen und zu schließen, während der andere separate Öffnungs- und Schließsequenzen verwendet. Wir werden Ersteres verwenden, da es weniger Benutzerinteraktion erfordert.
Sichern Sie zuerst die vorhandene Konfigurationsdatei:
mv /etc/knockd.conf /etc/knockd.conf.bak
Zweitens öffnen Sie die Konfigurationsdatei in Ihrem Texteditor:
$EDITOR /etc/knockd.conf
Und geben Sie die unten gezeigte Konfiguration ein:
(Ersetzen Sie ens18 durch den Namen Ihrer Netzwerkschnittstelle.)
[options] UseSyslog Interface = ens18 [SSH] sequence = 1000,2000,3000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT cmd_timeout = 20
Dadurch wird knockd angewiesen, den Datenverkehr zu Port 22 nach Erhalt der korrekten Klopfsequenz (in diesem Fall 1000,2000,3000) zu aktivieren und den Datenverkehr nach einer Verzögerung von 20 Sekunden wieder zu deaktivieren. SSH-Verbindungen werden daher nur während dieses 20-Sekunden-Fensters akzeptiert.
Als nächstes aktivieren Sie knockd, indem Sie die Datei /etc/default/knockd:
bearbeiten$EDITOR /etc/default/knockd
Und setze START_KNOCKD auf 1:
START_KNOCKD=1
Speichern Sie die Datei und beenden Sie sie. Wir werden auch die systemd-Unit für knockd modifizieren. Erstellen Sie dazu eine neue Unit-Datei, um die Standardeinstellung zu überschreiben:
$EDITOR /etc/systemd/system/knockd.service
Und fügen Sie Folgendes ein:
[Unit] Description=Port-Knock Daemon After=network.target Requires=network.target Documentation=man:knockd(1) [Service] EnvironmentFile=-/etc/default/knockd ExecStartPre=/usr/bin/sleep 1 ExecStart=/usr/sbin/knockd $KNOCKD_OPTS ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed Restart=always SuccessExitStatus=0 2 15 ProtectSystem=full CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN [Install] WantedBy=multi-user.target
Verwenden Sie dann den folgenden Befehl, um die neue Unit zu laden und zu aktivieren:
systemctl daemon-reload systemctl enable --now knockd.service
Schritt 3:Firewall-Regeln
An diesem Punkt ist Knockd bereit, aber der gesamte Datenverkehr wird standardmäßig durch die Firewall ermöglicht. Wir werden Firewall-Regeln erstellen, um den Zugriff auf Port 22/tcp zu verweigern.
Die folgenden Befehle sorgen dafür, dass bestehende Verbindungen nicht unterbrochen werden.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Das Folgende sind Regeln zum Beenden von Verbindungen zu Port 22/tcp:
iptables -A INPUT -p tcp --destination-port 22 -j DROP ip6tables -A INPUT -p tcp --destination-port 22 -j DROP
Speichern Sie dann die aktuellen Regelketten für die Persistenz über Neustarts hinweg:
iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6
Schritt 4:Testen
Versuchen Sie von einem anderen System aus, eine neue SSH-Sitzung zu Ihrem Server zu starten. Sie sollten keine Verbindung herstellen können. Um die Klopfsequenz auszuführen, können verschiedene Tools verwendet werden, obwohl wir mit Knock demonstrieren werden, dem Klopf-Client, der in Knockd enthalten ist. Installieren Sie das knockd-Paket wie in Schritt 1 gezeigt auf einem anderen System und führen Sie dann die Befehle aus:
knock server_ip_address 1000 2000 3000 ssh [email protected]_ip_address
Die SSH-Verbindung sollte nun erfolgreich sein.
Alternative Konfiguration
Knockd kann alternativ so konfiguriert werden, dass zwei unterschiedliche Sequenzen zum Öffnen und Schließen von Netzwerkports erforderlich sind. Dies ist nützlich, wenn Sie Ports für längere Zeit offen halten möchten. Um Knockd auf diese Weise zu konfigurieren, öffnen Sie seine Konfigurationsdatei:
$EDITOR /etc/knockd.conf
Und ersetzen Sie die vorhandene Konfiguration durch Folgendes:
[options] UseSyslog Interface = your_interface [openSSH] sequence = 1000,2000,3000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT [closeSSH] sequence = 3000,2000,1000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
Starten Sie dann den Dienst neu, um die neue Konfiguration zu laden:
systemctl restart knockd.service
Schlussfolgerung
Knockd kann eine effektive Lösung für Brute-Force-Angriffe sein, die bei SSH und anderen Diensten sehr häufig vorkommen. Auch wenn systemd Knockd neu startet, wenn es fehlschlägt, sollten Sie immer eine Sicherungsmethode für den Zugriff auf Ihren Server haben, wenn Sie Port-Knocking verwenden, um den SSH-Port zu verbergen.