die raven homepage
SCP und SFTP unter Linux & Windows

Version 1.4

Inhalt
Was ist SSH/SCP/SFTP?

Als SSH (Secure Shell) werden Protokolle und gleichzeitig eine Suite aus Anwendungen bezeichnet, die SSH implementieren. OpenSSH wird vom OpenBSD Projekt gepflegt und weiterentwickelt. Die Protokolle werden in den Internet- Drafts der IETF Working Group Secure Shell (secsh) definiert.

Der Vorteil von SSH, SCP und SFTP im Gegensatz zu FTP oder Telnet liegt darin, dass beginnend bei der Authentifizierung von User und Server bis zum Transfer der Daten alles kryptographisch verschlüsselt wird. Dabei kommen die gleichen Algorithmen zum Einsatz wie z. B. bei PGP, u. a. AES, Triple-DES, Blowfish und CAST, DSA und RSA. D. h. einem "Angreifer" ist es nicht möglich, Passwörter und Daten abzufangen, die bei FTP im Klartext übertragen werden.

SCP ist die Abkürzung für "Secure Copy", eine Anwendung, um direkt Dateien zwischen Server und User zu übertragen. SFTP ist die Abkürzung für "Secure File Transfer Program", einem interaktiven Dateitransferprogramm ähnlich FTP, mit dem der User vor dem eigentlichen Transfer Verzeichnisse und deren Inhalt auf dem Server einsehen und Kommandos auf dem Server ausführen kann.

Gerade in Zeiten, wo den Vertretern von Rechteinhabern, Strafverfolgungsbehörden und Geheimdiensten immer umfangreichere Überwachungsmöglichkeiten zugesprochen werden und sich der Kreis von Personen vergrößert, die mit den nötigen "Hackerskills" ausgestattet, ebenfalls Überwachungs- und Abfangaktionen durchführen, sollte sich parallel die Zahl der Serverbetreiber erhöhen, die SCP und SFTP statt FTP anbieten und die Zahl der User, die diese Angebote nutzen können.

Im folgenden sollen zur Übersicht die wichtigsten Voraussetzungen, Konfigurationen und Kommandos zur Bedienung von SCP und SFTP Server, deren Einrichtung z. B. in SFTP-only SSH Server erklärt wird, anhand der Programme der OpenSSH und PuTTY Suite dokumentiert werden.
PuTTY ist ursprünglich eine Windowsportierung der OpenSSH Programme, mittlerweile auch unter Linux verfügbar. Für Linuxuser wird es Geschmackssache sein, ob man nur die OpenSSH oder die PuTTY Programme verwendet. Außerdem wird das Open Source Windows Programm WinSCP vorgestellt, dass jedem Windowsnuter ermöglicht, genauso einfach und komfortabel SCP/SFTP Server zu bedienen, wie FTP-Server mit FTP-Clients. Aber auch WinSCP bedient sich zum Teil der PuTTY Programme.

In der Anleitung wird davon ausgegangen, dass Public Key Authentifizierung und SSH Protokoll Version 2 verwendet wird.
Die hier verwendeten Rechneradressen und Portangaben sind frei erfunden und dienen der Verdeutlichung. Die Bezeichnung id_rsa|dsa ist die Zusammenfassung aus id_rsa und id_dsa und steht für einen SSH Key, der entweder als RSA oder DSA Key erstellt wurde.

Keymanagement unter Linux

Für die Anwendungen muss OpenSSH installiert werden, bzw. OpehSSH-Client Pakete, wenn man keinen eigenen OpenSSH Server benötigt.

RSA oder DSA Keypaar, bestehend aus Private Key ~/.ssh/id_rsa|dsa und Public Key ~/.ssh/id_rsa|dsa.pub erzeugen:
ssh-keygen -t rsa|dsa -b bits -C "Kommentar"

Fingerprint anzeigen:
ssh-keygen -l -f id_rsa|dsa.pub

Passphrase ändern:
ssh-keygen -p -f id_rsa|dsa

Public Key in "SECSH Public Key File" Format ausgeben:
ssh-keygen -e -f id_rsa|dsa.pub

Secret Key in SSH2 oder Public Key in "SECSH Public Key File" als OpenSSH Key ausgeben:
ssh-keygen -i -f keydatei

RSA oder DSA Keypaar, bestehend aus Private Key und Public Key, die bei PuTTY in einer Datei gespeichert werden, erzeugen:
puttygen -t rsa|dsa -b bits -C "Kommentar" -o id_rsa|dsa.ppk

Fingerprint anzeigen:
puttygen id_rsa|dsa.ppk -O fingerprint

Passphrase ändern:
puttygen -P id_rsa|dsa.ppk

Public Key in OpenSSH Format exportieren:
puttygen -L id_rsa|dsa.ppk > id_rsa|dsa.pub

Private Key in OpenSSH Format exportieren:
puttygen id_rsa|dsa.ppk -O private-openssh -o id_rsa|dsa

Aus OpenSSH Private Key PuTTY Key erstellen:
puttygen id_rsa|dsa -o id_rsa|dsa.ppk

Keymanagement unter Windows
PuTTY Puttygen
Unter Windows verwendet man zum Keymanagement das Tool Puttygen.
Um einen Key zu erzeugen, wählt man unten den Keytyp (meistens SSH2 RSA oder DSA), trägt die Schlüssellänge in bits ein und klickt den Button "Generate" an. Über Mausbewegungen werden dabei Zufallswerte gesammelt. Ist der Key erzeugt, wird noch eine Passphrase vergeben und im Feld "Key comment" ggf. der vorgegebene Kommentar verändert. Anschließend speichert man den PuTTY Key über den Button "Save private key" in der Datei id_rsa|dsa.ppk. Bekommt man auf einem OpenSSH Server einen Account und die Aufforderung, den Public Key dem Serveradmin zu senden, kopiert man einfach den "Text" im oberen Fenster in eine Textdatei und speichert diese als id_rsa|dsa.pub oder id_rsa|dsa_bob.pub.

Es gibt zwei Wege des Verbindungsaufbaus für sftp und psftp. Man gibt entweder alle Angaben auf der Kommandozeile an oder erstellt Sessionprofile, in denen bis auf die Passphrase alle Angaben enthalten sind.

Dazu wird die SSH Client Konfigurationsdatei ~/.ssh/config editiert. Die systemweite SSH Client Konfigurationsdatei ist /etc/ssh/ssh_config.
Die Datei ist so aufgebaut:

1) Globale Parameter, die für alle Hosts gelten, zu denen man verbindet.
Ein Parameter, der hier festgelegt wird, überschreibt einen gleichlautenden Parameter für einen gesondert definierten Host. Wird hier z. B. Port 22 definiert und für den Host "hostname1" Port 222, wird trotzdem für den remote Port für "hostname 1" Port 22 verwendet.

Host *
Parameter

2) Spezielle Parameter für den Host mit der Bezeichnung "hostname1".
"hostname1" ist gleichzeitig Bezeichnung des Sessionprofils.

Host hostname1
Parameter

3) Spezielle Parameter für den 2,3... Host.

Host hostnamen
Parameter

Minimal-Beispiel

Verwende als Host- und Sessionbezeichnung matrix1 mit Angabe der realen Hostadresse über HostName. Mit yes bei Compression wird die Datenkompression aktiviert. Verwende ~/.ssh/id_rsa als Key für die Authentifizierung. Der Host lauscht auf Port 222 und es soll nur SSH Protokoll 2 verwendet werden. Der uns zugewiesen User-, bzw. Login-Name lautet bob.
Die Angabe der Keydatei ist normalerweise nicht nötig, wenn man für alle Hosts denselben Key verwendet.

Host matrix1
HostName matrix01.dyndns.org oder IP
Compression yes
IdentityFile ~/.ssh/id_rsa
Port 222
Protocol 2
User bob

Überprüfung der Serveridentität bei OpenSSH

Über zwei Parameter in der SSH Client Konfigurationsdatei und die Datei ~/.ssh/known_hosts kann festgelegt werden, wie die Identität des Servers überprüft werden soll, bzw. die Zugehörigkeit eines Host Public Keys zu einem bestimmten Server mit IP.... Die Datei known_hosts enthält die Host Public Keys und die IP-Adressen oder Hostnamen der Server, deren Identität sicher ist, bzw. denen man "vertrauen" kann, weil man die Identität überprüft hat. Zur Identitätsprüfung muss man sich als User vom Serveradmin den Fingerprint des Host Keys telefonisch durchsagen oder z. B. GnuPG signiert zusenden lassen. Bei der ersten Verbindungsaufnahme wird der Fingerprint zum Key angezeigt, den der Server verwendet und man kann die beiden Fingerprints vergleichen. Dies dient dazu, Angriffe furch DNS Spoofing, Trojan Horses und Man-in-the-Middle abzuwehren, die dazu führen, dass man sich zu einem Server mit gefälschter Identität verbindet.

CheckHostIP yes|no
überprüft die IP-Adresse, die in der known_hosts Datei angegeben ist

