Rechner absichern mit Knock

Aus LinuxUser 10/2008

Rechner absichern mit Knock

Klopf, klopf

Rechner mit Internetzugang gilt es, gegen Angreifer abzusichern. Eine ebenso faszinierend einfache wie auch effiziente Barriere schafft ein Portknocker.

Der Albtraum eines jeden Netzwerkadministrators: Unsichere Dienste, die es Angreifern ermöglichen, ins heimische LAN oder das Firmennetz einzudringen. Von außen erreichbare Dienste stellen immer ein Sicherheitsrisiko dar, als mögliche Ansatzpunkte dienen Angreifern eine fehlerhafte Konfiguration oder Sicherheitslücken im Programm selbst. Um zum Datenaustausch oder zur Fernwartung auf den Rechner zugreifen zu können, bleibt jedoch nichts anderes übrig, als Ports für die entsprechenden Dienste zu öffnen. Diese müssen jedoch nicht dauerhaft offen stehen: Das Programm Knock [1] erlaubt, bestimmte Ports quasi auf Zuruf zu öffnen und wieder zu schließen, und minimiert auf diese Weise die Angriffsfläche.

Angeklopft …

Im Normalfall greift ein Client auf den Port eines auf dem Server laufenden Diensts zu, um mit der Applikation zu kommunizieren. Über eine Firewall lässt sich der Port gegen den Zugriff von außen abschotten. Der Portknocker-Daemon knockd sorgt dafür, dass autorisierte Verbindungen trotzdem zustande kommen.

Dazu öffnet Knockd beim Start einen Raw-Socket und registriert alle am Netzwerkdevice ein- und ausgehenden Pakete, unabhängig von der Konfiguration der Firewall. Empfängt der Daemon eine bestimmte Paketsequenz, die besondere Merkmale im Protokoll, Port und Flag aufweist, öffnet er die Firewall mit einer entsprechenden Regel (Abbildung 1).

Abbildung 1: Die Zeichnung verdeutlicht die Arbeitsweise von Knock: Im Normalfall schützt eine Firewall den Port (1.). Sendet der Client eine bestimmte Abfolge von Paketen (2.) öffnet Knock den Zugang (3.).

Auf welche Triggerpakete der Daemon reagiert und welche Aktion er ausführt, legen Sie in der Konfiguration fest. Die Palette reicht dabei vom Freischalten eines verschlüsselten SSH-Zugangs zum Zweck der Fernwartung [2] bis hin zur Abfrage des heimischen Mailservers über die POP3-/SMTP-Protokolle.

Benötigen Sie die Verbindung nicht mehr, so schließen Sie sie mithilfe von Knock auch wieder. Das erfolgt auf dem selben Weg wie das Öffnen, jedoch mit einer anderen Klopfsequenz wieder schließen.

Knock installieren

Der Portknocker-Daemon knockd zählt bei gängigen Distributionen wie Debian, Ubuntu sowie OpenSuse zum Umfang der Repositories. Sie installieren die Software dort über den Paketmanager Ihrer Distribution. Darüber hinaus stellt der Entwickler Judd Vinet auf der Knock-Website [1] sowohl DEB- und RPM-Pakete als auch den Quellcode zum Download bereit.

Um den Portknocker zu nutzen, gilt es zudem auf den zugreifenden Hosts den Knock-Client zu installieren. Auf der Webseite des Projekts finden Sie verschiedene Versionen für Linux sowie für Windows und Mac OS zum Download.

… und aufgemacht

Nach der Installation starten Sie den Portknocker-Daemon durch Eingabe von knockd -d. Er verwendet als Konfigurationsgrundlage die Angaben aus der Datei /etc/knockd.conf (Listing 1). In der Grundeinstellungen legt diese in [options] fest, dass die sich Logdatei von Knock im Verzeichnis /var/log befindet. Zudem lauscht der Portknocker im Betrieb per Voreinstellung auf eth0 – in aller Regel der erste kabelgebundene Netzwerkanschluss. Möchten Sie den Daemon an ein anderes Netzwerkinterface binden, teilen Sie ihm das im Bereich [options] mit der Option interface mit, beispielsweise interface = eth2.

