Remote-Zugriffe - ssh/sftp/ftp
 

Hier kommen wir wieder einmal zu den großen Stärken von Linux und wo wieder einmal sichtbar wird, daß Linux das Netzwerk-Server-System für große Firmen ist. Denn da wo hunderte von Rechnern stehen, hat man keine Lust kilometerlange Fußmärsche zurück zu legen damit man an jeden einzeln kommt. Genau für solche Zwecke -entfernte Administration- bringt Linux ein paar nützliche Programme mit, mit denen man sich auf die jeweiligen Rechner einloggen kann, so als ob man direkt davor sitzen würde. Das dafür benötigte Programm nennt sich ssh.

ssh = Secure Shell ist ein Netzwerkprotokoll der TCP/IP-Familie.
Es ermöglicht die Datenübertragung im Netz mit sicherer Authentifizierung und Verschlüsselung.

Grundvorraussetzung: Es muß ein ssh-Client für einen entfernten Zugriff auf einen anderen Rechner und ein ssh-Server für einen entfernten Zugriff von einem anderen Rechner installiert sein. Unter den Distributionen ist i.d.Regel OpenSSH installiert. Falls nicht reicht unter Debian ein apt-get install ssh. Außerdem muß ssh in der Firewall freigegeben sein (standardmäßig der Port 22). Möchte man für die Verbindung keine I.P.-Adresse benutzen sondern den Rechnernamen, muß für die Namensauflösung die Datei /etc/hosts bearbeitet werden, in der sämtliche Rechnernamen mit dazugehöriger I.P.-Adresse gelistet sind.


Einfache Verbindung über ssh

Am Prompt steht
udo@heim-pc:~$
man gibt ein
udo@heim-pc:~$ ssh 192.168.1.4
nach Eingabe des Paßworts steht
udo@laptop:~$

ssh baut eine Verbindung mit dem Rechner mit der I.P. 192.168.1.4 auf. Als Authentifizierung wird der momentane Name mit dem man an der Shell angemeldet ist genommen. Möchte man sich unter einem anderen Namen auf dem entfernten Rechner anmelden, benutzt man:
udo@heim-pc:~$ ssh bobby@home-debian
Meldet sich unter dem Namen bobby auf dem Rechner mit dem Hostnamen
home-debian an. Es erscheint:
bobby@home-debian:~$
Natürlich müssen die angegebenen Benutzer auf dem entferntem Linux-System ein Konto haben, sprich also vorhanden sein. Standardmäßig wird eine Paßwortverschlüsselung genommen, was je nach Paßwort schon sehr sicher ist. Noch sicherer ist allerdings die Verwendung von Schlüsseln, so kann sich nur der Rechner mit einem Anderen verbinden, dessen Schlüssel paßt. Jedoch ist auch hier ein Paßwort für den Schlüssel zu benutzen, damit kein Anderer die Schlüssel ausspähen kann. In einem von außen gut abgeschottetem privatem Netzwerk könnte man auch kein Paßwort für den Schlüssel verwenden. In dem Fall erspart man sich die Eingabe des Paßwortes und es ist möglich, einzelne Befehle per ssh an entfernte Rechner zu schicken.


ssh ohne Passwort - die Verwendung von Schlüsseln

Mittels des Programms ssh-keygen generiert man auf dem ssh-Client das Schlüsselpaar, welches im Home-Verzeichnis des Nutzers unter dem versteckten Verzeichnis .ssh/ gespeichert wird:
# ssh-keygen -t dsa
Bei der Abfrage des Paßwortes drückt man einfach ENTER und überspringt somit selbiges.
Anschließend kopiert man den öffentlichen Schlüssel id_dsa.pub auf den ssh-Server in das Verzeichnis .ssh/
# scp ~/.ssh/id_dsa.pub udo@ssh-server:~/.ssh/id_dsa.pub
Nun muß man den Schlüssel nur noch in die Autorisierungs-Datei kopieren:
# cat .ssh/id_dsa.pub >> .ssh/authorized_keys
und schon kann man sich auf dem entfernten Rechner ohne Paßwort einloggen.
Möchte man einen einzelnen Befehl an den entfernten Rechner schicken, muß man dazu nicht mal am entfernten Rechner eingeloggt sein, sondern gibt lediglich ein:
# ssh root@ssh-server shutdown -h now
im Falle ohne Schlüssel erfolgt hier die Eingabe des Paßwortes. Mit Schlüssel wird der Befehl an den Server geschickt und ausgeführt.

