- Registriert
- 01.04.05
- Beiträge
- 1.973
Hey,
da manche auf Remote-Lösungen angewiesen sind, möchte ich ein kleines Tutorial für SSH, VNC und ein paar Einblicke in KVM over IP anbieten. Ich glaube nur die Wenigsten werden hierfür Verwendung finden, aber wenn sich ein paar Wenige finden, die ich damit glücklich machen kann, dann hat es ja schon etwas gebracht.
Vorweg sei noch gesagt, dass ich etwas sehr ins Detail gehen werde um auch denjenigen, die bisher keine Ahnung von der Materie haben das entsprechende Grundwissen vermitteln zu können. Für diejenigen, die sowieso schon alles näher wissen und nur 1-2 Befehle suchen, wird es hier wohl nicht das Richtige sein.
WARNUNG:
SSH ist ein erprobtes Protokoll zur Verschlüsselung einer Shell. Es kann jedoch keine Schwachstellen im zugrunde liegenden System verhindern (sei es nun Linux, Windows oder OS X). Außerdem gibt es von SSH mehrere Versionen (RFC 4250) (Wikipedia Secure Shell). Frühere SSH-Versionen (SSH1) gelten als veraltet und weissen Schwachstellen auf, die in aktuelleren Versionen (SSH2) geschloßen wurden. Wenn ein Fehler im Grundsystem oder gar im OpenSSH liegt, hilft auch keine sichere Shell.
Jeder ist für die Sicherheit seines Systems verantwortlich! Ich werde Tipps geben wie man seinen SSH-Server so sicher wie möglich machen kann. Es kann aber auch für manche soweit gehen, dass sie gar keinen Remote-Zugriff mehr auf ihren SSH-Server besitzen. Um dies zu vermeiden, ist es anfangs zwingend erforderlich, dass sowohl der SSH-Server als auch der SSH-Client physikalisch erreicht werden können. Ich bin gerne behilflich bei allen Fragen, und eigentlich ist es oft besser vorher zu fragen als es auszuprobieren (obwohl ich es persönlich andersherum bevorzuge ), gerade bei einer solchen Remote-Lösung, aber ich distanziere mich trotzdem ausdrücklich von eventuell entstehenden Schäden, falls jemand seine Daten plötzlich im Internet verstreut findet oder nicht mehr diese erreichen kann.
Zur Struktur des Tutorials:
1. Remote - Erklärungen, Definitionen
Eine Remote-Lösung heisst im engeren Sinne die Fernbedienung eines Objektes. Hierbei konzentriere ich mich aber nur auf die Fernsteuerung eines Computers (hier nur Macintoshs und eigentlich alle *nix-Systeme) durch einen anderen Computer. Es ist das Ziel den Computer über eine sichere Verbindung so zu kontrollieren, dass kein physikalischer Eingriff mehr an dem zu administrierenden PC nötig ist (kein Monitor etc. mehr). Vorraussetzung ist hier, dass zumindest eine Netzwerkanbindung (phys. und log.) vorhanden ist und die gröbsten Einstellungen vorgenommen wurden. D.h. es wurde das Betriebsystem installiert und eine erfolgreiche Verbindung zum Internet oder innerhalb des LANs hergestellt. Es muss mindestens ein User (am besten zwei User) angelegt werden. (Admin-Anwender-Sicherheitskonstruktion). Der Anwender kann und darf kein FileVault-Image nutzen! Denn er wird unser Login für den SSH-Zugriff. Bei FileVault kommt der SSH-Server nicht an die benötigten Dateien. Denn es kann keine Verbindung aufgebaut werden, da das FileVault-Image erst nach dem Login geöffnet wird, und der SSH-Server somit nicht an die nötigen Einstellungen unseres Login-Benutzers gelangt.
Der vorgeschaltete Switch/Router muss umkonfiguriert werden sofern es erwünscht ist, dass der Server auch außerhalb des lokalen Netzes ansprechbar ist, und darauf werd ich auch später noch näher eingehen.
Die Remote-Lösung wäre im Näheren:
Für OpenSSH ist bereits auf OSX- und jedem Unix-System vorinstalliert. Für eine praktikableren Handhabung mit SSH gibt es ein nützliches kostenloses Werkzeug:
Für die einfachste SSH-Lösung (kein manuellen Eingriff nötig)
SSH-Helper (wild aus der Masse heraus gegriffen)
Für die VNC-Remote-Lösung:
VNC-Server
VNC-Viewer
Nun erklär ich "schnell" die Struktur des Ganzen. Damit auch Verständnis für die ganzen Änderungen, die vorgenommen werden müssen aufkommt. Denn wenn man keine Ahnung von dem hat, was man tut, macht man oft die gravierendsten Fehler. (!)
Als Grafik hab ich da etwas schnell hingemalt... im wahrsten Sinne des Wortes.
oder eine nette und alle mal bessere Alternative (6.3.2007) von oscarr:
2. Von Grund auf... Netzwerke, DMZ und so...
In dem Beispiel haben wir unseren Server in Berlin stehen und den Client, also den Rechner mit dem wir auf dem Server zugreifen wollen, in Leipzig, bzw. die Konstruktion streben wir als Ziel an. Anfangs sind beide im gleichen Netzwerk meinetwegen in Berlin.
Bei der Ziel-Vorstellung haben beide unterschiedliche Internet-Anschlüsse und damit unterschiedliche Internet-Provider (nein, ich mach hier keine Werbung ). Und beide Netzwerke haben natürlich jeweils einen anderen Router. Der Router übernimmt folgende Funktionen im privaten Netzwerk: er gibt jedem PC, der sich im privaten Netzwerk anmeldet eine IP-Nummer an hand seiner MAC-Adresse, die den Rechner konkret und einzigartig für das private Netzwerk (max. 254 Client-Rechner) ausweist. Bei mir in Leipzig hat der Client die IP-Nummer 192.168.2.100. Dies ist eine private Netzwerk-IP-Nummer und damit ein Klasse C Netz. Das gleiche ist bei dem Netzwerk in Berlin. Dort hat unser Server die IP-Nummer 192.168.1.2.
Der Router hat eine zweite Funktion. Er verbindet das private Netzwerk Klasse C mit dem außenstehenden Netzwerk, dem Internet. Daher bildet er die Barriere zwischen Internet und Klasse C-Netz. Er bildet somit die demilitarisierte Zone (DMZ). Den Schutz und Abgrenzung eines privaten Netzwerkes zu anderen Klassen-Netzwerken.
Klasse C Netzwerke haben die Subnetzmaskenbereich von 255.255.255.0 bis 255.255.255.254. Dies bedeudet, dass bei einer Subnetzmaske von FF.FF.FF.0 254 Client-Rechner eine IP-Adresse zugeteilt bekommen, zusätzlich kommt eine Adresse für den Broadcast und eine für die Netzadresse um das Netz selbst ansprechen zu können.
Die wären standardmäßig (bei FF.FF.FF.0) FF.FF.FF.0 als Netzadresse und FF.FF.FF.255 als Broadcast-Adresse. Der Router würde als Client mitgezählt werden.
In der Klasse C kann man sich eine beliebige IP-Nummer auswählen, je nachdem ob der Router die freie Wahl dieser zulässt. Aber da die Klasse C eben auf bestimmte Nummern festgelegt ist, ist meistens auch der Router auf diese Nummern festgesetzt. (zusätzliche private Adressbereiche RFC 1597)
Bei der externen IP-Nummer erhält man dagegen eine IP-Adresse, die vom Internet-Anbieter (SIP = Service Internet Provider) festgelegt wurde. Dieser hat auch nur einen Nummernbereich "gekauft" und man bekommt meistens "fast" die gleiche. Es bleibt immer in einem bestimmten Abstand, wenn man ein bisschen darauf achtet. Seine Ausgangs-IP erfährt man am einfachsten z.B. durch Webseiten wie whatismyip.de oder Widgets. Dort wird einfach nur die IP-Nummer ausgegeben mit der man auf die Webseite zugreift.
Mit dieser externen IP-Nummer, die sich mindestens 1mal alle 24 Stunden ändern muss (wird durch den SIP zwangsgetrennt) ist jeder User eindeutig identifizierbar. Daher ist es selten angebracht seine Ausgangs-IP in Chats und dergleichen zu veröffentlichen!
Wenn man in einem anderen Netzwerk (beispielsweise auf Arbeit) ist und zu seinem Netzwerk zuhause zugreifen will, dann brauch man bloss die Ausgangs-IP des Routers daheim. Je nachdem wie dieser konfiguriert ist und welche Dienste laufen kann man dann etwas an Infos erhalten oder komplett abgeblockt werden. In diesem Tutorial geht es darum von seinem Netzwerk in Leipzig auf das Netzwerk in Berlin zuzugreifen, und der Router im Berliner Netzwerk muss auch soweit konfiguriert werden, dass er Zugriffe von außen auf den Server durchlässt. Also haben wir etwas vor uns...
3. SSH
3.1. SSH - Allgemein
Ich beziehe mich hier nur auf OSX-Systeme, aber es handelt sich wie gesagt um den Dienst OpenSSH und das Protokoll SSH2, und dies ist in vielen BSD-Unix-Systemen, wie auch in Debian eingebunden. Es ist auf fast alle *nix-Systeme übertragbar.
Eine SSH-Verbindung kann per Passwort oder mit einem vorgefertigten Zugriffsschlüssel oder beidem geschützt werden. Passwörter über das Netzwerk über sonst wieviele Knotenpunkte zu verschicken bedeutet aber immer ein Sicherheitsrisiko. Außerdem besteht die Problematik, dass Passwörter geknackt werden können durch ein einfaches Skript, welches alle Standard-User und alle Standard-Passwörter durchprobiert. Früher hatte ich etwa 120 SSH-Zugriffe in der Nacht auf meinem Server. Die Skript-Kiddies waren da sehr aktiv und ich mit meinen Gegenmaßnahmen auch.
Ich werde hier den Weg der sicheren SSH-Authentitifizierung erklären. Dabei identitifiziert man seinen Client, mit dem man auf den Server zugreift, mit einer Schlüsseldatei (Keyfile). Diese hat eine von uns gewünschte Verschlüsselung mit einer von uns gewünschten Bitgröße. Durch diese verhindern wir Attacken wie dem bekannten Problem des Man-in-the-Middle-Angriffes(MITM). Wir brauchen uns dann nicht mehr per Passwort und User-ID identifizieren, da dies alles in der Keyfile enthalten sein wird. Dies lässt einmal die Sicherheitslücke des übertragenen Passwortes über das Internet verschwinden, aber andererseits auch die Hackerskript-Versuche, die sehr oft auf eine Passwort-Authentitifizierung setzen. Zusätzlich zur Keyfile können wir ein optionales Passwort setzen. Dies nennt sich im Zusammenhang mit der Keyfile Passphrase, welches die eigentliche Verschlüsselung der Schlüsseldateien bildet. Dazu später mehr.
TIPP: im Terminal man ssh eintippen um sich das Manual zu SSH durchzulesen, und man sshd um zusätzliche Informationen über den SSH-Daemon zu erhalten, der den SSH-Server bildet (oder RFC 4250 pp. wie oben verlinkt).
ssh:
Auf dem Server:
Wir gehen in die Systemeinstellungen -> Sharing -> Dienste und aktivieren den Dienst Entfernte Anmeldung. Damit wird der Remote-Zugriff per SSH auf dem Rechner gestattet.
Anfangs sollten beide Computer (Client und Server) in ein und dem selben Netzwerk sein um die SSH-Verbindung testen zu können. Wenn der Dienst aktiviert ist, passt die Firewall die Einstellungen automatisch an, falls diese aktiviert ist. Es wird Port 22 geöffnet für Zugriffe und der SSH-Server gestartet bzw. geht damit einher, und damit können wir uns vom Client auf dem Server einloggen, wenn er im selben Netzwerk ist.
Dazu öffnen wir das Terminal (Ordner Dienstprogramme) und tippen dort ein einfaches
oder das gleich bedeutende
ein. Man kann sich auch zu sich selbst per SSH verbinden indem man die serverip mit localhost ersetzt wodurch man nur die Loopback-Netzwerkschnittstelle nutzt.
Der username ist selbstverständlich unser Login-User am Server. Die serverip lässt sich beim Server erfahren bei Systemeinstellungen -> Netzwerk -> aktive Netzwerkschnitstelle -> TCP/IP. Oder in der Menüleiste Apfel-> Über diesen Mac -> weitere Informationen -> Netzwerk -> ip4v-IP-Adresse. Dort steht die aktuell durch den Router zugeteilte IP-Nummer. (oder im Terminal ifconfig; en0 = Ethernet- und en1=Airport-Schnittstelle, je nachdem wie man angeschloßen ist)
Höchstwahrscheinlich wird noch nicht viel passieren außer das die Computer sich nun gegenseitig versuchen zu identifizieren. Es werden MAC-Adresse etc. ausgetauscht. Es wird ein einzigartiger Finger-Print am Client, mit dem wir uns auf den SSH-Server verbinden, angezeigt. Dieser Fingerprint informiert uns darüber, ob wir uns auf den richtigen Server verbinden. Dies kennt man vielleicht von Bank-Servern etc., die ihre Fingerprints bei Internet-Banking aufzeigen, damit man sich sicher sein kann auf dem richtigen Bank-Server seine Daten einzugeben.
Wir bestätigen den Server-Fingerprint mit einem yes bei der Nachfrage.
3.2 SSH-Server manuell einrichten
3.2.1 Server vorbereiten
Wir befinden uns also am Server:
Dort öffnen wir das Terminal.
Wenn wir das Terminal öffnen, landen wir wie gewöhnlich im User-Verzeichnis.
Hier sollten wir als erstes ein
eintippen. Falls noch kein solches Verzeichnis bei uns im User-Verzeichnis, welches unser Login auf dem Server sein wird, existiert.
3.2.2 Privat- und PublicKey am Client erzeugen
Wir sind am Client:
Nun wollen wir unsere SSH-Keyfile erzeugen. Bei der SSH-Verschlüsselung liegt bei jedem Unix-System das nützliche kleine Werkzeug ssh-keygen bei. SSH erkennt zwei Algorithmen als Verschlüsselung an, dass ist einmal der RSA- und zum anderen der DSA-Algorithmus.
Welches von beiden besser ist... das ist schwierig. Niemand legt sich so recht fest. RSA-Keys sind länger als DSA. Dadurch angeblich leichter zu knacken als DSA-Keys, weil man bei RSA mehr Daten zur Verfügung hat mit den man händeln kann. DSA-Keys brauchen dafür ihre Zeit bis man sich mit diesen am Server verifiziert hat. Bei RSA erfolgt die eigentliche Arbeit bereits während des Codierens. DSA dagegen brauch einen starken Decodierer. So gilt RSA bei Nutzung eines großen Schlüssels anfangs langsam jedoch bereits bei der Decodierung sehr schnell. DSA wirkt gegenteilig in der Hinsicht.
DSA ist auf jeden Fall nur für SSH2-Server. RSA dagegen ist zweigeteilt in RSA1 und RSA. RSA ist sowohl für SSH1 als auch für SSH2. RSA1 ist nur für SSH1-Server. Man sollte unbedingt RSA1 bzw. das Protokoll SSH1 vermeiden!
In meinem Beispiel werde ich die RSA-Algorithmierung nutzen. Diese lässt sich aber leicht abwandeln zu DSA.
Um einen Schlüssel zu generieren tippen wir ins Terminal folgendes ein:
.
Mit -b legen wir die Bitstärke fest. 1024 Bits sind da Standard. Ich lege gerne doppelt soviel rauf. Damit ist der entstehende Schlüssel 2048 Bits gross (was 2 KB entspricht). Mit -t legen wir den Typen der Algorithmierung fest.
Die Erstellung eines RSA-Keys sollte seine Zeit dauern (ein paar Sekunden). DSA-Schlüssel sind dagegen schneller erstellt wie oben bereits erwähnt.
Nachdem der Schlüssel berechnet wurde, werden wir gefragt, ob wir den Schlüssel in dem vorgeschlagenen Verzeichnis (~/.ssh/id_rsa) speichern wollen. Und das wollen wir, außer dort lagern bereits SSH-Schlüssel für andere Server. Dann sollte man natürlich die Standard-Bezeichnung abändern, indem man den Pfad abtippt und den Schlüsselnamen ändert.
Wir werden außerdem nun gefragt, ob wir einen Passphrase zusätzlich setzen wollen. Ein Passphrase ist eine optionale zusätzliche Identifikationsmethode. Man kann es sich vorstellen, dass der Schlüssel der Ausweis zum Club ist, aber man brauch zusätzlich wenn so gewünscht ein geheimes Passwort um Einlass zu finden. Ohne Passphrase reicht der Ausweis. Wenn wir aber den Ausweis verlieren, verlieren wir auch jeglichen Schutz!
Technisch ausgedrückt ist der Passphrase die Verschlüsselung des Schlüssels. Jedoch ist der Passphrase optional und los gebunden von der Schlüsseldatei.
Diejenigen, die also ein Passphrase setzen wollen, tun dies jetzt. Der Rest, der ohne Passwort-Abfrage dann auf ihren Server zugreifen will, lässt die Eingabe frei mit zweimaligen Drücken von Enter.
Der Schlüssel wurde nun erstellt in dem angegeben Verzeichnis und uns wird auch gleich das Erstellungsdatum sowie den Fingerprint des Schlüssels ausgegeben.
Nun zu näheren Erklärung:
wir haben nun zwei Dateien im ~/.ssh/ Verzeichnis. Standardmässig heisst die eine Datei id_rsa (oder dsa bei DSA-Verschlüsselung) und die andere id_rsa.pub.
id_rsa ist unser privater Schlüssel! Wenn wir diesen an Dritte verlieren, haben wir wirklich ein Problem! Es ist wie gesagt unser Ausweis, unsere Identifikation und sollte unter allen Umständen vor Dritten versteckt bleiben!
id_rsa.pub ist der öffentliche Teil unseres Schlüssels. Das Gegenstück sozusagen von unserer privaten Identifikation. pub ist wie man vielleicht erkennt die Abkürzung für public. Diese Datei wird bei den Servern platziert, wo wir uns identifizieren und um Einlass bitten wollen. Wir werden uns also nur mit unseren Ausweis dort einfinden, wo wir auch unser passendes Gegenstück finden. Somit ist hier der MITM-Angriff nicht mehr existent, da die gesamte Kommunikation dann mit diesen Schlüsseln getätigt wird. (erweiterte Versionen wäre das EKK)
3.2.3 Übermittlung der Schlüsseldatei
Wir sind noch immer am Client:
Nun müssen wir die id_rsa.pub zu unserem Server übermitteln. Es ergeben sich verschiedene Möglichkeiten.
Die einfachste ist per SSH, welches wir vorhin ausprobierten um die Funktionalität zu testen, die Datei zu übermitteln.
Dies ist möglich mit folgender Befehlszeile:
Wir überschicken damit per sicherer Übermittlung die id_rsa an unseren Server in das Benutzerverzeichnis und benennen es gleichzeitig um zu der Datei authorized_keys. Dies hat sich einfach so eingebürgert mit der Bezeichnung, bzw. SSH-Server lassen sich soweit einschränken, dass sie nur auf Dateien, die authorized_keys heissen und die richtige Benutzer-Kennung besitzen, achten. Damit soll auch bewerkstelligt werden, dass weitere Clients auf den Server zugreifen können mit anderen Schlüsseln. Jedoch wird mit dieser Methodik die authorized_keys überschrieben, falls vorhanden.
Aber wenn man per Netzwerk die Datei übermittelt und einlesen lässt, kann die authorized_keys mit Zugriffsschlüsseln sprichtwörtlich aufgefüllt werden also ein Sammelbecken für öffentliche Schlüssel bilden.
Dabei wird meinetwegen die id_rsa.pub in eine Freigabe kopiert, oder per scp übertragen mit einer anderen Ziel-Benennung als authorized_keys.
Auf dem Server sollte dann die id_rsa.pub, die in authorized_keys aufgenommen werden soll, im .ssh-Verzeichnis liegen.
Dann tippen ins Terminal:
Dies funktioniert natürlich nur, wenn beide Dateien im selben Verzeichnis liegen. Ansonsten muss vor authorized_keys noch der Ziel-Pfad angegeben werden, entweder relativ oder absolut.
da manche auf Remote-Lösungen angewiesen sind, möchte ich ein kleines Tutorial für SSH, VNC und ein paar Einblicke in KVM over IP anbieten. Ich glaube nur die Wenigsten werden hierfür Verwendung finden, aber wenn sich ein paar Wenige finden, die ich damit glücklich machen kann, dann hat es ja schon etwas gebracht.
Vorweg sei noch gesagt, dass ich etwas sehr ins Detail gehen werde um auch denjenigen, die bisher keine Ahnung von der Materie haben das entsprechende Grundwissen vermitteln zu können. Für diejenigen, die sowieso schon alles näher wissen und nur 1-2 Befehle suchen, wird es hier wohl nicht das Richtige sein.
WARNUNG:
SSH ist ein erprobtes Protokoll zur Verschlüsselung einer Shell. Es kann jedoch keine Schwachstellen im zugrunde liegenden System verhindern (sei es nun Linux, Windows oder OS X). Außerdem gibt es von SSH mehrere Versionen (RFC 4250) (Wikipedia Secure Shell). Frühere SSH-Versionen (SSH1) gelten als veraltet und weissen Schwachstellen auf, die in aktuelleren Versionen (SSH2) geschloßen wurden. Wenn ein Fehler im Grundsystem oder gar im OpenSSH liegt, hilft auch keine sichere Shell.
Jeder ist für die Sicherheit seines Systems verantwortlich! Ich werde Tipps geben wie man seinen SSH-Server so sicher wie möglich machen kann. Es kann aber auch für manche soweit gehen, dass sie gar keinen Remote-Zugriff mehr auf ihren SSH-Server besitzen. Um dies zu vermeiden, ist es anfangs zwingend erforderlich, dass sowohl der SSH-Server als auch der SSH-Client physikalisch erreicht werden können. Ich bin gerne behilflich bei allen Fragen, und eigentlich ist es oft besser vorher zu fragen als es auszuprobieren (obwohl ich es persönlich andersherum bevorzuge ), gerade bei einer solchen Remote-Lösung, aber ich distanziere mich trotzdem ausdrücklich von eventuell entstehenden Schäden, falls jemand seine Daten plötzlich im Internet verstreut findet oder nicht mehr diese erreichen kann.
Zur Struktur des Tutorials:
- Remote - Erklärungen, Definitionen
- Vorraussetzungen (Netzwerk, DMZ, ...)
- SSH
- SSH - Allgemein
- SSH-Server manuell einrichten
- Server vorbereiten
- Privat- und PublicKey am Client erzeugen
- Übermittlung der Schlüsseldatei
- manuelle SSH-Konfiguration des Servers
- abschließende optionale SSH-Konfiguration des Clients
- Per SSH Anwendungen tunneln (Port-Forwarding)
- SSH-Server schnell-konfiguriert durch SSH-Helper
- DynamicDNS
- Allgemein Dynamic DNS und dessen Vorteile
- Dynamic DNS - Account einrichten
- Router für DynDNS konfigurieren
- Server mit DynDNS-Dienst einrichten
- die nötige Router bzw. Gateway-Konfiguration
- VNC
- Vergleich SSH und VNC
- VNC - Server
- VNC - Client
- VNC - Optimierung
- Alternativen: KVM-over IP-Lösung
- Abschließende Worte
1. Remote - Erklärungen, Definitionen
Eine Remote-Lösung heisst im engeren Sinne die Fernbedienung eines Objektes. Hierbei konzentriere ich mich aber nur auf die Fernsteuerung eines Computers (hier nur Macintoshs und eigentlich alle *nix-Systeme) durch einen anderen Computer. Es ist das Ziel den Computer über eine sichere Verbindung so zu kontrollieren, dass kein physikalischer Eingriff mehr an dem zu administrierenden PC nötig ist (kein Monitor etc. mehr). Vorraussetzung ist hier, dass zumindest eine Netzwerkanbindung (phys. und log.) vorhanden ist und die gröbsten Einstellungen vorgenommen wurden. D.h. es wurde das Betriebsystem installiert und eine erfolgreiche Verbindung zum Internet oder innerhalb des LANs hergestellt. Es muss mindestens ein User (am besten zwei User) angelegt werden. (Admin-Anwender-Sicherheitskonstruktion). Der Anwender kann und darf kein FileVault-Image nutzen! Denn er wird unser Login für den SSH-Zugriff. Bei FileVault kommt der SSH-Server nicht an die benötigten Dateien. Denn es kann keine Verbindung aufgebaut werden, da das FileVault-Image erst nach dem Login geöffnet wird, und der SSH-Server somit nicht an die nötigen Einstellungen unseres Login-Benutzers gelangt.
Der vorgeschaltete Switch/Router muss umkonfiguriert werden sofern es erwünscht ist, dass der Server auch außerhalb des lokalen Netzes ansprechbar ist, und darauf werd ich auch später noch näher eingehen.
Die Remote-Lösung wäre im Näheren:
Für OpenSSH ist bereits auf OSX- und jedem Unix-System vorinstalliert. Für eine praktikableren Handhabung mit SSH gibt es ein nützliches kostenloses Werkzeug:
Für die einfachste SSH-Lösung (kein manuellen Eingriff nötig)
SSH-Helper (wild aus der Masse heraus gegriffen)
Für die VNC-Remote-Lösung:
VNC-Server
VNC-Viewer
Nun erklär ich "schnell" die Struktur des Ganzen. Damit auch Verständnis für die ganzen Änderungen, die vorgenommen werden müssen aufkommt. Denn wenn man keine Ahnung von dem hat, was man tut, macht man oft die gravierendsten Fehler. (!)
Als Grafik hab ich da etwas schnell hingemalt... im wahrsten Sinne des Wortes.
oder eine nette und alle mal bessere Alternative (6.3.2007) von oscarr:
2. Von Grund auf... Netzwerke, DMZ und so...
In dem Beispiel haben wir unseren Server in Berlin stehen und den Client, also den Rechner mit dem wir auf dem Server zugreifen wollen, in Leipzig, bzw. die Konstruktion streben wir als Ziel an. Anfangs sind beide im gleichen Netzwerk meinetwegen in Berlin.
Bei der Ziel-Vorstellung haben beide unterschiedliche Internet-Anschlüsse und damit unterschiedliche Internet-Provider (nein, ich mach hier keine Werbung ). Und beide Netzwerke haben natürlich jeweils einen anderen Router. Der Router übernimmt folgende Funktionen im privaten Netzwerk: er gibt jedem PC, der sich im privaten Netzwerk anmeldet eine IP-Nummer an hand seiner MAC-Adresse, die den Rechner konkret und einzigartig für das private Netzwerk (max. 254 Client-Rechner) ausweist. Bei mir in Leipzig hat der Client die IP-Nummer 192.168.2.100. Dies ist eine private Netzwerk-IP-Nummer und damit ein Klasse C Netz. Das gleiche ist bei dem Netzwerk in Berlin. Dort hat unser Server die IP-Nummer 192.168.1.2.
Der Router hat eine zweite Funktion. Er verbindet das private Netzwerk Klasse C mit dem außenstehenden Netzwerk, dem Internet. Daher bildet er die Barriere zwischen Internet und Klasse C-Netz. Er bildet somit die demilitarisierte Zone (DMZ). Den Schutz und Abgrenzung eines privaten Netzwerkes zu anderen Klassen-Netzwerken.
Klasse C Netzwerke haben die Subnetzmaskenbereich von 255.255.255.0 bis 255.255.255.254. Dies bedeudet, dass bei einer Subnetzmaske von FF.FF.FF.0 254 Client-Rechner eine IP-Adresse zugeteilt bekommen, zusätzlich kommt eine Adresse für den Broadcast und eine für die Netzadresse um das Netz selbst ansprechen zu können.
Die wären standardmäßig (bei FF.FF.FF.0) FF.FF.FF.0 als Netzadresse und FF.FF.FF.255 als Broadcast-Adresse. Der Router würde als Client mitgezählt werden.
In der Klasse C kann man sich eine beliebige IP-Nummer auswählen, je nachdem ob der Router die freie Wahl dieser zulässt. Aber da die Klasse C eben auf bestimmte Nummern festgelegt ist, ist meistens auch der Router auf diese Nummern festgesetzt. (zusätzliche private Adressbereiche RFC 1597)
Bei der externen IP-Nummer erhält man dagegen eine IP-Adresse, die vom Internet-Anbieter (SIP = Service Internet Provider) festgelegt wurde. Dieser hat auch nur einen Nummernbereich "gekauft" und man bekommt meistens "fast" die gleiche. Es bleibt immer in einem bestimmten Abstand, wenn man ein bisschen darauf achtet. Seine Ausgangs-IP erfährt man am einfachsten z.B. durch Webseiten wie whatismyip.de oder Widgets. Dort wird einfach nur die IP-Nummer ausgegeben mit der man auf die Webseite zugreift.
Mit dieser externen IP-Nummer, die sich mindestens 1mal alle 24 Stunden ändern muss (wird durch den SIP zwangsgetrennt) ist jeder User eindeutig identifizierbar. Daher ist es selten angebracht seine Ausgangs-IP in Chats und dergleichen zu veröffentlichen!
Wenn man in einem anderen Netzwerk (beispielsweise auf Arbeit) ist und zu seinem Netzwerk zuhause zugreifen will, dann brauch man bloss die Ausgangs-IP des Routers daheim. Je nachdem wie dieser konfiguriert ist und welche Dienste laufen kann man dann etwas an Infos erhalten oder komplett abgeblockt werden. In diesem Tutorial geht es darum von seinem Netzwerk in Leipzig auf das Netzwerk in Berlin zuzugreifen, und der Router im Berliner Netzwerk muss auch soweit konfiguriert werden, dass er Zugriffe von außen auf den Server durchlässt. Also haben wir etwas vor uns...
3. SSH
3.1. SSH - Allgemein
Ich beziehe mich hier nur auf OSX-Systeme, aber es handelt sich wie gesagt um den Dienst OpenSSH und das Protokoll SSH2, und dies ist in vielen BSD-Unix-Systemen, wie auch in Debian eingebunden. Es ist auf fast alle *nix-Systeme übertragbar.
Eine SSH-Verbindung kann per Passwort oder mit einem vorgefertigten Zugriffsschlüssel oder beidem geschützt werden. Passwörter über das Netzwerk über sonst wieviele Knotenpunkte zu verschicken bedeutet aber immer ein Sicherheitsrisiko. Außerdem besteht die Problematik, dass Passwörter geknackt werden können durch ein einfaches Skript, welches alle Standard-User und alle Standard-Passwörter durchprobiert. Früher hatte ich etwa 120 SSH-Zugriffe in der Nacht auf meinem Server. Die Skript-Kiddies waren da sehr aktiv und ich mit meinen Gegenmaßnahmen auch.
Ich werde hier den Weg der sicheren SSH-Authentitifizierung erklären. Dabei identitifiziert man seinen Client, mit dem man auf den Server zugreift, mit einer Schlüsseldatei (Keyfile). Diese hat eine von uns gewünschte Verschlüsselung mit einer von uns gewünschten Bitgröße. Durch diese verhindern wir Attacken wie dem bekannten Problem des Man-in-the-Middle-Angriffes(MITM). Wir brauchen uns dann nicht mehr per Passwort und User-ID identifizieren, da dies alles in der Keyfile enthalten sein wird. Dies lässt einmal die Sicherheitslücke des übertragenen Passwortes über das Internet verschwinden, aber andererseits auch die Hackerskript-Versuche, die sehr oft auf eine Passwort-Authentitifizierung setzen. Zusätzlich zur Keyfile können wir ein optionales Passwort setzen. Dies nennt sich im Zusammenhang mit der Keyfile Passphrase, welches die eigentliche Verschlüsselung der Schlüsseldateien bildet. Dazu später mehr.
TIPP: im Terminal man ssh eintippen um sich das Manual zu SSH durchzulesen, und man sshd um zusätzliche Informationen über den SSH-Daemon zu erhalten, der den SSH-Server bildet (oder RFC 4250 pp. wie oben verlinkt).
ssh:
- -l username: l steht für Login, und übermittelt mit der Anfrage den Benutzernamen, mit dem wir versuchen uns auf dem Server einzuloggen.
- -i /ort/der/identity: i steht für identification und mit diesem Parameter kann man einen anderen Ort als den standardmässigen ~/.ssh/id_rsa angeben.
- -p Port: Hier kann ein anderer Port optional angegeben werden, falls der SSH-Server auf einen anderen Port auf Anfragen lauscht.
- -F /ort/der/sshd_config-File: hiermit lässt sich eine andere sshd_config-Datei von unserem Client nutzen.
- -L Startport:Hostname:Zielport: sehr nützlich für IP-Forwarding per SSH (Umleitung eines Startports auf einen Zielport)
Auf dem Server:
Wir gehen in die Systemeinstellungen -> Sharing -> Dienste und aktivieren den Dienst Entfernte Anmeldung. Damit wird der Remote-Zugriff per SSH auf dem Rechner gestattet.
Anfangs sollten beide Computer (Client und Server) in ein und dem selben Netzwerk sein um die SSH-Verbindung testen zu können. Wenn der Dienst aktiviert ist, passt die Firewall die Einstellungen automatisch an, falls diese aktiviert ist. Es wird Port 22 geöffnet für Zugriffe und der SSH-Server gestartet bzw. geht damit einher, und damit können wir uns vom Client auf dem Server einloggen, wenn er im selben Netzwerk ist.
Dazu öffnen wir das Terminal (Ordner Dienstprogramme) und tippen dort ein einfaches
Code:
ssh username@serverip
Code:
ssh -l username serverip
Der username ist selbstverständlich unser Login-User am Server. Die serverip lässt sich beim Server erfahren bei Systemeinstellungen -> Netzwerk -> aktive Netzwerkschnitstelle -> TCP/IP. Oder in der Menüleiste Apfel-> Über diesen Mac -> weitere Informationen -> Netzwerk -> ip4v-IP-Adresse. Dort steht die aktuell durch den Router zugeteilte IP-Nummer. (oder im Terminal ifconfig; en0 = Ethernet- und en1=Airport-Schnittstelle, je nachdem wie man angeschloßen ist)
Höchstwahrscheinlich wird noch nicht viel passieren außer das die Computer sich nun gegenseitig versuchen zu identifizieren. Es werden MAC-Adresse etc. ausgetauscht. Es wird ein einzigartiger Finger-Print am Client, mit dem wir uns auf den SSH-Server verbinden, angezeigt. Dieser Fingerprint informiert uns darüber, ob wir uns auf den richtigen Server verbinden. Dies kennt man vielleicht von Bank-Servern etc., die ihre Fingerprints bei Internet-Banking aufzeigen, damit man sich sicher sein kann auf dem richtigen Bank-Server seine Daten einzugeben.
Wir bestätigen den Server-Fingerprint mit einem yes bei der Nachfrage.
3.2 SSH-Server manuell einrichten
3.2.1 Server vorbereiten
Wir befinden uns also am Server:
Dort öffnen wir das Terminal.
Wenn wir das Terminal öffnen, landen wir wie gewöhnlich im User-Verzeichnis.
Hier sollten wir als erstes ein
Code:
mkdir .ssh
3.2.2 Privat- und PublicKey am Client erzeugen
Wir sind am Client:
Nun wollen wir unsere SSH-Keyfile erzeugen. Bei der SSH-Verschlüsselung liegt bei jedem Unix-System das nützliche kleine Werkzeug ssh-keygen bei. SSH erkennt zwei Algorithmen als Verschlüsselung an, dass ist einmal der RSA- und zum anderen der DSA-Algorithmus.
Welches von beiden besser ist... das ist schwierig. Niemand legt sich so recht fest. RSA-Keys sind länger als DSA. Dadurch angeblich leichter zu knacken als DSA-Keys, weil man bei RSA mehr Daten zur Verfügung hat mit den man händeln kann. DSA-Keys brauchen dafür ihre Zeit bis man sich mit diesen am Server verifiziert hat. Bei RSA erfolgt die eigentliche Arbeit bereits während des Codierens. DSA dagegen brauch einen starken Decodierer. So gilt RSA bei Nutzung eines großen Schlüssels anfangs langsam jedoch bereits bei der Decodierung sehr schnell. DSA wirkt gegenteilig in der Hinsicht.
DSA ist auf jeden Fall nur für SSH2-Server. RSA dagegen ist zweigeteilt in RSA1 und RSA. RSA ist sowohl für SSH1 als auch für SSH2. RSA1 ist nur für SSH1-Server. Man sollte unbedingt RSA1 bzw. das Protokoll SSH1 vermeiden!
In meinem Beispiel werde ich die RSA-Algorithmierung nutzen. Diese lässt sich aber leicht abwandeln zu DSA.
Um einen Schlüssel zu generieren tippen wir ins Terminal folgendes ein:
Code:
ssh-keygen -b 2048 -t rsa
Mit -b legen wir die Bitstärke fest. 1024 Bits sind da Standard. Ich lege gerne doppelt soviel rauf. Damit ist der entstehende Schlüssel 2048 Bits gross (was 2 KB entspricht). Mit -t legen wir den Typen der Algorithmierung fest.
Die Erstellung eines RSA-Keys sollte seine Zeit dauern (ein paar Sekunden). DSA-Schlüssel sind dagegen schneller erstellt wie oben bereits erwähnt.
Nachdem der Schlüssel berechnet wurde, werden wir gefragt, ob wir den Schlüssel in dem vorgeschlagenen Verzeichnis (~/.ssh/id_rsa) speichern wollen. Und das wollen wir, außer dort lagern bereits SSH-Schlüssel für andere Server. Dann sollte man natürlich die Standard-Bezeichnung abändern, indem man den Pfad abtippt und den Schlüsselnamen ändert.
Wir werden außerdem nun gefragt, ob wir einen Passphrase zusätzlich setzen wollen. Ein Passphrase ist eine optionale zusätzliche Identifikationsmethode. Man kann es sich vorstellen, dass der Schlüssel der Ausweis zum Club ist, aber man brauch zusätzlich wenn so gewünscht ein geheimes Passwort um Einlass zu finden. Ohne Passphrase reicht der Ausweis. Wenn wir aber den Ausweis verlieren, verlieren wir auch jeglichen Schutz!
Technisch ausgedrückt ist der Passphrase die Verschlüsselung des Schlüssels. Jedoch ist der Passphrase optional und los gebunden von der Schlüsseldatei.
Diejenigen, die also ein Passphrase setzen wollen, tun dies jetzt. Der Rest, der ohne Passwort-Abfrage dann auf ihren Server zugreifen will, lässt die Eingabe frei mit zweimaligen Drücken von Enter.
Der Schlüssel wurde nun erstellt in dem angegeben Verzeichnis und uns wird auch gleich das Erstellungsdatum sowie den Fingerprint des Schlüssels ausgegeben.
Nun zu näheren Erklärung:
wir haben nun zwei Dateien im ~/.ssh/ Verzeichnis. Standardmässig heisst die eine Datei id_rsa (oder dsa bei DSA-Verschlüsselung) und die andere id_rsa.pub.
id_rsa ist unser privater Schlüssel! Wenn wir diesen an Dritte verlieren, haben wir wirklich ein Problem! Es ist wie gesagt unser Ausweis, unsere Identifikation und sollte unter allen Umständen vor Dritten versteckt bleiben!
id_rsa.pub ist der öffentliche Teil unseres Schlüssels. Das Gegenstück sozusagen von unserer privaten Identifikation. pub ist wie man vielleicht erkennt die Abkürzung für public. Diese Datei wird bei den Servern platziert, wo wir uns identifizieren und um Einlass bitten wollen. Wir werden uns also nur mit unseren Ausweis dort einfinden, wo wir auch unser passendes Gegenstück finden. Somit ist hier der MITM-Angriff nicht mehr existent, da die gesamte Kommunikation dann mit diesen Schlüsseln getätigt wird. (erweiterte Versionen wäre das EKK)
3.2.3 Übermittlung der Schlüsseldatei
Wir sind noch immer am Client:
Nun müssen wir die id_rsa.pub zu unserem Server übermitteln. Es ergeben sich verschiedene Möglichkeiten.
Die einfachste ist per SSH, welches wir vorhin ausprobierten um die Funktionalität zu testen, die Datei zu übermitteln.
Dies ist möglich mit folgender Befehlszeile:
Code:
scp ~/.ssh/id_rsa.pub username@serverip:~/.ssh/authorized_keys
Aber wenn man per Netzwerk die Datei übermittelt und einlesen lässt, kann die authorized_keys mit Zugriffsschlüsseln sprichtwörtlich aufgefüllt werden also ein Sammelbecken für öffentliche Schlüssel bilden.
Dabei wird meinetwegen die id_rsa.pub in eine Freigabe kopiert, oder per scp übertragen mit einer anderen Ziel-Benennung als authorized_keys.
Auf dem Server sollte dann die id_rsa.pub, die in authorized_keys aufgenommen werden soll, im .ssh-Verzeichnis liegen.
Dann tippen ins Terminal:
Code:
cat id_rsa.pub >> authorized_keys
Zuletzt bearbeitet: