So verwenden Sie Port Knocking unter Linux (und warum Sie es nicht tun sollten)
Veröffentlicht: 2022-01-29Port Knocking ist eine Möglichkeit, einen Server zu sichern, indem Firewall-Ports geschlossen werden – sogar die, von denen Sie wissen, dass sie verwendet werden. Diese Ports werden bei Bedarf geöffnet, wenn – und nur wenn – die Verbindungsanfrage das geheime Klopfen liefert.
Port Knocking ist ein „geheimes Klopfen“
In den 1920er Jahren, als die Prohibition in vollem Gange war, musste man, wenn man in eine Flüsterkneipe wollte, das geheime Klopfen kennen und es richtig antippen, um hineinzukommen.
Portklopfen ist ein modernes Äquivalent. Wenn Sie möchten, dass Benutzer Zugriff auf Dienste auf Ihrem Computer haben, aber Ihre Firewall nicht für das Internet öffnen möchten, können Sie Port-Knocking verwenden. Es ermöglicht Ihnen, die Ports auf Ihrer Firewall zu schließen, die eingehende Verbindungen zulassen, und sie automatisch öffnen zu lassen, wenn ein vorher festgelegtes Muster von Verbindungsversuchen erfolgt. Die Reihenfolge der Verbindungsversuche fungiert als geheimes Klopfen. Ein weiteres heimliches Klopfen schließt den Hafen.
Port Knocking ist so etwas wie ein Novum, aber es ist wichtig zu wissen, dass es ein Beispiel für Sicherheit durch Unklarheit ist, und dieses Konzept ist grundlegend fehlerhaft. Das Geheimnis, wie man auf ein System zugreift, ist sicher, weil nur die Mitglieder einer bestimmten Gruppe es kennen. Aber sobald dieses Geheimnis gelüftet ist – entweder weil es enthüllt, beobachtet, erraten oder ausgearbeitet wurde – ist Ihre Sicherheit hinfällig. Sie sind besser dran, Ihren Server auf andere, stärkere Weise zu sichern, wie z. B. schlüsselbasierte Anmeldungen für einen SSH-Server.
Die robustesten Ansätze für Cybersicherheit sind vielschichtig, daher sollte Port Knocking vielleicht eine dieser Schichten sein. Je mehr Schichten, desto besser, oder? Man könnte jedoch argumentieren, dass Port Knocking nicht viel (wenn überhaupt) zu einem richtig gehärteten, sicheren System beiträgt.
Cybersicherheit ist ein umfangreiches und kompliziertes Thema, aber Sie sollten Port Knocking nicht als Ihre einzige Verteidigungsform einsetzen.
VERWANDT: So erstellen und installieren Sie SSH-Schlüssel aus der Linux-Shell
Knockd installieren
Um Port Knocking zu demonstrieren, verwenden wir es zur Steuerung von Port 22, dem SSH-Port. Wir verwenden ein Tool namens knockd. Verwenden Sie apt-get
, um dieses Paket auf Ihrem System zu installieren, wenn Sie Ubuntu oder eine andere Debian-basierte Distribution verwenden. Verwenden Sie bei anderen Linux-Distributionen stattdessen das Paketverwaltungstool Ihrer Linux-Distribution.
Geben Sie Folgendes ein:
sudo apt-get installknockd
Wahrscheinlich haben Sie die iptables-Firewall bereits auf Ihrem System installiert, aber Sie müssen möglicherweise das Paket iptables-persistent
installieren. Es übernimmt das automatische Laden gespeicherter iptable
Regeln.
Geben Sie Folgendes ein, um es zu installieren:
sudo apt-get install iptables-persistent
Wenn der IPV4-Konfigurationsbildschirm angezeigt wird, drücken Sie die Leertaste, um die Option „Ja“ zu akzeptieren.
Drücken Sie im IPv6-Konfigurationsbildschirm erneut die Leertaste, um die Option „Ja“ zu akzeptieren und fortzufahren.
Der folgende Befehl weist iptables
an, hergestellte und laufende Verbindungen fortzusetzen. Wir geben jetzt einen weiteren Befehl aus, um den SSH-Port zu schließen.
Wenn jemand per SSH verbunden ist, wenn wir diesen Befehl ausgeben, möchten wir nicht, dass er getrennt wird:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED, RELATED -j ACCEPT
Dieser Befehl fügt der Firewall eine Regel hinzu, die besagt:
- -A : Fügt die Regel an die Firewall-Regeltabelle an. Das heißt, fügen Sie es unten hinzu.
- INPUT : Dies ist eine Regel für eingehende Verbindungen.
- -m conntrack : Firewall-Regeln wirken auf Netzwerkverkehr (Pakete), die den Kriterien in der Regel entsprechen. Der Parameter
-m
veranlasstiptables
, zusätzliche Paketabgleichsmodule zu verwenden – in diesem Fall arbeitet das Modul namensconntrack
mit den Netzwerkverbindungsverfolgungsfunktionen des Kernels zusammen. - –cstate ESTABLISHED, RELATED : Dies gibt den Verbindungstyp an, auf den die Regel angewendet wird, nämlich ESTABLISHED- und RELATED-Verbindungen. Eine hergestellte Verbindung ist eine Verbindung, die bereits besteht. Eine verwandte Verbindung ist eine Verbindung, die aufgrund einer Aktion von einer hergestellten Verbindung hergestellt wird. Vielleicht möchte jemand, der verbunden ist, eine Datei herunterladen; das kann über eine vom Host initiierte neue Verbindung passieren.
- -j ACCEPT : Wenn der Datenverkehr mit der Regel übereinstimmt, springe zum ACCEPT-Ziel in der Firewall. Mit anderen Worten, der Datenverkehr wird akzeptiert und darf die Firewall passieren.
Jetzt können wir den Befehl zum Schließen des Ports ausgeben:
sudo iptables -A INPUT -p tcp --dport 22 -j ABLEHNEN
Dieser Befehl fügt der Firewall eine Regel hinzu, die besagt:
- -A : Fügt die Regel an die Firewall-Regeltabelle an, dh fügt sie ganz unten hinzu.
- INPUT : Diese Regel bezieht sich auf eingehende Verbindungen.
- -p tcp : Diese Regel gilt für Datenverkehr, der das Transmission Control Protocol verwendet.
- –dport 22 : Diese Regel gilt speziell für TCP-Datenverkehr, der auf Port 22 (den SSH-Port) abzielt.
- -j REJECT : Wenn der Datenverkehr mit der Regel übereinstimmt, springe zum REJECT-Ziel in der Firewall. Wenn der Datenverkehr abgelehnt wird, wird er also nicht durch die Firewall zugelassen.
Wir müssen den netfilter-persistent
Daemon starten. Wir können dies mit diesem Befehl tun:
sudo systemctl start netfilter-persistent
Wir wollen, dass netfilter-persistent
einen Speicher- und Neuladezyklus durchläuft, damit es die iptable
Regeln lädt und kontrolliert.
Geben Sie die folgenden Befehle ein:
sudo netfilter-persistent save
sudo netfilter-persistent reload
Sie haben jetzt die Dienstprogramme installiert und der SSH-Port ist geschlossen (hoffentlich ohne die Verbindung von jemandem zu beenden). Jetzt ist es an der Zeit, das geheime Klopfen zu konfigurieren.
Knockd konfigurieren
Es gibt zwei Dateien, die Sie bearbeiten können, um knockd
zu konfigurieren. Die erste ist die folgende knockd
Konfigurationsdatei:
sudo gedit /etc/knockd.conf
Der gedit
-Editor wird mit geladener knockd
Konfigurationsdatei geöffnet.
Wir bearbeiten diese Datei entsprechend unseren Anforderungen. Die Abschnitte, an denen wir interessiert sind, sind „openSSH“ und „closeSSH“. Die folgenden vier Einträge befinden sich in jedem Abschnitt:
- sequence : Die Sequenz von Ports, auf die jemand zugreifen muss, um Port 22 zu öffnen oder zu schließen. Die Standardports sind 7000, 8000 und 9000, um ihn zu öffnen, und 9000, 8000 und 7000, um ihn zu schließen. Sie können diese ändern oder weitere Ports zur Liste hinzufügen. Für unsere Zwecke bleiben wir bei den Standardeinstellungen.
- seq_timeout : Der Zeitraum, innerhalb dessen jemand auf die Ports zugreifen muss, um das Öffnen oder Schließen auszulösen.
- command : Der Befehl, der an die
iptables
-Firewall gesendet wird, wenn die Öffnungs- oder Schließaktion ausgelöst wird. Diese Befehle fügen der Firewall entweder eine Regel hinzu (um den Port zu öffnen) oder entfernen sie (um den Port zu schließen). - tcpflags : Der Pakettyp, den jeder Port in der geheimen Sequenz empfangen muss. Ein SYN-Paket (Synchronisieren) ist das erste in einer TCP-Verbindungsanforderung, die als Drei-Wege-Handshake bezeichnet wird.
Der Abschnitt „openSSH“ kann gelesen werden als „eine TCP-Verbindungsanfrage muss an die Ports 7000, 8000 und 9000 gestellt werden – in dieser Reihenfolge und innerhalb von 5 Sekunden – damit der Befehl zum Öffnen von Port 22 an die Firewall gesendet wird.“
Der Abschnitt „closeSSH“ kann gelesen werden als „eine TCP-Verbindungsanfrage muss an die Ports 9000, 8000 und 7000 gestellt werden – in dieser Reihenfolge und innerhalb von 5 Sekunden – damit der Befehl zum Schließen von Port 22 an die Firewall gesendet wird.“
Die Firewall-Regeln
Die „command“-Einträge in den Abschnitten openSSH und closeSSH bleiben bis auf einen Parameter gleich. So setzen sie sich zusammen:
- -A : Fügt die Regel an das Ende der Firewall-Regelliste an (für den openSSH-Befehl).
- -D : Löscht den Befehl aus der Liste der Firewall-Regeln (für den Befehl closeSSH).
- INPUT : Diese Regel betrifft den eingehenden Netzwerkverkehr.
- -s %IP% : Die IP-Adresse des Geräts, das eine Verbindung anfordert.
- -p : Netzwerkprotokoll; In diesem Fall ist es TCP.
- –dport : Der Zielport; In unserem Beispiel ist es Port 22.
- -j ACCEPT : Springe zum Accept-Ziel innerhalb der Firewall. Mit anderen Worten, lassen Sie das Paket durch die restlichen Regeln fallen, ohne darauf zu reagieren.
Die Knockd-Konfigurationsdatei Edits
Die Änderungen, die wir an der Datei vornehmen, sind unten rot hervorgehoben:
Wir erweitern das „seq_timeout“ auf 15 Sekunden. Das ist großzügig, aber wenn jemand Verbindungsanfragen manuell abfeuert, braucht er möglicherweise so viel Zeit.
Im Abschnitt „openSSH“ ändern wir die Option -A
(append) im Befehl in -I
(insert). Dieser Befehl fügt eine neue Firewall-Regel oben in die Liste der Firewall-Regeln ein. Wenn Sie die Option -A
belassen , wird die Liste der Firewall-Regeln angehängt und ganz unten abgelegt .
Eingehender Datenverkehr wird anhand jeder Firewall-Regel in der Liste von oben nach unten getestet. Wir haben bereits eine Regel, die Port 22 schließt. Wenn also eingehender Datenverkehr anhand dieser Regel getestet wird, bevor er die Regel sieht, die den Datenverkehr zulässt, wird die Verbindung abgelehnt; Wenn es diese neue Regel zuerst sieht, wird die Verbindung zugelassen.
Der Close-Befehl entfernt die von openSSH hinzugefügte Regel aus den Firewall-Regeln. Der SSH-Verkehr wird wieder von der bereits bestehenden Regel „Port 22 ist geschlossen“ abgewickelt.
Nachdem Sie diese Änderungen vorgenommen haben, speichern Sie die Konfigurationsdatei.
VERWANDT: So bearbeiten Sie Textdateien grafisch unter Linux mit gedit
Die Knockd Control File Edits
Die knockd
-Steuerdatei ist insgesamt einfacher. Bevor wir jedoch eintauchen und das bearbeiten, müssen wir den internen Namen für unsere Netzwerkverbindung kennen; Um es zu finden, geben Sie diesen Befehl ein:
IP-Adr
Die Verbindung, die dieser Computer verwendet, um diesen Artikel zu recherchieren, heißt enp0s3
. Notieren Sie sich den Namen Ihrer Verbindung.
Der folgende Befehl bearbeitet die knockd
-Steuerdatei:
sudo gedit /etc/default/knockd
Hier ist die knockd
-Datei in gedit
.
Die wenigen Änderungen, die wir vornehmen müssen, sind rot hervorgehoben:
Wir haben den Eintrag „START_KNOCKD=“ von 0 auf 1 geändert.
Wir haben auch den Hash #
am Anfang des Eintrags „KNOCKD_OPTS=“ entfernt und „eth1“ durch den Namen unserer Netzwerkverbindung, enp0s3
, ersetzt. Wenn Ihre Netzwerkverbindung eth1
ist, werden Sie sie natürlich nicht ändern.
Der Beweis liegt im Pudding
Es ist Zeit zu sehen, ob das funktioniert. Wir starten den knockd
Daemon mit diesem Befehl:
sudo systemctrl startknockd
Jetzt springen wir auf eine andere Maschine und versuchen, eine Verbindung herzustellen. Wir haben das knockd
Tool auch auf diesem Computer installiert, nicht weil wir Port Knocking einrichten wollen, sondern weil das knockd
-Paket ein weiteres Tool namens knock
bereitstellt. Wir werden diese Maschine benutzen, um in unserer geheimen Sequenz zu feuern und für uns zu klopfen.
Verwenden Sie den folgenden Befehl, um Ihre geheime Sequenz von Verbindungsanforderungen an die Ports auf dem Port-Knocking-Host-Computer mit der IP-Adresse 192.168.4.24 zu senden:
Klopfen 192.168.4.24 7000 8000 9000 -d 500
Dies weist knock
an, den Computer mit der IP-Adresse 192.168.4.24 anzusprechen und eine Verbindungsanfrage an die Ports 7000, 8000 und 9000 zu senden, mit einem -d
(Verzögerung) von 500 Millisekunden dazwischen.
Ein Benutzer namens „dave“ stellt dann eine SSH-Anfrage an 192.168.4.24:
ssh [email protected]
Seine Verbindung wird akzeptiert, er gibt sein Passwort ein und seine Remote-Sitzung beginnt. Seine Eingabeaufforderung ändert sich von dave@nostromo
zu dave@howtogeek
. Um sich vom entfernten Computer abzumelden, gibt er Folgendes ein:
Ausfahrt
Seine Eingabeaufforderung kehrt zu seinem lokalen Computer zurück. Er verwendet erneut knock
, und dieses Mal zielt es auf die Ports in umgekehrter Reihenfolge ab, um den SSH-Port auf dem Remote-Computer zu schließen.
Klopfen 192.168.4.24 9000 8000 7000 -d 500
Zugegeben, das war keine besonders fruchtbare Remote-Session, aber sie demonstriert das Öffnen und Schließen des Ports per Port-Knocking und passt in einen einzigen Screenshot.
Also, wie sah das von der anderen Seite aus? Der Systemadministrator auf dem Port-Knocking-Host verwendet den folgenden Befehl, um neue Einträge anzuzeigen, die im Systemprotokoll eingehen:
tail -f /var/log/syslog
- Sie sehen drei openSSH-Einträge. Diese werden ausgelöst, wenn jeder Port vom Remote-Knock-Dienstprogramm angegriffen wird.
- Wenn alle drei Stufen der Triggersequenz erfüllt sind, wird ein Eintrag mit der Aufschrift „SESAM ÖFFNEN“ protokolliert
- Der Befehl zum Einfügen der Regel in die Regelliste von
iptables
wird gesendet. Es erlaubt den Zugriff über SSH auf Port 22 von der spezifischen IP-Adresse des PCs, der das richtige geheime Klopfen gegeben hat (192.168.4.23). - Der Benutzer „dave“ verbindet sich nur für ein paar Sekunden und trennt dann die Verbindung.
- Sie sehen drei closeSSH-Einträge. Diese werden ausgelöst, wenn jeder Port vom Remote-Knock-Dienstprogramm angegriffen wird – es weist den Port-Knock-Host an, Port 22 zu schließen.
- Nachdem alle drei Stufen ausgelöst wurden, erhalten wir erneut die Meldung „SESAM ÖFFNEN“. Der Befehl wird an die Firewall gesendet, um die Regel zu entfernen. (Warum nicht „CLOSE SESAME“, wenn der Port geschlossen wird? Wer weiß?)
Jetzt ist die einzige Regel in der iptables
Regelliste bezüglich Port 22 diejenige, die wir am Anfang eingegeben haben, um diesen Port zu schließen. Port 22 ist also jetzt wieder geschlossen.
Klopf es auf den Kopf
Das ist der Salontrick von Port Knocking. Betrachten Sie es als Ablenkung und tun Sie es nicht in der realen Welt. Oder verlassen Sie sich, wenn es sein muss, nicht darauf als einzige Form der Sicherheit.