Portknocking unter Debian – kleine Einführung

Posted by admin on Jan 10, 2009 in Allgemein, Work Related |
Einlass mittels Portknocking verlangen

Einlass mittels Portknocking verlangen

Sicherheit ist für alle an das Internet angeschlossenen Systeme ein zentrales Thema. Ein effektiver Schutz ist nur per NAT, Firewall oder Deaktivierung unbenötigter Ports möglich. Die Deaktivierung von Ports ist unter Debian einfach, es bedeutet lediglich, den Dienst, der normalerweise auf diesem Port auf Anfragen wartet, nicht zu starten oder dem Dienst in seiner Konfiguration mitzuteilen, dass er als Netzwerkkarte nicht die an das Internet angeschlossene Netzwerkkarte verwenden soll, sondern das Loopback Interface (127.0.0.1).

Es handelt sich beim Firewalling und Dienstdeaktivierung jeweils um eine binäre Lösung, also entweder AN oder AUS, eine Selektion nach Herkunft der Anfrage ist nicht möglich und die Zugriffskontrolle obliegt dem Dienst, der an diesem Port “lauscht”. Je nach Qualität des Dienstes ist damit zu rechnen, dass dieser Dienst angreifbar ist, der Angreifer Zugriff auf den Betriebssystemprozess erlangt, der im schlimmsten Fall root Rechte hat und somit der Angreifer kompletten Zugriff auf das System hat. Ergänzend ist zu erwähnen, dass der Zugriff auch über /etc/hosts.allow geregelt werden kann, leider ist dazu eine statische IP-Adresse erforderlich, die nicht jedermann zur Verfügung steht.

Das folgende Szenario beschreibt nun den typischen Anwendungfall einer Portknocking Lösung.
Offen sind bei einem Webserver in aller Regel:

  • Port: 21 FTP
  • Port: 22 SSH
  • Port: 80 WWW

Alle anderen Ports sind geschlossen, da keinen weiteren Diensten Kommunikation mit dem Internet erlaubt ist. Ein prominentes Beispiel für einen Dienst, der lediglich nach “innen” kommuniziert, ist mysqld auf Port 3306.
Ein Anforderung an dieses System war nun, dass die Datenbank auch von außen erreichbar sein soll. Die inhärente Unsicherheit verbietet dies eigentlich. Gesucht ist eine Lösung, die genau für eine IP-Adresse den Port öffnet und nach einiger Zeit selbstständig schließt. Genau dies ermöglicht Portknocking mit knockd in Verbindung mit einer Firewall, wie etwa iptables.

Vorraussetzung für die Umsetzung solch einer Lösung mit knockd ist ein installiertes und konfiguriertes iptables.

Beispielkonfiguration:

#cat ./iptables-rules.sh
iptables --flush
#ssh
iptables -A INPUT -d 85.214.25.36 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
#Postfix/Sendmail
iptables -A INPUT -d 85.214.25.36 -p tcp --dport 25 -j ACCEPT
#FTP
iptables -A INPUT -d 85.214.25.36 -p tcp --dport 20:21 -j ACCEPT
#passice FTP
iptables -A INPUT -d 85.214.25.36 -p tcp --dport 50000:50050 -j ACCEPT
#HTTP
iptables -A INPUT -d 85.214.25.36 -p tcp --dport 80 -j ACCEPT
#SSL/Apache
iptables -A INPUT -d 85.214.25.36 -p tcp --dport 443 -j ACCEPT
#IMAP
iptables -A INPUT -d 85.214.25.36 -p tcp --dport 143 -j ACCEPT
#IMAPS
iptables -A INPUT -d 85.214.25.36 -p tcp --dport 993 -j ACCEPT
#POP3
iptables -A INPUT -d 85.214.25.36 -p tcp --dport 110 -j ACCEPT
#POP3S
iptables -A INPUT -d 85.214.25.36 -p tcp --dport 995 -j ACCEPT
#any traffic from localhost
iptables -A INPUT -d 85.214.25.36 -s 127.0.0.1 -j ACCEPT
#ICMP
iptables -A INPUT -d 85.214.25.36 -p icmp -j ACCEPT
#GLOBAL REJECT
iptables -A INPUT -d 85.214.25.36 -j REJECT