Zum Verlassen einer ssh-Verbindung genügt die Eingabe von
# exit


root-login erlauben

Standardmäßig ist bei neueren ssh-Versionen der Login als root deaktiviert. Jetzt kann man sich entweder als Benutzer anmelden und dann mittels su - auf der entfernten Konsole zum root werden, oder man aktiviert den root-Login grundlegend in der Datei /etc/ssh/sshd_config (nicht zu verwechseln mit ssh_config! Auf das d kommt es an!). Dazu ändert man die Zeile
PermitRootLogin without-password
zu
PermitRootLogin yes
Nach speichern der Datei muß man ssh noch neustarten mittels
/etc/init.d/ssh restart


ssh Probleme - host-key Verwaltung

Bei der ersten Anmeldung über ssh mit Paßwort wird der rsa-key oder host-key des entfernten Rechners übermittelt und es erscheint eine Abfrage, ob man dem Schlüssel vertraut. Bestätigt man diese, wird der Key in die Datei ~/.ssh/known_hosts eingetragen und bei jeder erneuten Verbindung überprüft. Sollte sich der Key ändern, weil man z.B. ssh updated oder den Rechner neu aufsetzt oder ein Dual-Boot System mit mehreren Linux-Systemen hat, bricht ssh die Verbindung mit einer Fehlermeldung ab, z.B.:
# ssh udo@heim-pc
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eyesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
7b:0b:72:e8:9d:0f:d3:62:45:91:56:04:43:fb:36:c2.
Please contact your system administrator.
Add correct host key in /home/udo/.ssh/known_hosts to get rid of this message.
Offending key in /home/udo/.ssh/known_hosts:3
RSA host key for udo@heim-pc has changed and you have requested strict checking.
Host key verification failed.

In solch einem Fall kann man entweder den einzelnen Schlüssel in der Datei löschen oder die gesamte Datei, was im letzteren Fall aber bei vielen PC's zu vielen neuen Abfragen führt, die man bestätigen muß. Möchte man nur den einzelnen Schlüssel-Eintrag löschen, gibt man folgendes ein (hier passend für obige Fehlermeldung):
# sed -i '3d' ~/.ssh/known_hosts
Wie wir aus der Fehlermeldung lesen, befindet sich der falsche Key in Zeile 3:
Offending key in /home/udo/.ssh/known_hosts:3
sed öffnet die Datei, sucht nach der 3. Zeile (3d) und entfernt diese aus der Datei.
Eine andere Möglichkeit ist den Schlüssel in die Datei ~/.ssh/known_hosts zu importieren. Der Befehl
# ssh-keyscan -H rechnername
zeigt den Schlüssel des entfernten Rechners an. Ein
# ssh-keyscan -H rechnername >> ~/.ssh/known_hosts
speichert den Schlüssel in der known_hosts Datei. Allerdings führt das Eintragen zweier unterschiedlicher Schlüssel für ein und denselben Rechner zu einer weiteren Sicherheitsabfrage.

Im Falle eines Dual-Boot Systems ist es daher besser alle Schlüssel sämtlicher Linux-Systeme auf dem Rechner zu synchronisieren, d.h. man wählt einen Schlüssel aus und überschreibt alle Anderen. Das geht ganz einfach mit dem Befehl:
# cp -v /mnt/anderes_LINUX/etc/ssh/ssh_host_*_key* /etc/ssh/
Ein anschließender Neustart mit
/etc/init.d/ssh restart
und die geänderten Schlüssel können verwendet werden.


scp - kopieren über ssh

# scp testdatei udo@Internet-Suse:/home/udo/Documents
kopiert die Datei testdatei aus dem aktuellen Verzeichnis auf den entfernten Rechner Internet-Suse in das Verzeichnis /home/udo/Documents. Umgekehrt:
# scp udo@Internet-Suse:/home/udo/testdatei /home/udo
kopiert vom entfernten Rechner Internet-Suse die Datei testdatei in das lokale Verzeichnis /home/udo.

Hat man sich auf dem entfernten Rechner eingeloggt, weil man den Namen der zu kopierenden Datei und ihr Verzeichnis nicht kennt, kann man trotzdem kopieren, mit:
# scp udo@Internet:/home/datei sonny@Fedora:/home
Hier spielt es keine Rolle auf welchem Rechner man sich befindet, scp funktioniert auch von einem entfernten Rechner auf einen anderen entfernten Rechner.

Etwas komplizierter ist es, wenn die zu kopierende Datei oder das zu kopierende Verzeichnis Leerzeichen enthält. Diese müssen nicht nur auf der Host-Seite sondern auch auf der Remote-Seite maskiert werden, also in diesem Sinne zweimal. Der Fantasie der Verschachtelung sind dabei keine Grenzen gesetzt, ob man nun einfache und doppelte Anführungsstriche verwendet oder drei Backslashes. Ein paar Beispiele:
# scp udo@Internet:/home/udo/'"beispiel datei"' /home
# scp udo@Internet:/home/udo/beispiel\\\ datei /home
# scp udo@Internet:/home/udo/'"ein Ordner/beispiel datei"' /home

Mit der Option -r kann man auch ganze Verzeichnisse kopieren!

Verzeichnis der Konfigurations-Dateien:
/etc/ssh/ssh_config # ssh-Client-Konfiguration
/etc/ssh/sshd_config # ssh-Server-Konfiguration

Bei erfolgreicher Anmeldung über ssh, gibt der sshd (ssh-Dämon) den Inhalt von /etc/motd an den Benutzer weiter. Danach liest er, falls vorhanden, die Datei ~/.ssh/environment (Zuweisungen an Umgebungsvariable) und führt, falls vorhanden, die Datei ~/.ssh/rc (ersatzweise /etc/ssh/sshrc) aus.


Komfortabler ssh-Zugriff mit KDE und fish

Natürlich ist das Kopieren vieler Dateien aus unterschiedlichen Verzeichnissen mit scp eine mühselige Angelegenheit. Komfortabler geht sowas unter der grafischen Oberfläche mittels dem Konqueror und dem Plug-In fish.
Standardmäßig ist fish als sogenannter KIO-Slave (K Input/Output) im Konqueror enthalten. Man gibt lediglich in der Adresszeile des Konquerors ein:
fish://192.168.1.4
oder
fish://udo@heim-debian
und es wird genau wie bei ssh eine Verbindung über das ssh Protokoll zum entfernten Rechner hergestellt. So kann man mit einfachen Mausklicks oder sogar Drag and Drop-Aktionen bequem Dateien von einen auf den anderen Rechner kopieren.

Leider gibt es einen kleinen Fehler unter fish. Seit dem Kernel 2.6.20 bereitet die Verbindung auf schnelleren Rechnern aufgrund eines Bugs Probleme. Ersatzweise falls fish nicht funktioniert, kann man auch sftp verwenden. Es funktioniert genau gleich wie fish, z.B.
sftp://udo@192.168.1.4


ftp, ncftp und lftp

Um Dateien auf einen Webserver hochzuladen ist FTP (File Transfer Protokoll) die am meisten verwendete Methode. Unter Linux gibt es dafür die Programme ftp, ncftp und lftp. Die Programme sind von der Bedienung her sehr ähnlich, jedoch weisen ncftp und lftp einige Stärken auf, die das Standard-Programm ftp vermissen läßt. ncftp kann sogenannte "bookmarks" speichern, also Lesezeichen von ftp-Verbindungen und hat wie auch die Konsole ein "Gedächtnis" (es merkt sich die zuletzt eingegebenen Befehle) und eine Autovervollständigung. Dadurch erspart man sich einige Tiparbeit. lftp hat als besonderes Highlight einen mirror-Befehl, welcher Verzeichnisse vom FTP-Host lokal oder auch umgekehrt spiegeln kann. Hier eine kleine Übersicht der wichtigsten Befehle:

 ftpncftplftp
Aufruf des
Programms
ftpncftplftp
Öffnen des
Hosts
open hostname.deopen -u user hostname.de, oder öffnen von gespeicherten Lesezeichen mit dem Befehl bookmarksopen -u user hostname.de
Dateien auf
Host anzeigen
ls (Ausgabe wie ls -l)ls oder ls -l, verhält sich genau wie der ls-Befehlls (Ausgabe wie ls -l)
Dateien
lokal anzeigen
!ls (wie bei lftp)lls (lokale Befehle haben ein l vorangestellt)!ls (Befehle mit einem vorangestelltem Ausrufezeichen werden als Shell-Befehle ausgeführt)
Dateien
hochladen
put datei.phpput datei.php, oder auch
put *.php
put -O hostverzeichnis/ datei.php
Dateien
runterladen
get datei.phpget datei.php, oder auch
get *.php
get -O lokalesverzeichnis/ datei.php
Programm
beenden
quitquit (ncftp fragt beim beenden ob ein bookmark für die Verbindung gespeichert werden soll)quit

Der Befehl mirror von lftp kann komplette Verzeichnisse samt Unterverzeichnissen spiegeln. Ohne weitere Angaben wird das root-Directory eines entfernten FTP-Verzeichnisses im momentan aktuellem Verzeichnis gespiegelt. Möchte man umgekehrt arbeiten, also lokal erstellte Webdokumente auf dem FTP-Server aktualisieren, gibt man am lftp-Prompt folgenden Befehl ein:
lftp :~> mirror -eRp lokalesVerzeichnis/ FTP-Verzeichnis/
Die Optionen:
-e = Dateien die im Ursprungsverzeichnis fehlen, werden auf dem FTP-Host gelöscht.
-R = Kehrt die mirror-Richtung um, also von FTP->lokal auf lokal->FTP.
-p = keine Dateiberechtigungen (mit chmod) setzen.


curlftpfs und sshfs

Es gibt noch einen komfortableren Weg um auf entfernte FTP-Verzeichnisse zuzugreifen. Mittels des Programms curlftpfs ist es möglich, Verzeichnisse auf FTP-Servern in den Verzeichnisbaum einzuhängen. So kann man auf die Verzeichnisse des entfernten Hosts zugreifen, als ob es lokale Verzeichnisse wären. Mittels
# apt-get install curlftpfs
wird das Programm installiert. Ein simpler Aufruf wie
# curlftpfs username:passwort@hostname.de /mnt/Verzeichnis/
hängt das FTP-Verzeichnis im angegebenen lokalen Verzeichnis ein. Wer es allerdings noch sicherer haben will und die Möglichkeit hat, per ssh auf seinen Webspace zuzugreifen, kann auch mittels sshfs einen entfernten Host einhängen:
# sshfs username@hostname.de:/ /mnt/Verzeichnis/
Nach Eingabe des Paßworts ist der entfernte Webspace per ssh im angegebenen Verzeichnis eingehängt.


ssh-Tunnel für Firefox

ssh kann noch mehr. Mittels ssh ist es außerdem möglich einen sogenannten "Tunnel" aufzubauen. Daten die über diesen Tunnel gehen, sind von außen dank Verschlüsselung nicht einsehbar, somit also wie in einem richtigen Tunnel vor Blicken von außen abgeschottet. Dadurch ist es nicht nur möglich seine Daten besser zu schützen, man kann auch eventuell vorhandene Internet-Sperren eines Landes oder einer Firma umgehen. Man öffnet lediglich eine Konsole und gibt folgenden ssh-Befehl ein:

# ssh -C2qTnN -D 2080 username@heimischer_rechner.de

Die ssh-Optionen im Detail:
C = Kompression der Daten. In langsamen Modem-Netzwerken sinnvoll, kann die Kompression bei schnellen Netzwerken die Geschwindigkeit verlangsamen
2 = nur SSH2 verwenden
q = Quiet mode, die meisten Fehlermeldungen werden unterdrückt
T = Dissable pseudo-tty allocation, deaktiviert die pseudo-tty Zuweisung
n = Redirect stdin from /dev/null
N = kein externes Programm ausführen. Das ist nützlich wenn man lediglich Ports weiterleiten will
D = Dynamische Port-Weiterleitung

Nach Eingabe des Paßworts, steht der Tunnel. Der Port (hier 2080) kann frei gewählt werden. Es empfiehlt sich aber ein Zahl oberhalb 1024, da dafür keine root-Rechte benötigt werden. Nun muß man noch Firefox zur Verwendung des ssh-Tunnels konfigurieren. Dazu klickt man unter dem Menüpunkt Bearbeiten auf Einstellungen und wählt Erweitert. Nach Auswahl von Netzwerk befindet man sich in den Verbindungs-Einstellungen. Hier wählt man Manuelle Proxy-Konfiguration und trägt unter SOCKS-Host die lokale Standard I.P.-Adresse des fremden Rechners ein, also 127.0.0.1. Als Port verwenden wir natürlich unseren vorher gewählten 2080. Noch ein Häckchen bei Externer DNS-Server damit auch die DNS-Anfragen über den Tunnel geleitet werden und wir kein DNS-Leak haben und sicherstellen, daß SOCKS v5 ausgewählt ist. Nach bestätigen mit OK ist die Proxy Konfiguration im Firefox abgeschlossen. Sämtliche Webseiten die wir nun im Firefox öffnen, werden über unseren ssh-Tunnel vom entfernten Rechner geleitet.

Pic: Firefox Proxy Konfiguration