Der Abschnitt [openSSH] legt sowohl die Klopfsequenz fest, als auch die damit verbundene Aktion in Form einer Firewallregel – in diesem Fall das Öffnen des Ports 22 sowie das entsprechende TCP-Flag. Der Bereich [closeSSH] definiert die Sequenz zum Schließen des Ports sowie den entsprechenden Löschbefehl an die Firewall. Nach diesem Muster erweitern Sie die Konfiguration bei Bedarf um beliebig viele Regeln.

Listing 1
[options]
  logfile = /var/log/knockd.log
[openSSH]
  sequence = 7000,8000,9000
  seq_timeout = 5
  command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
  tcpflags = syn
[closeSSH]
  sequence = 9000,8000,7000
  seq_timeout = 5
  command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
  tcpflags = syn

Die Praxis

Im Testszenario verwenden wir als Client Xubuntu, als Server Debian. Mithilfe der Fernsteuerungssoftware NX wollen wir über eine verschlüsselte SSH-Verbindung den unter Debian eingesetzten Gnome-Desktop auf unser Xubuntu-System holen.

Ein erster Scan mit Nmap bestätigt, dass alle Ports der Firewall geschlossen sind. Das auf dem Server gestarteten Firewall-Frontend Firestarter gibt grafisch und in Echtzeit Auskunft über ungewöhnliche Ereignisse an der Netzwerkschnittstelle. Die Eingabe des Befehls

$ knock -v Server-IPPort1Port2&wrap;Port3

auf dem Client sendet die benötigte Klopfsequenz an den Server, was Firestarter auch sofort als Ereignisse registriert (Abbildung 2).

Knockd interpretiert die Sequenz korrekt und öffnet erwartungsgemäß den Port 22 (SSH) durch einen entsprechenden Iptables-Befehl. Der folgende Aufbau der verschlüsselten Verbindung und der anschließende Start der NX-Fernsteuerung klappen reibungslos. Binnen kürzester Zeit erscheint der Gnome-Desktop von Debian unter Xubuntu. Das Schließen des Ports geschieht durch den erneuten Aufruf von Knock, diesmal unter Verwendung der Schließsequenz. Die Gegenprobe mit Nmap bestätigt den Erfolg der Aktion.

Kritikpunkte

Allerdings hat Knock auch eine Schwachstelle: Ein geschickter Angreifer kann den Dienst an der Nase herumführen. Dazu hört er zunächst mithilfe eines Netzwerksniffers den Datenverkehr zwischen Client und Server ab und analysiert ihn dann. So kommt er dem Einsatz des Portknockers auf die Spur und findet auch die konkrete Knock-Sequenz. Nun kann er durch Anklopfen am Server mit dieser Sequenz den Port öffnen.

Um das zu erschweren, erlaubt Knock, die Klopfsequenz beliebig zu erweitern und darüber hinaus auch noch innerhalb der Sequenz wechselnde Protokolle zu verwenden. Das geschieht durch Einfügen der Protokollbezeichnungen tcp und udp hinter der Portnummer, beispielsweise:

sequence = 9000:upd,8000:tcp

Deutlich sicherer arbeitet der Portknocker aber mit wechselnden und einmaligen Klopfsequenzen ähnlich einer TAN. Die in einer Textdatei hinterlegten Trigger arbeitet das Programm sequenziell ab und kommentiert schon benutzte Sequenzen aus. Sie aktivieren dieses Verhalten mit dem Eintrag von one_time_sequences /Pfad/zur/Textdatei in der Konfigurationsdatei /etc/knockd.conf.

Fazit

Im Prinzip sollten richtig konfigurierte Dienste auf Basis aktueller Binaries ohne bekannte Schwachstellen von sich aus Angriffen aus dem Netz standhalten. Möchten Sie aber eine zusätzliche Sicherheitsbarriere schaffen, erledigen Sie das ohne großen Aufwand mit dem einfach zu konfigurierende Portknocker Knock, der die Zugänge nur bei Bedarf autorisierten Benutzern freischaltet.

Glossar

Raw-Socket
Als Socket bezeichnet man eine API, die Zugriff auf die Netzwerkprotokoll-Implementation des Betriebssystems gibt. Raw-Sockets ermöglichen den direkten Zugriff auf Paket-Header.
Infos

[1] Knockd Projektseite: http://www.zeroflux.org/knock

[2] Fernsteuerung über SSH mit NX: Kristian Kißling, “Work@Home”, LinuxUser 03/2008, S. 78, http://www.linux-user.de/ausgabe/2008/03/078/

LinuxUser 10/2008 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben