Login
Login-Name Passwort


 
Newsletter
Werbung

So, 17. Januar 2010, 20:00

fwknopd - Portknocking der nächsten Generation

Was ist Portknocking?

Portknocking ist ein Verfahren, um einen Server oder Dienst abzusichern. So kann man z.B. den SSH-Port 22 komplett in der Firewall sperren.

Wenn man dann quasi »anklopft«, d.h. Pakete mit bestimmtem Inhalt in einer bestimmten Reihenfolge an vorher definierte Ports sendet, löst dies dann z.B. die Aktion aus, dass Ihrer Quelladresse der SSH-Zugriff in der Firewall erlaubt wird. Dieses Verfahren kann im Wesentlichen für alle Dienste angewendet werden. Das Bemerkenswerte an dieser Methode ist, dass ein Angreifer nicht sieht, dass Ihr Server SSH-Zugriff anbietet, denn in diesem Beispiel ist ja die Firewall so konfiguriert, erst einmal jeglichen Zugriff zu sperren. Ein beachtenswerter Punkt ist im Übrigen, dass kein Dienst im herkömmmlichen Sinn, der auf einem bestimmtem Port lauscht, läuft. Stattdessen läuft ein Dienst, der den eingehenden Netzwerkverkehr überwacht und nach der Portknocking-Sequenz sucht. Wenn man z.B. einen öffentlichen Server betreibt, bietet sich das im Besonderen an, denn die »bösen Jungs« da draußen versuchen, per SSH in Ihren Server einzudringen. Dies müllt dann Ihre Logdateien mächtig zu. Mittels Portknocking kann man diesen Müll auf Null reduzieren.

Nachteile von Portknocking

Der einfachste Angriffsvektor bei Portknocking ist eine »Replay-Attacke«. Dies bedeutet, wenn der Angreifer es schafft, sich zwischen Sie und Ihren Server zu schalten und den Netzwerkverkehr mitzuschneiden, kann er damit in Erfahrung bringen, welche Portknocking-Sequenz z.B. SSH öffnet. Meine persönlichen Erfahrungen mit Portknocking bzw. mit knockd im Speziellen waren leider nicht sehr positiv. So hatte ich oft das Problem, dass meine Sequenzen nicht erkannt wurden (ganz besonders, wenn ich UDP-Pakete verwendet hatte). Ich war auch nicht damit zufrieden, dass die Sequenz nicht »zufällig« war, d.h. die Sequenz ist statisch und ändert sich nicht. Ich wollte etwas haben, bei dem sich die Sequenz ständig ändert, ich aber nicht mehr Aufwand betreiben musste, um endlich auf meinem Server einzuloggen, weil ein Problem vorlag. Und zu guter Letzt hatte ich Bedenken, was passiert, wenn der Portknocking-Dienst den Geist aufgibt. Ich käme zwar immer noch auf meinen Server, allerdings mit wesentlich mehr Aufwand. Dazu später mehr. So kam ich dann zu fwknopd mit einem Feature namens »SPA«, was für »Single Packet Authorisation« steht, übersetzt »Autorisierung mit einem einzigen Paket«.

SPA - Single Packet Authorisation

Wie der Name schon sagt, verwendet SPA im Gegensatz zu Portknocking nur ein einziges Paket, das allerdings alles enthält, was es braucht, um sicher zu sein:

  • 16 Byte zufällige Daten
  • lokaler Benutzername
  • lokaler Zeitstempel
  • fwknop-Version
  • Modus (Zugriff oder Kommando)
  • Gewünschter Zugriff (oder Kommando-String)
  • MD5-Summe

So enthält ein Paket genügend »zufällige« Daten, um jedes Paket einzigartig zu machen. Der Zeitstempel hilft neben anderem, die oben erwähnten Replay-Attacken zu vereiteln. Dieser Block wird mit einem selbst gewählten Passwort verschlüsselt, das auf dem Server und auch auf dem Client hinterlegt ist. »Modus« beschreibt den Zugriff auf den Server. Man kann es so konfigurieren, einfach nur den Port zu öffnen, oder bestimmte Kommandos nach dem Senden des SPA-Pakets auszuführen. Diese Anleitung beschreibt nur den ersten Modus.

Bevor es jetzt zu theoretisch wird, schlage ich vor, wir konfigurieren einen Server und den dazugehörigen Client.

Konfiguration Server

