|
|
(73 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) |
Zeile 1: |
Zeile 1: |
| = Was ist die Secure Shell? =
| | '''Secure Shell''' ('''SSH''') - [[Kryptografie|kryptographisches]] [[Netzwerkprotokoll]] für den sicheren Betrieb von [[Netzwerkdienst]]en über ungesicherte Netzwerke |
| * Es gab einmal eine Zeit, als Computer im Netz über das [http://de.wikipedia.org/wiki/Telnet Telnet]-Protokoll zugänglich waren.
| |
| * Da dieses Protokoll keine Verschlüsselung bot, wurde das Mitschneiden von Passwörtern zur trivialen Angelegenheit.
| |
| * Um den Fernzugang zu sichern, schrieb Tatu Ylönen Mitte der 1990er eine Programmsuite – bestehend aus Server, Client und Hilfsprogrammen – die er '''ssh''' (''secure shell'') nannte.
| |
| * Später gründete er die Firma [http://www.ssh.com/ ssh.com] und bot die Version 2 der SSH-Suite nur noch kommerziell an.
| |
| * Daraufhin wurde von Entwicklern des Betriebssystems [http://de.wikipedia.org/wiki/OpenBSD OpenBSD] der öffentliche Quellcode der Version 1 [http://de.wikipedia.org/wiki/Abspaltung_%28Softwareentwicklung%29 geforkt].
| |
| * Sie entwickelten das Programm unter dem Namen "OpenSSH" weiter.
| |
| * Diese OpenSSH-Suite wurde fester Bestandteil quasi aller Linux-Distributionen.
| |
| * Drei wichtige Eigenschaften führten zum Erfolg von '''ssh''' :* Authentifizierung der Gegenstelle, kein Ansprechen falscher Ziele
| |
| ** Verschlüsselung der Datenübertragung, kein Mithören durch Unbefugte
| |
| ** Datenintegrität, keine Manipulation der übertragenen Daten
| |
| * Mehr Details zur verwendeten Verschlüsselung finden sich .
| |
| * Falls man sich auf den eigenen Computer hinter einem DSL-Router per SSH einloggen will, muss man zuvor in diesem eine einrichten, sonst kommt keine Verbindung zustande.
| |
|
| |
|
| = Der SSH-Client = | | == Beschreibung == |
| ssh user@sol-1
| | ; Verwendung |
| user@sol-1's password:
| | * Fernzugriff auf Computersysteme |
| Last login: Sun Feb 12 07:38:50 2006 from client.local
| | * Sichere Übertragung von Dateien über nicht vertrauenswürdige Netzwerke |
| Sun Microsystems Inc. SunOS 5.9 Generic_112234-03 November 2002
| | * Entfernte [[Kommandozeile]] |
| bash-2.05$
| | ** auf einer lokalen Konsole werden die Ausgaben der entfernten Konsole ausgegeben |
| | ** lokale Tastatureingaben werden an den entfernten Rechner gesendet |
|
| |
|
| Und schon befindet man sich auf einem anderen System, in diesem Fall mit dem Betriebssystem Solaris.
| | ; Verfügbarkeit |
| ssh server
| | * [[Unixoides System|unixoiden]] Betriebssysteme |
| Password:
| | * [[Microsoft Windows]] |
| Linux vdr 2.4.27-ctvdr-1 #1 Fri Oct 15 18:38:29 UTC 2004 i686 GNU/Linux
| |
| The programs included with the Debian GNU/Linux system are free software;
| |
| the exact distribution terms for each program are described in the
| |
| individual files in /usr/share/doc/*/copyright.
| |
| Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
| |
| permitted by applicable law.
| |
| You have new mail.
| |
| Last login: Sun Feb 12 07:38:23 2006 from client.local
| |
| user@server:~$
| |
|
| |
|
| Oder auf einem anderen Linux-System.
| | ; Ziele |
| * Wie man sieht, ist die Angabe des Benutzernamens optional, wenn er auf beiden Systemen gleich ist. | | Authentifizierung |
| * Man kann auch einfach einen Befehl anhängen, der anstelle der Terminal-Session ausgeführt wird. | | * Authentifizierung der Gegenstelle |
| * Nach der Ausführung des Befehls wird die SSH-Session dann automatisch beendet: | | * Kein Ansprechen falscher Ziele |
| ssh server cat /etc/issue
| | Vertraulichkeit |
| Password:
| | * Kryptografie der Datenübertragung |
| Debian GNU/Linux 3.1 \n \l
| | Integrität |
| | * Keine Manipulation der übertragenen Daten |
|
| |
|
| Oder etwas komplizierter - eine Datensicherung machen ("backup"):
| | ; Port Zuordnung |
| $ ssh root@server 'cd /etc; tar czvf - network/' | cat > etc_network_backup.tar.gz
| | * [[Internet Assigned Numbers Authority|IANA]] |
| Password:
| | * [[Transmission Control Protocol|TCP]]-[[Port (Protokoll)|Port]] 22 |
| network/
| | * [[User Datagram Protocol|UDP]]-Port 22 |
| network/interfaces
| | * [[Stream Control Transmission Protocol|SCTP]]-Port 22 |
| network/if-post-down.d/
| |
| network/if-pre-up.d/
| |
| network/if-up.d/
| |
| network/if-down.d/
| |
| network/options
| |
| network/interfaces.pre-etherconf
| |
| network/interfaces.1
| |
| network/run
| |
| Bei einer langsamen Verbindung empfiehlt sich zusätzlich die Benutzung der Option <tt>-C</tt> (großes C), die zusätzlich zur Verschlüsselung eine transparente Kompression der übertragenen Daten aktiviert.
| |
| * Bei einer schnellen Verbindung wird die Kompression aber vermutlich bremsen. | |
| * Woher weiß man nun aber, dass man tatsächlich mit dem richtigen Rechner verbunden ist, und nicht ein Angreifer die Verbindung umgeleitet hat? Dafür gibt es den Host-Schlüssel, der jeden SSH-Server eindeutig identifiziert. | |
| * Greift man zum ersten Mal auf einen bestimmten Server zu, kennt man diesen Schlüssel natürlich noch nicht. (Außer man hat ihn sich auf anderen Wegen im Voraus besorgt.)
| |
| ssh server
| |
| The authenticity of host 'server (192.168.1.5)' can't be established.
| |
| ECDSA key fingerprint is b5:0e:ec:b7:16:06:e6:24:a6:39:18:58:4e:ec:3b:d1.
| |
| Are you sure you want to continue connecting (yes/no)? yes
| |
| Warning: Permanently added 'server' (ECDSA) to the list of known hosts.
| |
| Password:
| |
|
| |
|
| Wenn gerade in diesem Moment jemand die Verbindung gekapert hat, hat man natürlich Pech, außer man kann den Administrator des Servers nach dem richtigen Fingerprint des Host-Schlüssels fragen.
| | ; [[Client-Server-Modell|Client–Server]]-Architektur |
| * Den ECDSA-Fingerprint eines Servers kann man mit dem Systemprogramm '''ssh-keygen''' erfahren:
| | Eine SSH-Client-Anwendung verbindet sich mit einem SSH-Server |
| ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key.pub -l
| | ;Protokollspezifikation |
| gibt den Fingerprint und einige weitere Informationen aus, zum Beispiel <tt>256 b5:0e:ec:b7:16:06:e6:24:a6:39:18:58:4e:ec:3b:d1 root@server (ECDSA)</tt>.
| | * SSH-1 |
| * Wenn man auf Nummer sicher gehen möchte, lässt man sich vom Administrator des Servers diese Ausgabe mitgeben (evtl. | | * SSH-2 |
| * ausdrucken) und kann dann beim ersten Verbindungsversuch überprüfen, ob man sich tatsächlich zum richtigen SSH-Server verbunden hat und nicht zu einem dazwischengeschalteten Angreifer. | |
|
| |
|
| Bei allen weiteren Kontakten stellt das '''ssh'''-Programm jedoch von nun an über asymmetrische Kryptografie sicher, dass der Server auch über den richtigen öffentlichen Schlüssel verfügt, der zum öffentlichen, in der Datei '''~/.ssh/known_hosts''' abgelegten passt, und verweigert im Zweifelsfall den Verbindungsaufbau.
| | ; Fernwartung |
| | * Genutzt werden kann dies z. B. zur [[Fernwartung]] eines in einem entfernten Rechenzentrum stehenden [[Server]]s. |
| | * Die neuere Protokoll-Version SSH-2 bietet weitere Funktionen wie [[Datenübertragung]] per [[SSH File Transfer Protocol|SFTP]]. |
|
| |
|
| Sollte sich dieser Schlüssel einmal aus legitimen Gründen geändert haben, bspw.
| | Ersatz für Telnet |
| * weil das System neu aufgesetzt wurde, muss man den entsprechenden veralteten Schlüssel erst einmal auf dem Client mit dem Befehl | | * Bestandteil aller Linux- und Unix-Distributionen |
| ssh-keygen -R hostname
| | * Dabei dient SSH als Ersatz für andere, unsichere Methoden wie [[Telnet]]. |
| | * Bei diesen werden alle Informationen, auch sensible wie etwa [[Passwort|Passwörter]], im [[Klartext (Kryptografie)|Klartext]] übertragen. |
| | * Dies macht sie anfällig für [[Man-in-the-Middle-Angriff]]e sowie einen Vertraulichkeitsverlust durch [[Sniffer|Packet Analyzer]], die die [[Datenpaket]]e mitschneiden. Die [[Kryptografie]]stechnik, die durch SSH genutzt wird, hat deshalb den Zweck, die Vertraulichkeit, Integrität und Authentizität von Daten, die über ein unsicheres Netzwerk (wie z. B. das [[Internet]]) gesendet werden, sicherzustellen. |
|
| |
|
| aus der '''known_hosts'''-Datei entfernen.
| | == Siehe auch == |
| | * [[OpenSSH]] |
| | {{Special:PrefixIndex/SSH}} |
|
| |
|
| Sollte die Verbindung nicht mehr reagieren, zum Beispiel wenn der SSH-Server heruntergefahren wurde, lässt sich der ssh-Client mit der Eingabe von "<tt>~.</tt>" (nacheinander) beenden.
| | === Sicherheit === |
| | # [[SSH/Kryptografie]] |
|
| |
|
| '''Hinweis'''
| | === Dokumentation === |
| Wer einen Windows-Desktop benutzt und über das SSH-Protokoll auf eine Linux-Maschine zugreifen will, kann das Programm nutzen.
| | ==== RFC ==== |
| | | {| class="wikitable sortable options" |
| = Benutzeroberflächen = | | |- |
| Wem es zu mühsam ist, auf der Kommandozeile die SSH-Verbindung zu einem Server aufzubauen, der sucht vielleicht ein grafisches Programm, um Verbindungsdaten zu verwalten.* - gibt es sowohl für Linux als auch für Windows.
| | ! RFC !! Title |
| * Das Programm ist in den offiziellen Paketquellen enthalten.
| | |- |
| * [http://sourceforge.net/projects/pacmanager PAC Manager] - ('''Perl''' '''A'''uto '''C'''onnector) nicht in den offiziellen Paketquellen enthalten, aber über SourceForge wird ein Fremdpaket angeboten, das manuell installiert werden kann.
| | | 4251 || [https://tools.ietf.org/html/rfc4251 The Secure Shell (SSH) Protocol Architecture ] |
| * [http://sourceforge.net/projects/gnome-rdp Gnome-RDP] - mit diesem Programm kann man nicht nur [http://de.wikipedia.org/wiki/Remote_Desktop_Protocol RDP]- und -Verbindungen aufbauen, sondern auch SSH-Terminalsitzungen.
| | |- |
| * Leider kann man in der aktuellen Version die Zugangspasswörter nicht speichern lassen und keine Angaben zum verwendeten Port machen.
| | | 4252 || [https://tools.ietf.org/html/rfc4252 The Secure Shell (SSH) Authentication Protocol ] |
| * Es funktioniert somit nur mit Servern, die den Standard-SSH-Port <tt>22</tt> nutzen.
| | |- |
| * In den offiziellen Paketquellen enthalten, benötigt aber [http://de.wikipedia.org/wiki/Mono-Projekt Mono] als Voraussetzung.
| | | 4253 || [https://tools.ietf.org/html/rfc4253 The Secure Shell (SSH) Transport Layer Protocol ] |
| | | |- |
| == .ssh/config == | | | 6668 || [https://tools.ietf.org/html/rfc6668 SHA-2 Data Integrity Verification for the Secure Shell (SSH) Transport Layer Protocol ] |
| Wenn man sich auf der Konsole mit einem anderen Server verbinden möchte, muss man evtl.
| | |- |
| * zum Beispiel Port und Benutzernamen angeben.
| | | 8268 || [https://tools.ietf.org/html/rfc8268 More Modular Exponentiation (MODP) Diffie-Hellman (DH) Key Exchange (KEX) Groups for Secure Shell (SSH) ] |
| * Um das Ganze zu vereinfachen, kann man Voreinstellungen für ssh in der config-Datei '''$HOME/.ssh/config''' hinterlegen.
| | |- |
| * Hier ein Beispiel:
| | | 8308 || [https://tools.ietf.org/html/rfc8308 Extension Negotiation in the Secure Shell (SSH) Protocol ] |
| | |
| # '''ssh (secure shell) configuration file'''
| |
| Host test1
| |
| HostName 123.456.789.0
| |
| Port 980
| |
| User MeinBenutzerName
| |
|
| |
| Host test2
| |
| HostName test.mynet.local
| |
| User test
| |
| CheckHostIP no
| |
| Cipher blowfish
| |
|
| |
| Host foobar
| |
| HostName domain.tld
| |
| Port 55550
| |
| User fanta
| |
| IdentityFile ~/.ssh/private_ssh_key_rsa
| |
| | |
| ssh MeinBenutzerName@123.456.789.0 -p980
| |
| | |
| ssh test1
| |
| | |
| für einen Verbindungsaufbau.
| |
| * Alle Parameter, die man verwenden kann, findet man unter [http://www.openbsd.org/cgi-bin/man.cgi?query=ssh_config openbsd.org] oder in der von '''ssh_config'''.
| |
| | |
| = Dateitransfer = | |
| Wenn man also ein Protokoll hat, das so sicher wie nach dem heutigen Stand der Technik möglich Daten durch einen verschlüsselten Kanal senden und empfangen kann, dann wäre es wohl Verschwendung, dieses Protokoll nur für interaktive Terminal-Sessions zu benutzen.
| |
| * Sehr häufig möchte man bspw.
| |
| * einfach nur Dateien sicher von einem System zum anderen bewegen.
| |
| * Dafür existieren verschiedene Programme der grafischen Benutzeroberfläche sowie gleich zwei Terminalbefehle nämlich '''scp''' und '''sftp'''.
| |
| | |
| === Transfer von der Kommandozeile === | |
| ==== scp ==== | |
| Das Kommandozeilenwerkzeug '''scp''' funktioniert in etwa so wie das normale Unix-Kommando '''cp''', nur dass es über Systemgrenzen hinweg funktioniert.
| |
| * Jedes Datei- oder Verzeichnisargument kann dabei optional, getrennt durch einen Doppelpunkt, durch einen vorangestellten Benutzer- oder Hostnamen ergänzt werden.
| |
| * Dabei werden weggelassene Teile durch den aktuellen Benutzernamen, ''localhost'' oder das Homeverzeichnis (oder das aktuelle Verzeichnis) ergänzt, etwa so:
| |
| scp benutzerx@server1:datei1 datei2 benutzery@server2:
| |
| | |
| In diesem Beispiel wurde die ''datei1'' aus dem Homeverzeichnis von ''benutzerx'' auf ''server1'' und die ''datei2'' aus dem aktuellen Verzeichnis des lokalen Hosts in das Homeverzeichnis von ''benutzery'' auf ''server2'' kopiert.
| |
| | |
| Der Befehl '''scp''' versteht auch einige von bekannte Optionen, bspw. <tt>-r</tt> für das rekursive Kopieren ganzer Verzeichnisbäume.
| |
| * Bedauerlicherweise unterstützt '''scp''' aber nicht alle '''cp'''-Optionen, die für das exakte Klonen von Verzeichnissen, inkl.
| |
| * aller Dateirechte und symbolischen Verknüpfungen notwendig sind.
| |
| * Für die exakte Replikation sollte deswegen entweder das Werkzeug <tt>rsync -e ssh</tt> genutzt werden (man beachte die Handbuchseite zu diesem Tool) oder der oben schon genutzte Trick mit '''tar''' und einer Pipe.
| |
| ssh root@server 'cd verzeichnis; tar czvf - verz./dateien' | tar xzf -
| |
| | |
| ==== sftp ====
| |
| Die andere Möglichkeit des Dateitransfers lautet '''sftp'''.
| |
| * Das funktioniert genau so wie der normale Kommandozeilen-FTP-Client:
| |
| | |
| sftp server
| |
| | |
| Connecting to server...
| |
| user@server's password:
| |
| sftp> pwd
| |
| Remote working directory: /export/home/user
| |
| sftp> dir
| |
| [...]
| |
| wichtige_datei.txt
| |
| [...]
| |
| sftp> get wichtige_datei.txt
| |
| Fetching /export/home/user/wichtige_datei.txt to wichtige_datei.txt
| |
| /export/home/user/wichtige_datei.txt 100% 62KB 62.2KB/s 00:00
| |
| sftp> quit
| |
| | |
| Mit dem Befehl '''help''' bekommt man eine Übersicht über die möglichen Kommandos.
| |
| | |
| === Entfernte Dateisysteme einbinden ===
| |
| Man kann das Dateisystem eines entfernten Rechners in sein eigenes Dateisystem mittels einbinden.
| |
| * Damit ist eine transparente Nutzung von Dateien auch über unsichere Netze hinweg möglich.
| |
| | |
| === Grafische Programme zum Dateitransfer ===
| |
| ==== Gnome/Ubuntu ====
| |
| Der Gnome-Dateimanager unterstützt das SSH-Protokoll von Haus aus.
| |
| * Dazu benutzt man eine Adresse der Form <tt>ssh://rechnername/pfad</tt>, um über SSH die Dateien auf dem angegebenen Rechner zu sehen.
| |
| * Wenn man sich als ein anderer Benutzer anmelden möchte, verwendet man stattdessen eine Adresse der Form <tt>ssh://andererbenutzer@rechnername/pfad</tt>.
| |
| * Alternativ können auch die Hosts aus der <tt>~/.ssh/config</tt> verwendet werden.
| |
| * Dort lassen sich auch noch andere SSH-Einstellung, wie.
| |
| * z.B SSH-Keys, definieren.
| |
| * Der Zugriff erfolgt mit <tt>ssh://hostname</tt>.
| |
| * Diese Adressen funktionieren übrigens auch in einigen anderen Gnome-Anwendungen.
| |
| | |
| ==== KDE/Kubuntu ====
| |
| Auch bei KDE ist SSH-Unterstützung eingebaut: Mit einer Adresse der Form '''fish://rechnername/pfad''' kann man auf die Dateien auf einem anderen Rechner zugreifen, und mit''' fish://andererbenutzer@rechnername/pfad''' meldet man sich als anderer Benutzer auf dem Zielrechner an.
| |
| * Dies funktioniert im sowie in allen KDE-Anwendungen.
| |
| | |
| Man kann also beispielsweise im Malprogramm via ''Datei'' -> ''Öffnen..'' und dann oben in der Adresszeile eine ''fish://''-Adresse eingeben, um direkt ein Bild auf einem anderen Rechner anzusehen oder zu bearbeiten.
| |
| * Im Dateimanager (Kubuntu-Standard) können über das Bookmark "Netzwerk" und den Assistenten "Netzwerkordner hinzufügen" neue ssh-basierte Netzwerkordner als feste Bookmarks erstellt werden.
| |
| | |
| Wenn der Zielrechner ebenfalls ein UTF-8 codiertes Dateisystem hat, sind gegebenenfalls die Umlaute falsch angezeigt.
| |
| * Um dies zu ändern, muss man im Konqueror eine fish-Adresse aufrufen und kann nun unter ''"Extras -> Entfernte Zeichencodierung wählen..."'' die entsprechende Codierung einstellen.
| |
| * Diese Einstellung ist fortan auch in Dolphin gültig.
| |
| * Diese Option einzustellen wird in KDE4 vermutlich in Dolphin selbst möglich sein.
| |
| | |
| ==== Xfce/Xubuntu ====
| |
| Der Xfce-Dateimanager unterstützt das SSH-Protokoll wie Nautilus unter GNOME.
| |
| * Siehe .
| |
| | |
| ==== Weitere grafische Programme ====
| |
| Die meisten grafischen FTP-Clients () unterstützen auch sftp oder scp über das SSH-Protokoll.
| |
| * Beim Gnome FTP-Cient etwa muss man unter ''"FTP -> Optionen -> Netz -> Voreingestelltes Protokoll"'' in der Drop-Down-Liste '''SSH2''' an Stelle von '''FTP''' auswählen.
| |
| * Leider hat '''gftp''' Probleme, wenn man neben Passwörtern auch ''Public-Keys'' (siehe ) benutzt.
| |
| * Das funktioniert nur mit dem SSH-Agenten (ebenfalls weiter unten beschrieben) und der Einstellung "Benötige SSH Benutzername/Passwort nicht" in ''"FTP -> Optionen -> SSH"''.
| |
| | |
| SSH-Verbindungen zu Datenverzeichnissen auf Fremdrechnern unterstützen auch Datensynchronisationsprogramme wie und Backupprogramme wie Keep.
| |
| | |
| == X-Forwarding ==
| |
| Mit dem ''X11-Forwarding'' kann man auch grafische Programme, die man über SSH auf einem anderen Rechner startet, auf dem eigenen Display anzeigen lassen, und zwar unabhängig davon, welches Betriebssystem auf dem entfernten Rechner läuft (siehe Bild.)
| |
| | |
| Das Programm muss sich nur an den X11-Standard halten, was leider die meisten Windows- und Mac-Programme ausschließt.
| |
| | |
| Um das X11-Forwarding zu aktivieren, muss man dem '''ssh'''-Befehl die Option <tt>-X</tt> '''(großes X)''' hinzufügen, die dem Programm eingeschränkte Rechte am eigenen Display einräumt.
| |
| | |
| Für den Fall, dass es zu einem Programmabbruch kommt, weil diese eingeschränkten Rechte nicht ausreichen, existiert noch die Option <tt>-Y</tt>, die dem Programm volle Rechte gewährt.
| |
| | |
| Diese sollte man jedoch nicht verwenden, wenn man dem Administrator des entfernten Rechners nicht vertraut, denn sie öffnet einen Tunnel, der auch in der umgekehrten Richtung für einen Angriff auf das eigene Display genutzt werden könnte.
| |
| | |
| Vorsicht: mit der Option <tt>-x</tt> '''(kleines x)''' wird X11-Forwarding deaktiviert.
| |
| | |
| Hinweis: bei Nutzung von VNC (zum Beispiel für Fernwartung) muss auf dem Server X11VNC installiert sein.
| |
| | |
| Einen deutlichen Geschwindigkeitszuwachs erreicht man durch die Wahl einer anderen Verschlüsselung und der Aktivierung der Kompression der Daten für langsame Verbindungen (DSL, etc.) mit diesen zusätzlichen Optionen im Aufruf von ssh: '''-c arcfour,blowfish-cbc -XC'''.
| |
| * Beispiele:
| |
| | |
| Öffnen des Programms und andere: ssh -X user@server lxpanel &
| |
| | |
| Da Panel-Programme in der Regel nicht über eine Funktion "schließen" verfügen kann man diese zum Beispiel mittels schließen.
| |
| | |
| === Serverkonfiguration ===
| |
| Dies sollte in der Regel nicht notwendig sein.
| |
| * Auf dem Server muss hierfür das Paket '''xauth '''installiert werden, wenn es das noch nicht ist.
| |
| * Außerdem muss dem SSH-Daemon des Servers mitgeteilt werden, dass X-Forwarding verwendet wird.
| |
| * Das wird über die Konfigurationsdatei '''/etc/ssh/sshd_config''' erledigt.
| |
| * Dort werden die Optionen:
| |
| | |
| X11Forwarding yes
| |
| X11UseLocalhost no
| |
| | |
| gesetzt.
| |
| * Danach ist ein Neustart des Daemons erforderlich.
| |
| | |
| Zusätzlich müssen in der Client-Konfigurationsdatei '''/etc/ssh/ssh_config''' die Einträge:
| |
| | |
| ForwardX11 yes | |
| | |
| und
| |
| | |
| ForwardX11Trusted yes
| |
| | |
| durch Entfernen von <tt> #</tt> am Zeilenanfang einkommentiert werden.
| |
| | |
| == SSH-Tunnel ==
| |
| Wenn man mit Hilfe von SSH so ein nicht ganz triviales Protokoll wie X-Window tunneln kann, dann muss das doch auch mit anderen Protokollen funktionieren, oder? - Aber sicher geht das.
| |
| * Allerdings ist die Syntax für den SSH-Tunnelbau ein wenig verwirrend:
| |
| | |
| ssh -L [bind_address:]port:host:port user@server
| |
| ssh -R [bind_address:]port:host:port user@server
| |
| | |
| Hierbei richtet die Option <tt>-L</tt> laut Dokumentation eine ''lokale'', und die Option '-R' eine ''entfernte'' (englisch ''remote'') Port-Weiterleitung ein.
| |
| | |
| Der verschlüsselte Tunnel wird dabei '''immer''' zwischen dem eigenen Rechner und ''server'' hergestellt.
| |
| * Die Verbindung vom ''Ende des Tunnels'' zu ''host'' läuft dagegen unverschlüsselt ab, und wird aus Sicht des betreffenden Systems angegeben, weswegen man ''host'' in den allermeisten Fällen wohl auf ''"localhost"'' setzen sollte.
| |
| * Hierbei darf ''"localhost"'' nicht mit dem lokalen Rechner verwechselt werden.
| |
| | |
| Es handelt sich um ''"localhost"'' von ''server'' aus betrachtet, daher um den Server selbst.
| |
| | |
| Die Option <tt>-L</tt> oder <tt>-R</tt> gibt dabei die Richtung an, aus der der Tunnel benutzt werden kann.
| |
| * Bei <tt>-L</tt> vom eigenen Rechner zum entfernten hin, bei <tt>-R</tt> in der entgegengesetzten Richtung. (Das merkt man sich am Besten als norma'''L''' und '''R'''ückwärts.)
| |
| | |
| Das erste ''port''-Argument bezeichnet dabei den Einstiegsport in die Verbindung.
| |
| * Zu beachten ist hierbei, dass die Öffnung eines ''privilegierten'' Ports, also unter 1024, nur dem Superuser ''root'' gestattet ist.
| |
| * Man sollte also auf die höheren Ports ausweichen.
| |
| | |
| Mit dem optionalen Parameter ''bind_address'' kann man festlegen, auf welchen Netzwerkschnittstellen die Weiterleitung laufen soll, wobei ''localhost'' der Standard ist.
| |
| | |
| Ein ''' *''' oder ein leeres ''bind_address''-Argument vor dem Doppelpunkt bedeutet, dass die Weiterleitung an allen Schnittstellen läuft.
| |
| * Möglicherweise funktioniert das nicht auf jedem Ubuntu-System auf Anhieb, da die IPv6-Adresse das irgendwie verhindert, weshalb man den SSH-Tunnel mit dem Argument '''-4''' auf die IPv4-Schnittstellen beschränken muss.
| |
| | |
| Der zweite ''port''-Parameter gibt schließlich an, auf welchen Port von ''host'' die Weiterleitung gehen soll.
| |
| | |
| Ein weiteres nützliches Argument ist die Option <tt>-N</tt>, die das Erzeugen einer Terminal-Sitzung auf dem entfernten System unterbindet, wenn man nur die Port-Weiterleitung benutzen möchte.
| |
| | |
| === Beispiele ===
| |
| Weiterleitung von Port 8000 auf dem lokalen System an den Webserver (Port 80) auf ''server'':
| |
| | |
| ssh -L 8000:localhost:80 server -N &
| |
| netstat -anp --inet | egrep '(^Proto|8000)'
| |
| Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
| |
| tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 10843/ssh
| |
| fg
| |
| ssh -L 8000:localhost:80 server -N
| |
| [Strg-C]
| |
| Killed by signal 2.
| |
| | |
| Dasselbe, aber es wird nicht nur vom lokalen Host weitergeleitet, sondern von allen Schnittstellen (hierzu ist die Option <tt>GatewayPorts</tt> in der Server-Konfiguration entsprechend zu setzen, genaueres zu finden in der Manpage; man wähle diese Option mit Bedacht!):
| |
| | |
| ssh -L *:8000:localhost:80 server -N -4 &
| |
| netstat -anp --inet | egrep '(^Proto|8000)'
| |
| Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
| |
| tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 10906/ssh
| |
| | |
| Umgekehrte Richtung.
| |
| * Benutzern auf ''server'' wird ermöglicht, über ''localhost:3306'' auf den MySQL-Server auf ''client'' zuzugreifen:
| |
| | |
| ssh -R 3306:localhost:3306 server
| |
| Last login: Sat Mar 11 23:24:20 2006 from 192.168.4.56
| |
| netstat -an --inet | egrep '(^Proto|3306)'
| |
| Proto Recv-Q Send-Q Local Address Foreign Address State
| |
| tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
| |
| exit
| |
| logout | |
| Connection to server closed.
| |
| | |
| Zur Veranschaulichung folgt hier noch einmal eine grafische Darstellung dieser Beispiele:
| |
| | |
| Doppelter SSH-Tunnel über zwei Konsolen:
| |
| | |
| supportpc$ ssh -L 54321:localhost:54321 zwischennutzer@zwischen
| |
| zwischen$ ssh -L 54321:localhost:8080 zielnutzer@ziel
| |
| | |
| SSH-Tunnel über Zwischenrechner mit Zielrechner verbinden:
| |
| | |
| supportpc$ ssh -L 54322:ziel:22 zwischennutzer@zwischen
| |
| | |
| == Verschlüsselungsdetails ==
| |
| === Symmetrische Verschlüsselung ===
| |
| Wer als Laie an Verschlüsselung denkt, der denkt meist an die "symmetrische Verschlüsselung".
| |
| * Hierbei gibt es genau einen Schlüssel, mit dem ein Datensatz verschlüsselt wird.
| |
| | |
| Nur wer diesen Schlüssel kennt (oder durch Probieren herausfindet) kann die Verschlüsselung umkehren und den Klartext wieder extrahieren.
| |
| | |
| Bekannte und bewährte Algorithmen wie TripleDES, AES und Blowfish machen das Erraten des Schlüssels natürlich nicht gerade leicht, genauer gesagt, nach dem heutigen Stand der Technik nahezu unmöglich.
| |
| | |
| Das einzige Problem bei der Benutzung von ''symmetrischer Verschlüsselung'' ist, den Schlüssel sicher zum Kommunikationspartner zu befördern.
| |
| | |
| === Asymmetrische Verschlüsselung ===
| |
| Um dieses Problem der ''symmetrischen Verschlüsselung'' zu umgehen, gelang es Forschern schon vor einiger Zeit, das gemeinsame Geheimnis, das für eine erfolgreiche Ver- und Entschlüsselung nötig ist, so hinter komplizierten Algorithmen zu verbergen, dass man es unter bestimmten Bedingungen öffentlich verteilen konnte.
| |
| | |
| Bei diesem Verfahren, ''asymmetrische Verschlüsselung'' genannt, wird nicht ein Schlüssel erzeugt, sondern ein Schlüsselpaar, das mathematisch voneinander abhängt, aber nicht ohne sehr viel Aufwand voneinander abgeleitet werden kann.
| |
| | |
| Jeweils zwei zueinander passende Schlüssel wirken auf geradezu magische Weise genau entgegengesetzt: Was mit dem einen Schlüssel verschlüsselt wird, kann '''nur''' durch den anderen Schlüssel wieder entschlüsselt werden.
| |
| | |
| Dies ermöglicht es, einen der beiden Schlüssel öffentlich zur Verfügung zu stellen, um Sendungen zu verschlüsseln, die man aber '''einzig und allein''' mit dem anderen Schlüssel, den man niemals weitergibt, entschlüsseln kann.
| |
| | |
| Im Gegenzug kann man ein Datenpaket auch mit dem eigenen privaten Schlüssel chiffrieren.
| |
| * Wenn dieser Chiffretext sich dann mit dem öffentlichen Schlüssel wieder in Klartext zurückverwandeln lässt, weiß jeder, dass die Nachricht nur vom Besitzer des privaten Schlüssels kommen kann.
| |
| | |
| Diese Anwendungsmöglichkeit nennt man ''digitale Signatur''.
| |
| | |
| Da der Umgang mit asymmetrischen Verschlüsselungsalgorithmen wie RSA oder DSA signifikant mehr Rechenleistung erfordert als mit symmetrischen, ist es gängige Praxis, am Beginn der Kommunikation mit Hilfe des öffentlichen Schlüssels einen neu generierten, symmetrischen ''Session-Schlüssel'' auszutauschen und für den Rest der Kommunikation auf symmetrische Verschlüsselung umzusteigen.
| |
| | |
| == Links ==
| |
| * The Secure Shell (SSH) Protocol Architecture http://www.ietf.org/rfc/rfc4251.txt
| |
| * Video vom Vortrag Ubuntu im sicheren Netz - Ubucon 2011 http://www.youtube.com/watch?v=Hxsl-jj2Bq0
| |
| * Putting the Secure in SSH - Tipps und Tricks für sicheres SSH.
| |
| * Blogbeitrag, 11/2014http://thepcspy.com/read/making-ssh-secure/
| |
| * Mosh - auf SSH aufsetzende Lösung für den Fernzugriff auf andere Rechnerhttps://wiki.ubuntuusers.de/Mosh/
| |
| * [http://www.harding.motd.ca/autossh/ autossh] - Monitor für SSH-Verbindungen mit Reconnect-Möglichkeit (in den Paketquellen enthalten)http://www.harding.motd.ca/autossh/
| |
| * Portweiterleitung - DSL-Router für SSH freischaltenhttps://wiki.ubuntuusers.de/Portweiterleitung/
| |
| * SSH Reverse Tunnel oder wie mache ich ein Loch in die Firewall - Reverse SSH (keine Portweiterleitung nötig)http://www.codejungle.org/site/SSH+Reverse+Tunnel+oder+wie+mache+ich+ein+Loch+in+die+Firewall.html
| |
| | |
| = OpenSSH client =
| |
| == Configuration ==
| |
| If you have a file containing known_hosts using RSA or ECDSA host key algorithm and the server now supports ed25519 for example, you will get a warning that the host key has changed and will be unable to connect.
| |
| * This means you will have to verify the new host key.
| |
| | |
| The following configurations expect a recent OpenSSH client, as updating OpenSSH on the client side is generally not an issue.
| |
| | |
| === Modern ===
| |
| This configuration is less compatible and you may not be able to connect to some servers which use insecure, deprecated algorithms.
| |
| * Nevertheless, modern servers will work just fine.
| |
| | |
| File: <tt>~/.ssh/config</tt>
| |
| | |
| # Ensure KnownHosts are unreadable if leaked - it is otherwise easier to know which hosts your keys have access to. | |
| HashKnownHosts yes
| |
| # Host keys the client accepts - order here is honored by OpenSSH
| |
| HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-ed25519,ssh-rsa,ecdsa-sha2-nistp521-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256
| |
| | |
| KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
| |
| MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
| |
| Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
| |
| | |
| === Intermediate (connects to older servers) ===
| |
| This configuration can connect to older OpenSSH servers which run old or intermediate configurations.
| |
| | |
| File: <tt>~/.ssh/config</tt>
| |
| | |
| # Ensure KnownHosts are unreadable if leaked - it is otherwise easier to know which hosts your keys have access to.
| |
| HashKnownHosts yes
| |
| # Host keys the client accepts - order here is honored by OpenSSH
| |
| HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-ed25519,ssh-rsa,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256
| |
| | |
| == Key generation ==
| |
| Large key sizes are used as SSH keys are not renewed very often (see also [https://wiki.mozilla.org/Security/Key_Management Security/Key_Management]).
| |
| | |
| <div >'''''Note:''' ''</div>
| |
| | |
| <div >''DSA and RSA 1024 bit (or lower) keys are considered weak and should be replaced as soon as possible. ''</div>
| |
| | |
| Don't hesitate to create multiple different keys for different usages.
| |
| * In particular, never mix your personal and Mozilla keys.
| |
| | |
| # RSA keys are favored over ECDSA keys when backward compatibility ''is required'', | |
| # thus, newly generated keys are always either ED25519 or RSA (NOT ECDSA or DSA).
| |
| $ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_mozilla_$(date +%Y-%m-%d) -C "Mozilla key for xyz"
| |
| | |
| # ED25519 keys are favored over RSA keys when backward compatibility ''is not required''.
| |
| # This is only compatible with OpenSSH 6.5+ and fixed-size (256 bytes).
| |
| $ ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_mozilla_$(date +%Y-%m-%d) -C "Mozilla key for xyz"
| |
| | |
| You may then want to add the new key to your SSH agent or your configuration file (or both).
| |
| | |
| # Add key to ssh-agent
| |
| $ ssh-add ~/.ssh/id_..._mozilla... # <= replace by your key's path
| |
| # Add configuration to ~/.ssh/config
| |
| host *.mozilla.com
| |
| IdentityFile ~/.ssh/id_...mozilla... # <= replace by your key's path
| |
| | |
| === Protection of user keys ===
| |
| * Protected by strong passphrase.
| |
| * Never copied to another system than your own workstation/personal physical disks/tokens.
| |
| * Use SSH forwarding or SSH tunneling if you need to jump between hosts. '''DO NOT''' maintain unnecessary agent forwarding when unused.
| |
| | |
| === Protection of machine keys ===
| |
| When SSH keys are necessary for automation between systems, it is reasonable to use passphrase-less keys. * The recommended settings are identical to the user keys.
| |
| * The keys must be accessible only by the admin user (root) and/or the system user requiring access.
| |
| * Usage of machine keys should be registered in an inventory (a wiki page, ldap, an inventory database), to allow for rapid auditing of key usage across an infrastructure.
| |
| * The machine keys should be unique per usage.
| |
| * Each new usage (different service, different script called, etc.) should use a new, different key.
| |
| * Only used when strictly necessary.
| |
| * Restrict privileges of the account (i.e.
| |
| * no root or "sudoer" machine account).
| |
| * Using a ForceCommand returning only the needed results, or only allowing the machine to perform SSH-related tasks such as tunneling is prefered.
| |
| * Disable sftp if not needed as it exposes more surface and different logging mechanisms than SSH (and thus scp) itself.
| |
| | |
| <div >'''''Note:''' ''</div>
| |
| | |
| <div >''You may want to use the group "users" instead of "sftpusers" in the example below as this may already exist and include all regular users by default. ''</div>
| |
| | |
| # groupadd sftpusers
| |
| # usermod -a -g sftpusers <userthat_needs_ftp>
| |
| # chgrp sftpusers /usr/lib/ssh/sftp-server
| |
| # chmod 0750 /usr/lib/ssh/sftp-server
| |
| | |
| ==== Multi-factor bypass setup for machine keys ====
| |
| Machine keys do not play well with multi-factor authentication as there is no human interaction. * All logins from machine accounts should be protected by an additional authentication layer (VPN, another machine, etc.).
| |
| * All logins from machine accounts are only allowed within the private IP-space, and if possible, only the relevant machine source IPs should be accessible.
| |
| | |
| File: <tt>/etc/ssh/sshd_config</tt> (OpenSSH 6.3+)
| |
| | |
| Match User machine_user Address 10.0.0.0/8,192.168.0.0/16,172.16.0.0/12
| |
| PubkeyAuthentication yes
| |
| KbdInteractiveAuthentication no
| |
| AuthenticationMethods publickey
| |
| | |
| File: <tt>/etc/ssh/sshd_config</tt> (OpenSSH 5.3+ w/ RedHat/CentOS patch)
| |
| | |
| Match User machine_user Address 10.0.0.0/8,192.168.0.0/16,172.16.0.0/12
| |
| RequiredAuthentications2 publickey
| |
| | |
| === Auditing your existing SSH keys ===
| |
| Existing keys are generally stored in <tt>~/.ssh/</tt> (Linux/OSX) or <tt>%APPDATA%</tt> (Windows).
| |
| * Look for <tt>id_{rsa,ed25519,ecdsa,dsa}, identity, IdentityFile, *.pem</tt>, and other <tt>identity</tt> files.
| |
| | |
| ==== Display SSH keys information ====
| |
| # You may run this for any key file that you have.
| |
| $ ssh-keygen -lf id_rsa
| |
| 2048 bc:4f:46:2b:3d:f1:e2:0f:ac:40:99:49:ed:c9:81:a2 Mozilla key for xyz (RSA)
| |
| ^^ ^^^^^^^^^ ^^^^ ^^^
| |
| |__ Size |__ Fingerprint |__ Comment |__ Type
| |
| | |
| == SSH agent forwarding ==
| |
| {|| class="wikitable sortable"
| |
| |-
| |
| || <span >'''ATTENTION</span> '''
| |
| |-
| |
| || SSH Agent forwarding exposes your authentication to the server you're connecting to.
| |
| * By default, an attacker with control of the server (i.e.
| |
| * root access) can communicate with your agent and use your key to authenticate to other servers without any notification (i.e.
| |
| * impersonate you).For this reason, one must be careful when using SSH agent forwarding.
| |
| * Defaulting to always forwarding the agent is strongly discouraged.Note also that while the attacker can use your key as long as the agent is running and forwarded, he cannot steal/download the key for offline/later use.
| |
| |- | | |- |
| | | 8332 || [https://tools.ietf.org/html/rfc8332 Use of RSA Keys with SHA-256 and SHA-512 in the Secure Shell (SSH) Protocol ] |
| |} | | |} |
| SSH forwarding allows you to jump between hosts while keeping your private key on your local computer.
| |
| * This is accomplished by telling SSH to forward the authentication requests back to the ssh-agent of your local computer.
| |
| * SSH forwarding works between as many hosts as needed, each host forwarding new authentication request to the previous host, until the ssh-agent that holds the private key is reached.
| |
|
| |
| [[Image:Bild1.png|top|alt="Ssh forwarding.png"]]
| |
|
| |
| On each host, two environment variables are declared for the user enabling ssh-agent: * '''$SSH_AUTH_SOCK''' declares the location of the unix socket that can be used to forward an authentication request back to the previous host.(ex: /tmp/ssh-NjPxtt8779/agent.8779).
| |
| * Only present if using SSH agent forwarding.
| |
| * '''$SSH_CONNECTION''' shows the source IP and port of the previous host, as well as the local IP and port. (ex: 10.22.248.74 44727 10.8.75.110 22).
| |
|
| |
| To use ssh-agent, add the flag <tt>-A</tt> to your ssh commands:
| |
|
| |
| $ ssh -A user@ssh.mozilla.com
| |
|
| |
| You can set the following configuration parameter in your local ssh configuration at ~/.ssh/config.
| |
|
| |
| Host ssh.mozilla.com
| |
| ForwardAgent yes
| |
|
| |
| === Hardening the Agent forwarder ===
| |
| It is possible to require confirmation every time the agent is used (i.e.
| |
| * when you connect to a server through the SSH agent) by using the <tt>-c</tt> flag:
| |
|
| |
| # First, remove the key from the agent if it's already loaded:
| |
| $ ssh-add -d ~/.ssh/id_ed25519
| |
| # And re-add it with the -c flag:
| |
| $ ssh-add -c ~/.ssh/id_ed25519
| |
|
| |
| It is also possible to lock the key in the agent after a configurable amount of time, this can be done either for all keys when starting the agent, or per key when adding the keys to the agent with the <tt>-t</tt> flag:
| |
|
| |
| # Keep all keys decrypted/useable in memory for 30 minutes (1800 seconds)
| |
| $ ssh-agent -t 1800
| |
| # First, remove the key from the agent if it's already loaded:
| |
| $ ssh-add -d ~/.ssh/id_ed25519
| |
| # Re-add it, with the -t flag to keep this specific key decrypted/useable in memory for 30 minutes (1800 seconds)
| |
| $ ssh-add -t 1800 ~/.ssh/id_ed25519
| |
|
| |
| For MacOSX in particular it's possible to save the passphrase in the Keychain. If you do so it is strongly recommended to also change the keychain setting to lock itself when the computer is locked, and/or to timeout and lock the keychain. These settings are not controlled by OpenSSH.
| |
|
| |
| # MacOSX only - save the passphrase in the Keychain
| |
| $ ssh-add -K ~/.ssh/id_ed25519
| |
|
| |
| <div >'''''Note:''' ''</div>
| |
|
| |
| <div >''There are also some third-party patches for various OpenSSH clients that will notify you visually when the agent is being used. ''</div>
| |
|
| |
| <div >''These are not officially supported and may require you to recompile OpenSSH. ''</div>* [https://github.com/gdestuynder/openssh-portable/commits/libnotify OpenSSH Linux] ''
| |
| * [https://github.com/gdestuynder/putty-pagent-notification/commits/master PuTTY/Pageant] ''
| |
| * [https://github.com/gdestuynder/gnupg-agent-notification/commit/57697146188d52f5447a50303070371a8cf5c0bb GnuPG Agent Linux] ''
| |
| * [https://github.com/devinteske/apple/tree/master/OpenSSH-186/openssh OpenSSH MacOS X] (see also [http://devinteske.com/ http://devinteske.com/])''
| |
|
| |
| === Recommended, safer alternatives to SSH agent forwarding ===
| |
| ==== OpenSSH >=7.3 ====
| |
| OpenSSH 7.3 onwards allow users to jump through several hosts in a rather automated fashion. It has full support for scp and sftp commands as well as regular ssh.
| |
|
| |
| For example to reach a host behind a bastion/jumphost:
| |
|
| |
| # Single jump
| |
| $ ssh -J ssh.mozilla.com myhost.private.scl3.mozilla.com
| |
|
| |
| # Jump through 2 hops
| |
| $ ssh -J ssh.mozilla.com,ec2-instance.aws.net 10.0.0.3
| |
|
| |
| # Copy data from a host
| |
| $ scp -oProxyJump=ssh.mozilla.com myhost.private.scl3.mozilla.com:/home/kang/testfile ./
| |
|
| |
| You can also add these lines to your <tt>~/.ssh/config</tt>
| |
|
| |
| Host *.mozilla.com !ssh.mozilla.com
| |
| ProxyJump ssh.mozilla.com
| |
|
| |
| ==== Older versions of OpenSSH ====
| |
| It is possible to directly forward ports for single jumps instead of forwarding the agent. This has the advantage of never exposing your agent to the servers you're connecting to.
| |
|
| |
| For example, you can add these lines to your <tt>~/.ssh/config</tt>
| |
|
| |
|
| Host *.mozilla.com !ssh.mozilla.com
| | === Links === |
| ProxyCommand ssh ssh.mozilla.com -W %h:%p
| | ==== Projekt ==== |
| | ==== Weblinks ==== |
|
| |
|
| This will automatically forward the SSH connection over ssh.mozilla.com when you connect to a mozilla.com SSH server.
| | <noinclude> |
|
| |
|
| | </noinclude> |
|
| |
|
| [[Kategorie:Netzwerk:Sicherheit]] | | [[Kategorie:SSH]] |
| [[Kategorie:ssh]] | | [[Kategorie:Telnet]] |