StrictHostKeyChecking yes|ask|no
yes - Neue Host Keys werden nie automatisch aufgenommen, sondern müssen nach Überprüfung selbst eingetragen werden.
ask - Neue Host Keys werden mit Nachfrage und erst nach Bestätigung durch den User aufgenommen. Hat sich der Host Key bei der nächsten Verbindung geändert, wird die Verbindung verweigert.
no - Neue Host Keys werden immer automatisch aufgenommen.

Beispiel bei einem ersten Verbindungsaufbau

$ sftp matrix01
Connecting to matrix01...
The authenticity of host 'matrix01.dyndns.org (aaa.bbb.ccc.ddd)' can't be established.
RSA key fingerprint is b5:83:80:f0:6b:b2:c8:8a:06:1f:9a:c0:ff:f7:d9:1c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'matrix01.dyndns.org' (RSA) to the list of known hosts.

Identitäten / Private Key / Passphrase Caching

Um die Passphrases der Private Keys nicht ständig eingeben zu müssen, kann man eine Identität, bzw. den zur Identität gehörenden Private Key nach Eingabe der Passphrase über ssh-agent und ssh-add zwischenspeichern. Unter Linux verwenden auch die PuTTY Programme die gecachten Identitäten.

Abfrage, ob bereits ein ssh-agent Prozess läuft
$ set | grep SSH

Starten von ssh-agent
mit Kommandos/Umgebung der voreingestellten Shell
$ exec ssh-agent $SHELL

Identität hinzufügen
$ ssh-add id_rsa|dsa

Identität(en) entfernen
$ ssh-add -D # alle I.
$ ssh-add -d id_rsa|dsa # eine I.

Anzeige der zwichengespeicherten Identitäten
$ ssh-add -l

Dazu das Programm "putty" unter Linux oder Windows starten.
Hier die wichtigsten Einstellungen:

PuTTY Konfigfenster 1
Host Name (or IP address): Adresse und verwendeter Port des Servers
Protocol: SSH
Saved Sessions: einen Namen vergeben, unter dem nicht nur die Angaben in der Datei abgespeichert werden, sondern der auch bei dem Verbindungskommando verwendet wird.
Noch nicht mit "Save" sichern.
PuTTY Konfigfenster 2
Auto-Login username: den vom Serveradmin mitgeteilten User-, Bzw. Login-Namen eintragen.
PuTTY Konfigfenster 3
Enable Compression: Datenkomprimierung aktivieren.
Preferred SSH protocol version: Mit "2" festlegen, dass SSH Protokoll 2 verwendet wird mit Fallback auf Protokoll 1.
PuTTY Konfigfenster 4
Private key file for authentication: Pfad zum PuTTY Private Key.

Sind alle Einstellungen vorgenommen, wieder zu Fenster 1 springen und das Profil mit "Save" sichern.

Statt der Datei known_hosts (s. o.) benutzt PuTTY die Datei sshostkeys.
Bei der Verbindung zu einem Server wird der User gefragt, ob der Host Key der sshostkeys Datei hinzugefügt werden soll und es wird der Host Key Fingerprint zur Überprüfung angezeigt.
Hat man sich der Identität des Hosts vergewissert, kann der Key des Servers mit "y" in die sshostkeys Datei aufgenommen, mit "n" einmalig verwendet oder mit Betätigen der Returntaste abgelehnt werden.

Beispiel bei einem ersten Verbindungsaufbau

$ psftp matrix01
The server's host key is not cached. You have no guarantee
that the server is the computer you think it is.
The server's rsa2 key fingerprint is:
ssh-rsa 3100 b5:83:80:f0:6b:b2:c8:8a:06:1f:9a:c0:ff:f7:d9:1c
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n) y

Identitäten Caching bei PuTTY

Unter Linux werden dazu ssh-agent/ssh-add (s. o.) verwendet, unter Windows Pageant (PuTTYs Authentication Agent).

PuTTYs Pageant
Nach dem Start von Pageant legt Pageant ein Icon im Systray (ganz rechts) ab.
Klickt man das Icon doppelt an, öffnet sich das Pageant Übersichtsfenster, über das man mit "Add Key" den PuTTY Key der Identität auswählt (geht auch direkt über das Kontextmenü). Nach Eingabe der Passphrase wird der zwischengespeicherte Key im Pageant Fenster aufgelistet.

Über ein Sessionprofil (s. o.)
sftp matrix1

Über Kommando in der Konsole (mit Datenkompression):
$ sftp -C -oIdentityFile=~/.ssh/id_rsa|dsa -oPort=222 bob@matrix01.dyndns.org

Über ein Sessionprofil (s. o.)
psftp matrix1

Über Kommando in der Konsole (mit Datenkompression, SSH Protokoll 2):
psftp -C -2 -i id_rsa|dsa.ppk -P 222 bob@matrix01.dyndns.org

Arbeiten auf dem Server mit sftp und psftp

Die wichtigsten SFTP Kommandos

sftp psftp Beschreibung
help|? help alle Kommandos anzeigen
help Kommando genauere Erklärung zum Kommando
cd Pfad cd Pfad in remote Verzeichnis wechseln
lcd Pfad lcd Pfad in lokales Verzeichnis wechseln
pwd pwd aktuellen remote Verzeichnispfad ausgeben
lpwd lpwd aktuellen lokalen Verzeichnispfad ausgeben
ls -l (entspricht ls -la) ls|dir (entspricht ls -la) remote Verzeichnisinhalt ausführlich ausgeben
lls !ls|!dir [-la] lokalen Verzeichnisinhalt ausgeben
mkdir Verzeichnis mkdir Verzeichnis remote Verzeichnis erstellen
lmkdir Verzeichnis !kmdir Vereichnis lokales Verzeicnis erstellen
rm Datei rm|del Datei remote Datei löschen
rmdir Verzeichnis rmdir Verzeichnis remote Verzeichnis löschen
rename alter-Dateiname neuer-Dateiname mv|ren alter-Dateiname neuer-Dateiname remote Datei verschieben|umbenennen
put lokaler-Dateiname [remote-Dateiname] put lokaler-Dateiname [remote-Dateiname] Datei hochladen
reput lokaler-Dateiname [remote-Dateiname] unterbrochenen Dateiupload fortsetzen
get remote-Dateiname [lokaler-Dateiname] get remote-Dateiname [lokaler-Dateiname] "Datei" runterladen
reget remote-Dateiname [lokaler-Dateiname] unterbrochenen Dateidownload fortsetzen
!Kommando !Kommando Kommando in lokaler Shell ausführen
! / exit !Shellname / exit in lokale Shell wechseln / lokale Shell verlassen
exit|bye|quit exit|bye|quit SFTP Session beenden

Hinweis: 'Datei namen' mit Leerzeichen müssen mit ' ' eingeschlossen werden.

mit scp, Kompression, Protokoll 2
scp -C2 -P 222 -i ~/.ssh/id_rsa|dsa bob@matrix01.dyndns.org:[/pfad/]remote-Dateiname [/lokaler/pfad/]lokaler-Dateiname

mit pscp und Sessionprofil
pscp matrix01:[/pfad/]remote-Dateiname [/lokaler/pfad/]lokaler-Dateiname

mit pscp, Kompression, Protokoll 2 ohne Sessionprofil
pscp -C -2 -P 222 -i ~/.ssh/id_rsa.ppk bob@matrix01.dyndns.org:[/pfad/]remote-Dateiname [/lokaler/pfad/]lokaler-Dateiname

mit pscp und Sessionprofil alle Dateien eines bestimmten Typs
pscp matrix01:[/pfad/]*.ext [/lokaler/pfad]

mit pscp und Sessionprofil rekursiv ganzes, remote Verzeichnis
pscp -r matrix01:/pfad [/lokaler/pfad]

mit scp, Kompression, Protokoll 2
scp -C2 -P 222 -i ~/.ssh/id_rsa|dsa [/lokaler/pfad/]lokaler-Dateiname bob@matrix01.dyndns.org:[/pfad/]remote-Dateiname

mit pscp und Sessionprofil
pscp [/lokaler/pfad/]lokaler-Dateiname matrix01:[/pfad/]remote-Dateiname

mit pscp, Kompression, Protokoll 2 ohne Sessionprofil
pscp -C -2 -P 222 -i ~/.ssh/id_rsa.ppk [/lokaler/pfad/]lokaler-Dateiname bob@matrix01.dyndns.org:[/pfad/]remote-Dateiname

mit pscp und Sessionprofil rekursiv ganzes Verzeichnis
pscp -r /lokaler/pfad/verzeichnis matrix01:[/pfad/verzeichnis]

Unter Windows kann man alle SCP und SFTP Aktionen mit den Programmen der PuTTY Suite in der Konsole durchführen. Eine grafische und einfach zu bedienende Lösung bietet einer der bekanntesten und beliebtesten Clients für SCP und SFTP - das Open Source Programm WinSCP. WinSCP basiert aber in starkem Maße auf der PuTTY Suite.
Die Seite Schnelleinstieg WinSCP bietet einen schnellen Zugang zu WinSCP.