Unter cipherdyne.org/fwknop/download kann man die Software herunterladen. Wenn man ein aktuelles Ubuntu oder Debian verwendet, kann man auch das Paket fwknop-server installieren, was ich gewählt habe. Nach der Installation hat man dann diese Dateien auf seinem System:

  • /etc/fwknop/access.conf: Hier konfiguriert man SPA.
  • /etc/fwknop/fwknop.conf: Hier konfiguriert man den Dienst, so könnte man z.B. SPA abschalten und nur Portknocking verwenden. Darauf wird hier nicht eingegangen.
  • /etc/fwknop/pf.os: Fingerprint-Datenbank, man könnte den Zugriff z.B. nur für Linux-Rechner freigeben. Darauf wird hier ebenfalls nicht eingegangen.

/etc/fwknop/access.conf

Schreiben wir einmal folgendes in diese Datei:

SOURCE: ANY;
        OPEN_PORTS: tcp/22;   ### for ssh (change for access to other services)
        KEY: 6AD326892DF1E055165777BED4635C8F86B724F53BACE2426AEB6C4A1B6D38D1;
        FW_ACCESS_TIMEOUT: 30;

Erläuterungen dazu:

SOURCE:
Hier können Sie angeben, von welchen Netzwerken SPA-Pakete akzeptiert werden sollen. Wenn man zu den Glücklichen zählt, die eine statische IP-Adresse zu Hause haben, könnte man diese hier eintragen. Netzwerke können als 10.0.0.0/8 eingetragen werden, und einzelne IP-Adressen sind auch möglich. Mehrere Werte werden mit Komma getrennt.
OPEN_PORTS:
Hier definiert man, welche TCP- und/oder UDP-Ports mittels SPA geschützt werden sollen. Man kann mit Kommas getrennt auch mehrere angeben.
KEY:
Dies ist der Schlüssel, der verwendet wird, um das SPA-Paket zu verschlüsseln.
FW_ACCESS_TIMEOUT:
fwknopd hat das nette Feature, dass ein einmal geöffneter Port per SPA nicht für immer und ewig bzw. bis zum nächsten Neustart geöffnet wird. Der Dienst wird nur für die Quell-IP-Adresse mittels iptables geöffnet und nur für die hier angegebene Zeit in Sekunden offen gehalten.

Nun kann man mittels /etc/init.d/fwknop-server start den Server starten. Schaut man dann in /var/log/syslog, findet man folgendes:

Jan 13 21:15:17 hostname fwknopd: starting fwknopd v1.9.11 (file revision: 1433)
        Jan 13 21:15:17 hostname fwknopd: flushing existing iptables fwknop chains
        Jan 13 21:15:17 hostname fwknopd: warning, could not find any iptables state tracking rules
        Jan 13 21:15:17 hostname fwknopd: imported access directives (1 SOURCE definitions).
        Jan 13 21:15:17 hostname fwknopd: imported previous tracking digests from disk cache: /var/log/fwknop/digest.cache

Zeile 3 beschwert sich, dass wir kein Connection Tracking im iptables-Regelwerk haben. Das ist kein Problem:

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

(Dies ist nur eine Demonstration und soll kein vollständiges, fehlerfreies und sicheres iptables-Regelwerk darstellen!). Wenn man fwknopd nun stoppt und neu startet, sieht es besser aus:

Jan 13 21:18:02 hostname fwknopd: starting fwknopd v1.9.11 (file revision: 1433)
        Jan 13 21:18:02 hostname fwknopd: flushing existing iptables fwknop chains
        Jan 13 21:18:02 hostname fwknopd: imported access directives (1 SOURCE definitions).
        Jan 13 21:18:02 hostname fwknopd: imported previous tracking digests from disk cache: /var/log/fwknop/digest.cache

Anmerkungen zum Server

fwknopd besteht in Wirklichkeit aus drei Diensten:

root      3787  0.0  0.4  12528  9400 ?        Ss   21:31   0:00 /usr/bin/perl -w /usr/sbin/fwknopd
root      3791  0.0  0.2   7980  4788 ?        Ss   21:31   0:01 /usr/bin/perl -w /usr/sbin/knoptm -c /etc/fwknop/fwknop.conf
root      3793  0.0  0.0   1676   280 ?        Ss   21:31   0:00 /usr/sbin/knopwatchd -c /etc/fwknop/fwknop.conf

  • fwknopd: Der eigentliche Server, hier wird der Netzwerkverkehr auf SPA-Pakete begutachtet.
  • knoptm: Dienst, der die temporär erzeugten iptables-Regeln nach der angegebenen Zeitspanne wieder entfernt.
  • knopwatchd: Dieser Dienst garantiert, dass die anderen Dienste immer laufen.

Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung