So verwenden Sie Port Knocking unter Linux (und warum Sie es nicht tun sollten)

Port 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 Verbot war in vollem Gange, wenn man in eine einsteigen wollte Speakeasy, Sie mussten das geheime Klopfen kennen und richtig ausklopfen, 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-Klopfen verwenden. Es ermöglicht Ihnen, die Ports Ihrer Firewall zu schließen, die eingehende Verbindungen zulassen, und sie automatisch öffnen zu lassen, wenn ein vorher festgelegtes Muster von Verbindungsversuchen unternommen wird. Die Abfolge der Verbindungsversuche fungiert als das geheime Klopfen. Ein weiteres heimliches Klopfen schließt den Hafen.

Das Klopfen von Ports ist so etwas wie eine Neuheit, aber es ist wichtig zu wissen, dass es ein Beispiel dafür ist Sicherheit durch Dunkelheit, und dieses Konzept ist grundlegend fehlerhaft. Das Geheimnis, wie man auf ein System zugreift, ist sicher, weil es nur diejenigen in einer bestimmten Gruppe kennen. Aber sobald dieses Geheimnis gelüftet ist – sei es, weil es enthüllt, beobachtet, erraten oder herausgearbeitet wurde – ist Ihre Sicherheit hinfällig. Es ist besser, Ihren Server auf andere, stärkere Weise zu sichern, z. B. durch schlüsselbasierte Anmeldungen für einen SSH-Server.

Die robustesten Ansätze für die Cybersicherheit sind vielschichtig, daher sollte Port Knocking vielleicht eine dieser Schichten sein. Je mehr Schichten, desto besser, oder? Sie könnten jedoch argumentieren, dass Port-Klopfen nicht viel (wenn überhaupt) zu einem ordnungsgemäß gehärteten, sicheren System beiträgt.

Cybersicherheit ist ein umfangreiches und kompliziertes Thema, aber Sie sollten Port-Klopfen nicht als einzige Verteidigungsmaßnahme verwenden.

Knockd installieren

Um das Port-Klopfen zu demonstrieren, verwenden wir es, um Port 22 zu steuern, den SSH-Port. Wir verwenden ein Werkzeug 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 install knockd

Das hast du wahrscheinlich schon iptables-Firewall 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 die Leertaste, um die zu akzeptieren

Drücken Sie im IPv6-Konfigurationsbildschirm erneut die Leertaste, um die Option „Ja“ zu akzeptieren und fortzufahren.

Drücken Sie die Leertaste, um die zu akzeptieren

Der folgende Befehl weist iptables an, die Fortsetzung bestehender und laufender Verbindungen zuzulassen. 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 abgeschnitten wird:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Dieser Befehl fügt der Firewall eine Regel hinzu, die besagt:

-A: Hängen Sie 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 sich auf den Netzwerkverkehr (Pakete) aus, der den Kriterien in der Regel entspricht. Der Parameter -m bewirkt, dass iptables zusätzliche Packet-Matching-Module verwendet – in diesem Fall arbeitet das Modul namens conntrack mit den Netzwerkverbindungs-Tracking-Funktionen des Kernels.
–cstate ESTABLISHED,RELATED: Dies gibt den Verbindungstyp an, für den die Regel gilt, nämlich ESTABLISHED- und RELATED-Verbindungen. Eine hergestellte Verbindung ist eine Verbindung, die bereits im Gange ist. Eine verwandte Verbindung ist eine Verbindung, die aufgrund einer Aktion einer hergestellten Verbindung hergestellt wird. Vielleicht möchte jemand, der verbunden ist, eine Datei herunterladen; Dies kann über eine neue Verbindung geschehen, die vom Host initiiert wurde.
-j ACCEPT: Wenn der Datenverkehr mit der Regel übereinstimmt, springen Sie zum ACCEPT-Ziel in der Firewall. Mit anderen Worten, der Verkehr wird akzeptiert und darf die Firewall passieren.

  So speichern Sie DVDs und Blu-rays auf Ihrem Linux-PC

Jetzt können wir den Befehl zum Schließen des Ports ausgeben:

sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

Dieser Befehl fügt der Firewall eine Regel hinzu, die besagt:

-A: Hängen Sie die Regel an die Firewall-Regeltabelle an, dh fügen Sie sie unten hinzu.
INPUT: Diese Regel betrifft eingehende Verbindungen.
-p tcp: Diese Regel gilt für Verkehr, 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 Verkehr mit der Regel übereinstimmt, springe zum REJECT-Ziel in der Firewall. Wenn der Datenverkehr also abgelehnt wird, wird er 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 durchläuft ein Speicher- und Ladezyklus, so lädt und kontrolliert es die iptable-Regeln.

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 zu beenden). Jetzt ist es an der Zeit, das geheime Klopfen zu konfigurieren.

Knockd . konfigurieren

Es gibt zwei Dateien, die Sie bearbeiten, um Knockd zu konfigurieren. Die erste ist die folgende geklopfte Konfigurationsdatei:

sudo gedit /etc/knockd.conf

Der gedit-Editor wird mit geladener Knockd-Konfigurationsdatei geöffnet.

Wir werden diese Datei entsprechend unseren Anforderungen bearbeiten. Die Abschnitte, die uns interessieren, sind „openSSH“ und „closeSSH“. Die folgenden vier Einträge befinden sich in jedem Abschnitt:

Sequenz: Die Reihenfolge der 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 der Liste weitere Ports hinzufügen. Für unsere Zwecke bleiben wir bei den Standardeinstellungen.
seq_timeout: Die Zeitspanne, innerhalb derer jemand auf die Ports zugreifen muss, um das Öffnen oder Schließen auszulösen.
Befehl: Der Befehl, der an die iptables-Firewall gesendet wird, wenn die Aktion zum Öffnen oder Schließen 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 (Synchronize) Paket ist das erste in a TCP Verbindungsanfrage, genannt a Drei-Wege-Handshake.

  So installieren Sie Arch Linux

Der Abschnitt „openSSH“ kann gelesen werden als „eine TCP-Verbindungsanfrage muss an die Ports 7000, 8000 und 9000 erfolgen – 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: Hängen Sie die Regel am Ende der Firewall-Regelliste an (für den openSSH-Befehl).
-D: Löschen Sie den Befehl aus der Firewall-Regelliste (für den Befehl closeSSH).
INPUT: Diese Regel betrifft 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: Springt zum Akzeptanzziel innerhalb der Firewall. Mit anderen Worten, lassen Sie das Paket die restlichen Regeln durchlaufen, ohne darauf zu reagieren.

Die geklopften Konfigurationsdatei-Bearbeitungen

Die Änderungen, die wir an der Datei vornehmen, sind unten rot markiert:

Wir verlängern 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 oben in der Liste der Firewall-Regeln eine neue Firewall-Regel ein. Wenn Sie die Option -A verlassen, wird die Liste der Firewall-Regeln angehängt und ganz unten platziert.

Eingehender Datenverkehr wird von oben nach unten gegen jede Firewall-Regel in der Liste 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 Befehl close 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.

Die geklopften Control File Edits

Die Klopfsteuerdatei ist insgesamt einfacher. Bevor wir jedoch eintauchen und das bearbeiten, müssen wir den internen Namen unserer Netzwerkverbindung kennen; Um es zu finden, geben Sie diesen Befehl ein:

ip addr

Der

Die Verbindung, die dieses Gerät verwendet, um diesen Artikel zu recherchieren, heißt enp0s3. Notieren Sie sich den Namen Ihrer Verbindung.

Der folgende Befehl bearbeitet die geklopfte Steuerdatei:

sudo gedit /etc/default/knockd

Hier ist die geklopfte 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.

Außerdem haben wir die Raute # 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.

  Wie man The Room unter Linux spielt

Der Beweis liegt im Pudding

Es ist Zeit zu sehen, ob das funktioniert. Wir starten den Klopf-Daemon mit diesem Befehl:

sudo systemctrl start knockd

Jetzt springen wir auf einen anderen Computer 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 anderes Tool namens Knock bietet. Wir werden diese Maschine benutzen, um in unserer geheimen Sequenz zu schießen und das Klopfen für uns zu erledigen.

Verwenden Sie den folgenden Befehl, um Ihre geheime Folge von Verbindungsanfragen an die Ports auf dem Port-Knocking-Host-Computer mit der IP-Adresse 192.168.4.24 zu senden:

knock 192.168.4.24 7000 8000 9000 -d 500

Dies weist Knock an, den Computer mit der IP-Adresse 192.168.4.24 anzuvisieren und eine Verbindungsanfrage an die Ports 7000, 8000 und 9000 abzufeuern, 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 [email protected] zu [email protected] Um sich vom Remote-Computer abzumelden, gibt er Folgendes ein:

exit

Seine Eingabeaufforderung kehrt zu seinem lokalen Computer zurück. Er verwendet erneut Klopfen, und dieses Mal zielt es auf die Ports in umgekehrter Reihenfolge ab, um den SSH-Port auf dem Remote-Computer zu schließen.

knock 192.168.4.24 9000 8000 7000 -d 500

Zugegeben, das war keine besonders fruchtbare Remote-Session, aber es demonstriert das Öffnen und Schließen des Ports per Port-Klopfen 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 angesteuert wird.
Wenn alle drei Phasen der Triggersequenz erfüllt sind, wird ein Eintrag mit der Aufschrift „SESAM ÖFFNE DICH,” ist protokolliert
Der Befehl zum Einfügen der Regel in die iptables-Regelliste wird gesendet. Es erlaubt den Zugriff über SSH auf Port 22 von der spezifischen IP-Adresse des PCs, der den richtigen geheimen Klopf gegeben hat (192.168.4.33).
Der Benutzer „dave“ verbindet sich nur für wenige Sekunden und trennt dann die Verbindung.
Sie sehen drei closeSSH-Einträge. Diese werden ausgelöst, wenn jeder Port vom Remote-Knock-Dienstprogramm angesteuert wird – es weist den Port-Knocking-Host an, Port 22 zu schließen.
Nachdem alle drei Stufen ausgelöst wurden, erhalten wir erneut die Meldung „OPEN SESAME“. Der Befehl wird an die Firewall gesendet, um die Regel zu entfernen. (Warum nicht „SESAME SCHLIESSEN“, wenn der Hafen 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 nun wieder geschlossen.

Schlag 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, wenn es sein muss, verlassen Sie sich nicht darauf, dass es Ihre einzige Form der Sicherheit ist.