So oder ähnlich wird die iptables Konfiguration auf dem System aussehen.

Im weiteren Vorgehen ist nun der Portknockdaemon zu installieren.

#apt-get install knockd

(Ich liebe debian)

Danach ist dieser in der /etc/default/knockd zu aktivieren und dort wird festgelegt, welche Netzwerkkarte benutzt wird.

#cat /etc/default/knockd
START_KNOCKD=1
KNOCKD_OPTS="-i venet0:0"

Im meinem Beispiel ist es ein VServer und damit die venet0:0 Karte. Woanders vermutlich eth0
Danach muss noch festgelgt werden, welcher Dienst gestartet werden soll und auf welche Anklopfsequenz, der knockd reagieren soll. Hier ist Individualität gefragt, weil dies die Abschirmung überhaupt erst garantiert.

Konfigurationsbeispiel:

#cat /etc/knockd.conf
[options]
logfile = /var/log/knockd.log
[openMySQL]
sequence    = 10000,1000
seq_timeout = 5
start_command     = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 3306 -j ACCEPT
tcpflags    = syn
Cmd_Timeout = 3600
stop_command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 3306 -j ACCEPT

Wichig ist es den knockd nach jeder Änderung neu zu starten. Ich hab Stunden nach dem Fehler gesucht!

#Portknock neu starten
#/etc/init.d/knockd restart

Die Erklärung zur knockd.conf lässt sich gut per man knockd abrufen. Die Dokumentation ist gut gemacht und mit Beispielen versehen. Allgemein lässt sich sagen, dass Portknocking viel mächtiger ist, als ich es hier beschrieben habe. Wie man sehen kann, wird lediglich ein spezifiziertes Kommando ausgeführt und damit ist jede denkbare Aktion möglich (Mails versenden, Server neustarten, etc…).

Speziell an meiner knockd.conf ist jedoch, dass ich die neue Regel an den Anfang meiner Firewallkonfiguration schreibe. Dies geschieht über den Parameter I (Insert), weil am Ende meiner Firewallkonfiguration alle unbekannten Pakete verworfen werden. Da wäre eine angehängte Regel wenig nützlich, weil sie nie ausgführt werden würde.

Cmd_Timeout = 3600

bewirkt, dass nach einer Stunde(3600 Sekunden) das Stop_Command ausgeführt wird. Dies ist für faule Nutzer (gibts Andere?) sehr nützlich.

Um im Beispiel zu bleiben:
Die Pakete an Port 3306 werden zwar nicht mehr verworfen, aber trotzdem ignoriert, weil keiner zuhört. Debiantypisch ist MySQL auf 127.0.0.1 eingestellt. Dies muss noch geändert werden:

#vi /etc/mysql/my.cnf
bind-address            = 85.214.25.36
#/etc/init.d/mysql restart

Jetzt ist der mysqld von außen erreichbar. Dank Portknocking nun auch nicht mehr hinter der Firewall versteckt.

Jetzt bleibt noch die Frage:
WIE MACHE ICH DENN NUN PORTKNOCKING VON WINDOWS AUS?

c:\>knock.exe IP SEQUENZ

z.B.:

c:\>knock.exe 85.214.25.36 10000 1000

Jetzt ist dieser Rechner für eine Stunde berechtigt, auf Port 3306 zuzugreifen.

UPDATE!

Solltet Ihr zu den armen Trotteln gehören, die Windows Vista einsetzen, ist unbedingt dieses Tool zu verwenden.

Links:

Schlagwörter: , , ,

Reply

OC

Copyright © 2018 Stempell All rights reserved. Theme by Laptop Geek.