Diskreter Rechnerzugang mit knockd
Das Problem mit offenen Ports
Es ist das alte Problem: Sowie Sie irgendwo einen Zugang schaffen, um an das
besagte Ziel heranzukommen, so öffnen Sie immer auch irgendwelchen
übelmeinenden Leuten eine Einfallspforte, denn alles, was man verwenden kann,
läßt sich dummerweise immer auch mißbrauchen. Daher ist es eben notwendig, daß
Sie solche Zugangsmöglichkeiten so absichern, daß ein Mißbrauch möglichst
erschwert wird.
Im Normalfalle werden solche Absicherungen mittels Loginverfahren
verschiedenster Art und Weise eingerichtet, die nur berechtigten Personen
Zugang gewähren sollen und die Verbindung zusätzlich gegen Belauschen
absichern. Allerdings sehen sich diese Zugriffssicherungen ständig
irgendwelchen Angriffsversuchen aus den verschiedensten Richtungen ausgesetzt,
und es ist meist nur eine Frage der Zeit, wann ein Angreifer Erfolg haben wird.
Also gilt es, die Ports selbst gegen unerlaubte Zugriffe abzusichern.
Wenn Sie dazu nachschauen, wie
Sie heikle Dienste richtig schützen, so können Sie es einem Angreifer schon
mal deutlich schwerer machen, Unsinn anzustellen – aber die fraglichen Ports
sind i. d. R. immer noch allgemein zugänglich. Hier müßte man die angegriffenen
Ports irgendwie gegen unerlaubten Zugriff sperren.
Geschlossen – und ausgesperrt...
Einen Port einfach zu sperren, ist in den meisten Fällen leider einfacher
gesagt als getan. Zwar wäre es vergleichsweise sehr einfach zu bewerkstelligen,
wenn man von einer festen IP-Adresse aus auf einen Rechner zugreift, doch dies
ist in den allermeisten Fällen leider nicht gegeben. Der Normalfall ist eher,
daß man über irgendeinen der zahlreichen Provider auf das Internet zugreift,
und wenn man nicht gerade über eine Standleitung verfügt, dann bekommt man bei
jeder neuen Einwahl eine neue IP-Adresse zugewiesen, so daß man in diesem Fall
ein ganzes Netzsegment, welches dem fraglichen Provider zugeordnet ist, offen
halten müßte, da man schließlich von jeder der darin enthaltenen IP-Adressen
aus einen Zugriff starten könnte.
Noch schlechter schaut die Bilanz aus, wenn man an verschiedenen Orten auf
unterschiedliche Provider zurückgreifen muß, da man in diesem Fall weitere
Netzsegmente öffnen muß, und zwar für jeden Provider mindestens ein neues – was
das Problem wiederum potenziert.
Denn von allen so geöffneten Adressen aus können immer noch Angriffe gestartet
werden, die sich so nicht abblocken lassen. Daher müßte man theoretisch den
Port komplett sperren, um sämtliche Angreifer draußen zu halten – aber das
wiederum sperrt dann auch Sie aus, und Sie haben
wieder nichts gewonnen.
Bitte klopfen und eintreten!
Um dieses Problem umgehen zu könnnen, bedarf es eines Mechanismus, um der
Firewall mitzuteilen, kurzfristig einen Durchgang zu öffnen, damit Sie einen
Zugang bekommen, während der Rest ausgesperrt bleibt. Somit platzen alle
Angreifer, die mit Brachialgewalt einen Zugang zu Ihrem Server erzwingen
wollen, an der Firewall ab, während jemand, der höflich genug ist, um erst
einmal anzuklopfen, einen Zugang gewährt bekommt.
So kann man die Zugänge sehr wohl allgemein sperren, nur daß man vorher ein
geheimes Signal vereinbart hat, das die Firewall dazu veranlaßt, den Zugang
für Ihren Ausgangspunkt zu öffnen, so daß Sie sich anmelden können. Und genau
nach diesem vereinbarten Signal hält das Programm knockd
Ausschau.
Das Beste dabei: Damit knockd funktioniert, müssen
Sie noch nicht einmal die fürs Anklopfen notwendigen Ports öffnen.
knockd erkennt etwaige Aktivitäten eine
Schicht unter der Firewall
und kann somit auch bei geschlossener Firewall reagieren!
Vorbereitungen
Damit der Server auf Ihr Klopfen passend reagieren kann, ist es erforderlich, das notwendige Programm zunächst einmal zu installieren.
- Melden Sie sich als root auf Ihrem Server an.
- Rufen Sie folgenden Befehl auf: apt-get install knockd
Damit wird das Paket installiert, und sowie das passiert ist, können Sie Ihren Zugangswächter passend einrichten. Danach müsssen Sie auf Ihrem lokalen System noch die Möglichkeit schaffen, Ihrem Server das vereinbarte Zeichen zu schicken. Dazu müssen Sie dort ein bestimmtes Programm installieren, das Ihnen diese Arbeit abnimmt. Dieses steckt ebenfalls in dem Paket knockd, also installieren Sie dieses auch auf ihrem lokalen Rechner.
nach obenKonfiguration
- Wechseln Sie (als root) in das Verzeichnis /etc.
- Laden Sie die Datei knockd.conf in Ihren Editor.
- Bearbeiten Sie die Datei passend.
Sie können knockd auf einfache Art und Weise mitteilen, auf welche Signale es achten soll und wie sich das Programm daraufhin verhalten soll. Dazu sind jedoch ein paar Einstellungen vonnnöten.
Bitte beachten Sie, daß Sie die angegebenen Werte ggf. an die Gegebenheiten auf
Ihrem Server anpassen müssen. Tauschen Sie daher z. B. den Bezeichner für die
Netzwerkschnittstelle gegen den aus, der die Netzwerkkarte repräsentiert, die
zum Internet zeigt. Die für das Anklopfsignal notwendigen Ports sollten Sie
ebenfalls unbedingt abändern und an Ihre Vorstellungen anpassen (andere und
ggf. mehr Ports, an denen angeklopft werden muß, damit sich der fragliche Port
öffnet).
Vergeben Sie zudem niemals belegte Ports, da dies den knockd
durcheinanderbringen wird, und geben Sie für das Öffnen und Schließen sowie für
unterschiedliche Ports grundsätzlich unterschiedliche Portfolgen an, um
Kollisionen und unerwünschte Nebeneffekte zu vermeiden!
Fall 1: Unterschiedliche Portfolgen für das Öffnen und Schließen von Ports
Fall 2: Eine Portfolge zum Öffnen, Timeout zum Schließen von Ports
Beiden Fällen ist gemeinsam, daß knockd auf
willkürlich festgelegten Ports nach Aktivitäten schaut und im Bedarfsfalle eine
Anweisung an die Firewall des Servers absetzt, die den gewünschten Port öffnet.
Einzig die Art und Weise, wie hier vorgegangen wird, unterscheidet sich.
So ist es im ersten Fall beispielsweise erforderlich, zuerst die Portfolge
5000, 6000 und 7000 – in genau dieser Reihenfolge – anzugeben, damit der Zugang
zum Port 22 (Secure Shell) freigegeben wird. Der Aufruf von
iptables ist dabei so gestaltet, daß nur die
IP-Adresse, von der die Klopfzeichen ausgehen, tatsächlich freigegeben wird,
während der Port für alle anderen Adressen noch gesperrt ist.
Allerdings ist es in diesem Beispiel notwendig, nach getaner Arbeit die Folge
7500, 6500 und 5500 anzugeben, damit der Port 22 wieder geschlossen wird.
Einziger Haken: Wenn man das Schließen vergißt, so könnte jemand, der im
Nachhinein diese IP-Adresse zugewiesen bekommt, den dann für ihn offenen Port
22 entdecken und mit genügend Böswilligkeit einen Angriff starten.
Um diesem Problem zu begegnen, bietet sich Variante 2 an. Hier braucht man wie
in Beispiel 1 nur die Folge 5000, 6000 und 7000 zu klopfen – wobei hier jedoch
zu beachten ist, welches Protokoll erforderlich ist (in diesem Beispiel sind es
der UDP-Port 5000, der TCP-Port 6000 und zum Schluß der UDP-Port 7000) – um den
Port 22 zu öffnen. In diesem Beispiel öffnet sich der Port für 20 Sekunden,
bevor er von knockd automatisch geschlossen wird. In
diesem Zeitfenster hat man die Möglichkeit, sich an seinem System anzumelden.
Und selbst wenn der Port mit Ablauf dieser Torzeit wieder geschlossen wird, so
werden bereits geöffnete SSH-Sitzungen davon nicht betroffen.
Um dieses Klopfzeichen jetzt auszulösen, rufen Sie das Programm
knock einfach auf Ihrem heimischen Rechner auf und
geben dabei die geforderte Portfolge an. Im ersten Beispiel lautet der Aufruf
knock <server> 5000 6000 7000.
Haben Sie den Befehl gegeben, so können Sie sich ganz normal auf Ihrem Server
anmelden und dort arbeiten. Vergessen Sie dann aber nach getaner Arbeit nicht,
den Port mit knock <server> 7500 6500 5500 zu
schließen!
Im zweiten Beispiel müssen Sie lediglich die Portfolge zum Öffnen des Ports
(also 5000:udp 6000:tcp 7000:udp) angeben; nach Ablauf der eingestellten
Torzeit wird er automatisch geschlossen, so daß man nicht versehentlich
vergessen kann, ihn wieder zu schließen.
Wenn Sie sich diese Arbeit erleichtern wollen, so definieren Sie in Ihrer Shell
einfach einen Alias, der knock mit den vereinbarten
Ports aufruft. Dies empfiehlt sich bei komplett zufälligen Portnummern sowie
längeren Portfolgen, da man hier sonst leicht durcheinanderkommen kann.
Sämtliche Ports einer Folge müssen dabei im festgelegten Zeitfenster (seq_timeout) eingegeben werden, damit sie akzeptiert werden, da die angefangene Folge sonst verworfen wird und man wieder von vorne anfangen muß. Daher sollten Sie dieses Zeitfenster groß genug wählen, damit an allen gewünschten Ports geklopft werden kann, auch wenn die Netzlast höher ist, aber immer noch klein genug, damit zufällige Scanfolgen nicht als gültige Sequenz erkannt werden und den geschützten Port so öffnen. In der Praxis haben sich zehn Sekunden als ausreichend lang erwiesen. Änderungen sind nur bei einem stark belasteten oder gestörten Übertragungsweg vonnöten.
Zum Schluß müsssen Sie knockd nur noch aktivieren. Dazu führen Sie einfach die beiden Befehle systemctl enable knockd.service und systemctl start knockd.service aus. Dadurch wird knockd gleich gestartet, und zum anderen hängt er auch in der Bootsequenz, so daß er bei einem Neustart des Servers automatisch gestartet wird.
nach obenLauschangriffe konterkarieren
Für die ganz Paranoiden sowie diejenigen, die von einer überwältigenden Anzahl Angriffe betroffen sind, gibt es schlußendlich noch eine Variante, die selbst einen Lauschangriff auf den Server ins Leere laufen läßt. Denn selbst wenn irgendein Angreifer versuchen sollte die Klopfsequenz durch einen Mitschnitt des Datenstroms zu ermitteln, nützt ihm die so gewonnene Information nichts, da beim nächsten Mal eine vollkommen andere Sequenz zum Tragen kommt. Dazu ist es erforderlich, die Portfolgen in einer Datei abzulegen, die knockd bekannt zu machen ist und aus der sich das Programm die aktuell gültige Folge holen kann. Diese Datei liegt wünschenswerterweise auch auf dem eigenen Rechner oder als Ausdruck vor, damit Sie nicht raten müssen, was Sie denn jetzt einzugeben haben...
Fall 3: Liste mit Einmalportfolgen zum Öffnen, Timeout zum Schließen von Ports
Konnte man in den ersten beiden Beispielen noch die Portfolgen zum Öffnen und
ggf. Schließen des Ports mit einem Lauschangriff ausfindig machen, so ist das
hier überhaupt nicht mehr möglich, wenn man hinreichend disjunkte Portfolgen
anlegt, die jedesmal vollkommen zufällig anmutende Ports angeben (also
vollkommen unterschiedliche Sprungrichtungen und -weiten, so daß ein Angreifer
aus den bereits eingesetzten Folgen keine Herleitung für noch offene Folgen
tätigen kann, z. B. indem er einfach den Startport verändert und dann die
gleichen Schrittweiten einsetzt).
Dies ist daher die mit Abstand sicherste, aber auch für Sie aufwendigste,
Methode um Angreifer draußen zu halten. Je nach Bedrohungslage kann es sehr
wohl empfehlenswert sein, knockd auf diese Art und
Weise einzurichten.
Selbst ausgesperrt – was jetzt?
Dieses Ärgernis kann einen selbstverständlich früher oder später ereilen, wenn
man auf automatisierte Schwarze Listen setzt, um etwaigen Angreifern das
Vorhaben sauer zu machen. Spätestens wenn man selbst in seinen eigenen
Abwehrmaßnahmen hängen bleibt, wird man sich wünschen, daß man einen weiteren
Weg implementiert hätte, um sich Zugang zum Server zu verschaffen.
Wenn man nämlich keinen IPsec-Tunnel aufbauen möchte, der einem selbst als
Umgehungsstraße dient und über den man sich ggf. mittels Telnet auf dem Server
anmelden kann, so läßt sich knockd hier kreativ
mißbrauchen, um im Fall des Falles eine Ausnahme zu setzen und sich so doch
noch anmelden zu können, selbst wenn man sich ausgesperrt hat.
Dazu ist es erforderlich, daß man neben den
beim Thema Firewall
beschriebenen Regelketten noch eine weitere Kette definiert, in die
knockd seine Ausnahmen eintragen kann. Der Block
sollte dann wie folgt aussehen:
Wandelt man das Beispiel 2 passend ab, so ergibt sich folgende Konfiguration für knockd:
So kann man sich immer noch ganz normal anmelden, doch sollte es wider Erwarten doch einmal schiefgehen und man in seinen eigenen Sicherheitsvorkehrungen hängen bleiben, so kann man sich durch Anklopfen auf einfache Art und Weise doch noch Zutritt zu seinem Server verschaffen – während diejenigen, die die Portfolge nicht kennen, nach wie vor draußen bleiben.
nach oben