Good to Know Database

openSUSE 10.2: Port Knocking


1. Einleitung

Port Knocking ist eine Methode um Ports in der Firewall für einen oder mehrere Clients zu öffnen. Durch festgelegte Portanfragen welche der Port-Knock-Server überwacht, kann man einen Port öffnen und auch wieder schließen. Neben dem Port-Knock-Server benötigt man auf dem Server iptables.

Im folgenden Tutorial möchte ich Ihnen zeigen wie Sie unter openSUSE 10.2 Port Knocking einrichten und verwenden können.

2. Installation und Konfiguration von knockd

Bevor mit der Konfiguration begonnen werden kann, müssen Sie das Paket knockd auf dem Server installieren.

opensuse:~ # yast -i knockd

Nach der Installation müssen Sie noch einige Änderungen an der Konfigurationsdatei knockd.conf vornehmen.

opensuse:~ # mcedit /etc/knockd.conf

Im Options-Abschnitt finden Sie die Option UseSyslog. Dadurch werden alle Meldungen vom Knock-Daemon in das Logfile /var/log/messages geschrieben. Wir wollen aber wegen der Übersichtlichkeit ein separates Logfile verwenden. Dazu ersetzen Sie die Option UseSyslog durch folgende Zeile.

logfile = /var/log/knockd.log

Sollten Sie mehrere Netzwerkkarten in Ihrem Server haben, sollten Sie noch das Interface angeben auf welchem später die Klopfzeichen ankommen werden.
Standardmäßig wird eth0 verwendet.

interface = eth0

In der Beispiel-Konfiguration von knockd ist bereits ein Abschnitt für SSH eingetragen.
Mit der Option sequence geben Sie die Portnummern und die Reihenfolge für die Klopfzeichen an. Diese sollten Sie für den regulären Einsatz abändern und wenn nötig auch erweitern. Zum Testen verwenden wir allerdings die Standardeinstellung.
Sollten Sie hinter der Portnummer kein Protokoll angeben, wird automatisch TCP verwendet.

[opencloseSSH]
    sequence      = 2222:udp,3333:tcp,4444:udp

Die nächste Option gibt den Timeout für die Klopfsequenz in Sekunden an.

    seq_timeout   = 15

Mit tcpflags können Sie TCP-Pakete welche nicht die angegebenen Flags besitzen ausfiltern. Entfernen Sie deshalb das Flag ack und das dazugehörige Komma.

    tcpflags      = syn,ack

Nun kommen wir zu der Firewallregel welche bei erfolgreicher Klopfsequenz eingetragen wird. Da die Pfadangabe zu iptables nicht komplett ist, sollten Sie diese ergänzen. Weiterhin sollte man die Option -A, welche die neue Regel an das Ende der Liste mit den Firewallregeln stellt, durch -I ersetzen. Somit kann eine bereits bestehende Regel nicht die neue Regel beeinflussen. Durch die Option -s %ip% wird der Zugriff nur der IP-Adresse gewährt von welcher die Portanfrage gesendet wurde.

    start_command = /sbin/iptables -A INPUT -s %ip% -p tcp --dport ssh -j ACCEPT

Die abgeänderte Zeile sieht dann wie folgt aus.

    start_command = /usr/sbin/iptables -I INPUT -s %ip% -p tcp --dport ssh -j ACCEPT

Damit man auch eine SSH-Verbindung zum Server aufbauen kann, sollte der Port für eine kurze Zeit geöffnet bleiben. Dieses Zeitlimit geben Sie mit der Option cmd_timeout in Sekunden an.

    cmd_timeout   = 10

Nach diesem Timeout wird der Port wieder geschlossen. Dazu dient die folgende Zeile bei welcher Sie ebenfalls den Pfad vervollständigen sollten.

    stop_command  = /usr/sbin/iptables -D INPUT -s %ip% -p tcp --dport ssh -j ACCEPT

Nachdem Sie die Konfiguration angepasst haben, könnten Sie bereits knockd starten. Allerdings erhalten Sie dann eine Fehlermeldung dass die Datei /etc/sysconfig/knockd nicht existiert. Diese können Sie mit dem folgenden Befehl erzeugen.

opensuse:~ # touch /etc/sysconfig/knockd

Bevor Sie jetzt allerdings knockd starten, sollten Sie überprüfen ob bereits eine Regel für den SSH-Port eingetragen ist.

opensuse:~ # iptables -L | grep ssh

Danach können Sie den Port-Knock-Server starten.

opensuse:~ # rcknockd start

Damit man nachvollziehen kann ob die Klopfzeichen ankommen und vom Daemon erkannt werden sollten Sie das Logfile öffnen.

opensuse:~ # tail -f /var/log/knockd.log

Sobald der Port-Knock-Server konfiguriert und getestet wurde, können Sie diesen auch im Runlevel Editor aktivieren.

3. Installation und Verwendung von knock

Sollten Sie den Port-Knock-Client knock noch nicht auf Ihrem Client installiert haben, so holen Sie dies jetzt nach.

opensuse:~ # yast -i knock

Nach der Installation können Sie gleich eine Klopfsequenz an den Port-Knock-Server senden. Durch die Option -v werden zusätzliche Statusmeldungen ausgegeben. Danach folgen die IP-Adresse des Servers, die Ports und die Netzwerkprotokolle welche in der knockd.conf eingetragen wurden.

opensuse:~ # knock -v 192.168.10.1 2222:udp 3333:tcp 4444:udp

Wenn Sie auf dem Server das Logfile noch geöffnet haben, sollten Sie jetzt die folgenden Ausgaben sehen.

[2006-12-30 19:41] 192.168.10.6: opencloseSSH: Stage 1
[2006-12-30 19:41] 192.168.10.6: opencloseSSH: Stage 2
[2006-12-30 19:41] 192.168.10.6: opencloseSSH: Stage 3
[2006-12-30 19:41] 192.168.10.6: opencloseSSH: OPEN SESAME
[2006-12-30 19:41] opencloseSSH: running command: /usr/sbin/iptables -I INPUT -s 192.168.10.6 -p tcp --dport ssh -j ACCEPT

Nach der eingestellten cmd_timeout wird der Port wieder geschlossen und sie erhalten diese Ausgaben in der Logdatei.

[2006-12-30 19:41] 192.168.10.6: opencloseSSH: command timeout
[2006-12-30 19:41] opencloseSSH: running command: /usr/sbin/iptables -D INPUT -s 192.168.10.6 -p tcp --dport ssh -j ACCEPT

In der Zeit zwischen dem Öffnen des Ports und des Schließens können Sie eine SSH-Verbindung zum Server aufbauen.

opensuse:~ # ssh root@192.168.10.1

4. Fallbeispiel FTP

Ich möchte Ihnen hier noch eine Beispielkonfiguration vorstellen mit welcher Sie FTP freigeben können.

[opencloseFTP]
    sequence      = 1000,2000,3000
    seq_timeout   = 15
    tcpflags      = syn
    start_command = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport ftp -j ACCEPT
    cmd_timeout   = 10
    stop_command  = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport ftp -j ACCEPT

5. Fallbeispiel HTTP

Bisher haben Sie nur Konfigurationen gesehen welche automatisch den Port öffnen und nach einer definierten Zeit wieder schließen. Wenn Sie den Port 80 freigeben wollen, ist diese Methode nur bedingt von Vorteil. Deshalb möchte ich Ihnen jetzt eine Alternative zeigen mit welcher Sie zwei Klopfsequenzen definieren können um den Port zu öffnen und wieder zu schließen.

[openHTTP]
    sequence      = 4000:udp,2000:tcp,6000:udp
    seq_timeout   = 15
    tcpflags      = syn
    command       = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport http -j ACCEPT

[closeHTTP]
    sequence      = 4100:udp,2100:tcp,6100:udp
    seq_timeout   = 15
    tcpflags      = syn
    command       = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport http -j ACCEPT


Dieser Eintrag wurde am 30.12.2006 erstellt und zuletzt am 09.01.2010 bearbeitet.

Direkter Link zu dieser Seite: http://www.gtkdb.de/index_35_861.html

[ Zur Startseite ]   [ Zur Kategorie ]


Valid XHTML 1.0 Transitional Valid CSS Valid Atom 1.0

© 2004-2018 by Georg Kainzbauer