Sicherer SSH Fernzugang

  Home     Server     Elektronik     Audio&Licht     Links     Kontakt  


Der Fernzugang (Remote Login) von einem Client-PC mittels SSH (Secure Shell) ist der Standard bei Linux. Das wissen auch die Hacker. Gibt man für einen Fernzugriff im Router den SSH Port 22 auf den Server frei, hagelt es nur so von Eindringversuchen von der ganzen Welt.

Ein gängiger Trick ist anstelle von Port 22 den Port 443 zu verwenden. Dies ist normalerweise der https Zugang zu verschlüsselten Webseiten. Deshalb ist so meist auch ein Zugang von einem mit einer Firewall gesicherten Netzwerk, wie z.B. von der Firma, zum Server zu Hause möglich. Allerdings gibt es genügend Hacker, die auch diesen simplen Trick kennen.

Deshalb ist es wichtig, nur einen beschränkten Zugang zu ermöglichen, z.B. auf einen einzigen kryptischen Benutzer mit einem kryptischen Passwort (man kann es sich ja aufschreiben).

Abgesehen davon blockt die Firewall auch das SSH Protokoll auf Port 443 so dass man vom Firmennetz damit nicht nach draußen kommt. Damit das funktioniert, kann man z.B. sowohl auf dem Client-PC als auch auf dem Home-Server das Programm Stunnel verwenden. Es verbindet sich via https Protokoll mit dem Server und schleust dann das SSH Protokoll hindurch.

Ist das geschafft, kann man Ports durch das SSH tunneln und z.B. das heimische Netzwerk auf dem Client-PC abbilden, mit dem Proxy-Server auch auf Seiten zugreifen, welche hinter der Firewall in der Firma gesperrt sind, oder auch mit VNC auf den Desktop des Home-Servers zugreifen, z.B. für Bankgeschäfte wenn man sich gerade außerhalb Europas befindet. Die Möglichkeiten sind ähnlich wie mit einer VPN Verbindung, können aber bei Bedarf dynamisch von der Client-PC Seite her angepasst werden.

Das ultimative Schnippchen gegen Hacker

Für den Fernzugang ohne Stunnel sperrt man am Besten alle Ports gegen den SSH zugriff, so dass für den Hacker gar keine Möglichkeit besteht, in den Server einzudringen. Das heißt, man gibt zwar den SSH Port 22 am Server frei, aber nur für das lokale Netzwerk. Im Router wählt ein Port-Forwarding für einen anderen Port, z.B. 54321. Für Port 22 mach man im Router kein Port-Forwarding. Im Server gibt man nun in der Firewall beide Ports frei, also 22 und 54321. Für 54321 gibt es aber kein Dienst im Server, wodurch der Hacker auch auf diesem Port keinen Zugang findet. Selbst mit einem Port-Scanner hat man so kein Glück.

Damit man selber mit dem Client-PC zugreifen kann, richtet man auf dem Server eine temporäre Port-Weiterleitung von Port 54321 auf Port 22 ein wie nun beschrieben.

Temporäres Port Forwarding auf dem Server

Das Script sesamoeffnedich.sh kopiert man als root ins Verzeichnis /etc/ssh/. Es mache eine Portweiterleitung mittels iptables von Port 54321 auf Port 22, aber nur für 60 Sekunden. Dann wird die Weiterleitung wieder gelöscht.

Das Script sesamoeffnedich.cgi kopiert man ins cgi-bin auf dem Web-Server. Ruft man dieses via Webseite auf (z.B. http://meinserver.xyz/cgi-bin/sesamoeffnedich.cgi) ruft dieses das Script /etc/ssh/sesamoeffnedich.sh auf, welches die Weiterleitung aktiviert.

Den Namen sesamoeffnedich sollte man natürlich durch einem kryptischen Namen ersetzen und entsprechend in den Scripts anpassen. Ebenfalls anpassen sollte man die  Port Nummer im sesamoeffnedich.sh, so dass sie mit dem Router und der Firewall übereinstimmt.

Das Script /etc/ssh/sesamoeffnedich.sh kann nur vom root ausgeführt werden. Deshalb muss man noch sudo entsprechend einrichten und /etc/ssh/sesamoeffnedich.sh vom Benutzer wwwrun erlauben.

Beschränkter SSH Zugang

Um das Login zu erschweren, sollte man einen kryptischen Benutzer anlegen, welchem man als einziger den Fernzugang erlaubt (z.B. "aJS6MHYBzeYu"). Das Passwort sollte ebenfalls kryptisch sein (z.B. "tPwNFpOhx2Ek"). Man muss ich das nicht merken, man kann sich den Zugang aufschreiben oder in einem Script auf dem Client-PC speichern. Dazu im /etc/ssh/sshd_config folgenden Eintrag machen:
AllowUsers *@localhost *@127.0.0.1 *@192.168.*.* aJS6MHYBzeYu
Das bedeutet, zugelassen sind nur lokale Logins (*@localhost *@127.0.0.1) und Logins vom Home-Netzwerk (*@192.168.*.*) sowie vom Benutzer "aJSlMHYBzeYu" (welchen man anpassen sollte).

Um kryptische Zeichenketten zu generieren, kann man das random Script verwenden. Einfach herunterladen, ins ~/bin Verzeichnis kopieren und ausführbar machen (chmod +x random). Dann z.B. "random 12 -a" auf der Konsole eingeben.

Und so funktioniert es

- Port Weiterleitung aktivieren indem man das Script auf dem Webserver startet, also z.B. "http://meinserver.xyz/cgi-bin/sesamoeffnedich.cgi". Das kann man z.B. mittels Link auf dem Handy machen.
- Nun hat man 60 Sekunden Zeit sich einzuloggen, z.B. mit "ssh aJS6MHYBzeYu@meinserver.xyz"
- Erscheint das Login, das entsprechende Passwort eingeben, z.B. "tPwNFpOhx2Ek".

Das funktioniert z.B. mit dem Handy z.B. mit der App "Terminus". Aber auch mit der Handy-App bVNC Free. Damit kann man via SSH tunnel auf den VNC-Server zugreifen.

Mit dem PC verwende ich beide Varianten, mit stunnel und auch mit der Port Weiterleitung. Damit habe ich mit entsprechenden SSH Optionen Zugriff auf den Proxy Server und den VNC Desktop des Home-Servers. Beispiele dafür gibt es im Netz genügend (sonst einfach über meine Kontakt Seite fragen). Einfach geht es auch mit dem Shell-Script connect-via-sesam.sh, welches vom Benutzer aufgerufen werden kann. Es ruft erst das sesamoeffnedich.cgi im cgi-bin von der Webseite auf, danach logt es sich via SSH ein und macht die entsprechenden Prot Forwardings (einfach im Script anpassen).

Login überwachen

Trotz aller Vorsicht und Absicherung kann ein Hacker den Datenverkehr mitschneiden und vielleicht herausfinden, wie der Zugriff freigeschaltet werden kann. Deshalb sollten unbedingt die Logins auf Fehlversuche überwacht werden, so dass man Hackerangriffe auch merkt. Das geht relativ einfach dem Script checkhack.sh, welches man als root ins /etc/cron.hourly kopiert und ausführbar macht.

Damit man bei Angriffen auch eine Mail erhält, muss man im Script die E-Mail Adresse anpassen und auch Systemmails (postfix) entsprechend einrichten.

Versucht dennoch jemand einzudringen, kann man eine IP Adresse sperren in der /etc/sshd_conf mit dem Eintrag:
DenyUsers *@111.222.333.444
Ebenfalls kann man die IP auf dem Webserver sperren, so dass auch eine Port Weiterleitung ausgeschlossen ist.

Normalerweise logge ich mit stunnel ein. Und den Zweitzugang mittels Port Weiterleitung verwende ich mit dem Handy, oder mit dem PC wenn ich im Urlaub bin. Die letzten paar Jahre gab es einen einzigen fremden Login-Versuch. Seit diese IP gesperrt ist, gibt es keine Versuche mehr. Ich werte das als Erfolg.


© 2022-2024 by Stefan Ludescher