This documentation is no longer maintained. It may be out of date, or simply wrong. I will leave it online, as long as it think it may still be useful.
Die erste Frage, die man sich stellt, bevor man etwas neues einrichtet, ist
meistens:
Was bringt mir Publickey Authentifizierung ?
Du brauchst eine aktuelle Version von OpenSSH, die sowohl Client als auch Server beinhaltet. Aus Sicherheitsgründen solltest du die allerneuste Version von www.openssh.org benutzen.
Solltest du Windows als Betriebsystem deiner Wahl benutzen, ist dieses Mini-HOWTO für dich unbrauchbar. Du hast nun zwei Möglichkeiten:
Ich gehe in diesem Beispiel von OpenSSH unter einem Unix-Derivat aus, es kann also durchaus Unterschiede geben, wenn du andere SSH Software benutzt. Als erstes brauchst du mal dein Keypair, bestehend aus einem Publickey und einem private Key. Wie der Name sagt, gehört der Publickey in die Welt hinaus, und den private Key sollst du hüten wie deinen Augapfel.
ssh-keygen -t dsa
Dies startet einen kleinen Assistenten, der dir hilft dein SSH2 Keypair zu erzeugen. Dein private Key kann nun mit Hilfe eines Passwortes verschlüsselt werden. Dies ist ein absolutes Muss, da passwortlose private Keys ein enormes Sicherheitsrisiko darstellen. Wähle ein kompliziertes Passwort, bestehend aus Sonderzeichen, Zahlen, und Gross- und Kleinschreibung.
Du hast nun zwei Dateien:
| ~/.ssh/id_dsa | Hier steckt dein verschlüsselter private Key drin |
| ~/.ssh/id_dsa.pub | Dies ist dein Publickey, der auf die Remote Server gehört |
Nun musst du deinen Publickey auf dem Zielserver platzieren. Hierfür verwendest du am besten ein dir bekanntes Protokoll. Auf die Bedienung von scp, das für solche Zwecke eigentlich ideal ist, komme ich später zu sprechen. Kopiere die Datei ~/.ssh/id_dsa.pub via ftp auf den Zielrechner. Dort speicherst du dir die Datei als ~/.ssh/authorized_keys2 ab Nun kennt der Server deinen Publickey.
Seit nicht allzulanger Zeit liefert OpenSSH ein Tool mit, um diesen Vorgang zu automatisieren. Es nennt sich ssh-copy-id. Danke an Daniel Hottinger für diesen Hinweis
Versuche nun, dich mit einem normalen "ssh $ZIEL" einzuloggen. Wenn du alles richtig gemacht hast, fragt SSH nun nach dem Passwort für die Entschlüsselung deines private Keys. Nachdem der SSH Client deinen private Key entschlüsselt hat kann er eine Verbindung aufbauen, ohne das du das Passwort eingeben musst, das auf dem Zielhost definiert ist. Jedesmal das Passwort für den private Key anzugeben, ist auf die Dauer etwas mühsam, deswegen haben die Leute hinter OpenSSH ein nettes Programm erschaffen, das dir diese Mühe abnimmt.
ssh-agent speichert eine entschlüsselte Kopie des private Keys im RAM, und ermoeglich so eine komplett passwortlose & sichere Authentifizierung. ssh-agent zu benutzen ist sehr leicht. Durch die Eingabe von "eval `ssh-agent`" startest du eine Instanz von ssh-agent Diesem musst du nun noch beibringen, welche Keys er benutzen soll, und wie die dazugehörigen Passwörter heissen.
ssh-add ~/.ssh/id_dsa
Fügt deinen private Key dem Schlüsselbund von ssh-agent hinzu. Hierzu musst du natürlich dein Passwort angeben. Log dich jetzt nochmal mit "ssh $ZIEL" auf dem Remote Host ein. Nun sollte keinerlei Abfrage kommen, und du befindest dich direkt auf dem Zielrechner. Mit Hilfe von ssh-add -L kannst du dir anzeigen lassen, welche Keys momentan bei ssh-agent registriert sind. Beachte: Jeder der lokalen Zugang zu deinem Computer hat, kann sich ohne Passwörter einloggen. Benutze also xlock und ähnliches, oder beende ssh-agent wenn du nicht vor deinem Computer sitzt.
Um es noch komfortabler zu machen, empfiehlt es sich, ssh-agent automatisch zu starten. Hierzu gibt es zwei Moeglichkeiten:
ssh-agent aus der ~/.profile zu starten. Dies geht nur, wenn man nicht direkt in X startet. Die Anwendung ist relativ einfach, es genügt zwei Zeilen hinzuzufügen:
$ cat ~/.profile eval `ssh-agent` ssh-add ~/.ssh/id_dsa.pub
Solltest du keine sh kompatible Shell benutzen, sieht der Syntax ein wenig anders aus. Anstelle von eval `ssh-agent` solltest du eval `ssh-agent -c` angeben
Die zweite Methode kommt dann zum Zuge, wenn man direkt in X bootet, und sich nicht über eine Shell einloggst. Hierfür benötigst du das Utility gnome-ssh-askpass, welches bei dem OpenSSH Sourcetree im Verzeichnis contrib liegt. Ist Gnome nicht vorhanden, so empfiehlt sich der Einsatz von x11-ssh-askpass. Solltest du nicht ab Sourcen installieren, konsultiere bitte die Dokumentation deiner Distribution. Folgende Einträge in der .xsession führen dazu, das ssh-agent automatisch mit deiner X Session gestartet wird:
$ cat ~/.xsession eval `ssh-agent` export SSH_ASKPASS=`which gnome-ssh-askpass` ssh-add ~/.ssh/id_dsa < /dev/null
Gratuliere, du hast eine funktionierende, komfortable, und sichere Publickey Authentifizierung.
scp ist ein ausgesprochen nützliches Tool, um einzelne Files auf sichere Weise zwischen zwei Boxen zu transferieren. Natürlich bietet es die üblichen SSH Features wie Publickey Authentifizierung und on-the-fly Komprimierung. Die Anwendung gestaltet sich äusserst einfach:
scp $ZIELHOST:~/blah ~/lala
Dieser Befehl kopiert die Datei "blah" aus deinem Homedir auf $ZIELHOST in dein lokales Homedir, und speichert es als Datei "lala" ab. Wenn du eine Publickey Authentifikation via ssh-agent machst, erfordert dieses Kopieren kein Passwort.
scp ~/lala $ZIELHOST:~/blah
Hier wird die lokale Datei "lala" aus deinem Homedir in das Homedir auf deinem Zielhost kopiert, und dort als "blah" abgespeichert.
Weiterhin können mit der Option -r Verzeichnisse rekursiv kopiert werden, oder mit der Zielangabe $ZIELHOST: die Dateien mit selben Namen wie lokal im Homedir von $ZIELHOST abgelegt werden. Lokal klappt das mit der Angabe eines Punktes als Ziel.
Was man noch erwähnen muss, ist, das Wildcards wie * und ? selbstverständlich expandiert werden.
sftp muss auf dem remote SSH Server aktiviert werden, ansonsten kann man es nicht benutzen. Die Steuerung ist die selbe wie die des normalen ftp Programmes, und sollte insofern selbsterklärend sein. Auch hier hat man wieder die Vorteile von SSH: Publickey Authentication und On-the-fly Komprimierung über gzip.
SSH bietet die Möglichkeit, einen Tunnel aufzubauen, um unsichere Protokolle wie POP3 und IMAP ueber einen verschlüsselten Tunnel zu schicken. Dies geschieht durch das Forwarden eines lokalen Ports auf einen auf der gegenüberliegenden Seite. Ein Beispiel: Du willst deine Mails von trash.net via POP3 abholen. Aber POP3 ist ein Plaintext Protokoll, und dir deswegen zu unsicher. Nun machst du folgendes:
ssh -L 1100:localhost:110 trash.net
Damit kannst du nun lokal auf Port 1100 Connecten. Der Traffic der auf diesen Port geht, wird nun über einen verschlüsselten SSH Tunnel auf trash.net, Port 110 forwarded. Der Traffic, der unverschlüsselt ist, ist auf den Loopback Interfaces der lokalen und der remote Box, und stellt somit wesentlich weniger ein Sicherheitsrisiko dar, als den ganzen Traffic unverschlüsselt ueber das Internet zu jagen. Falls du eine langsamere Leitung hast, kannst du mit SSH sogar die Geschwindigkeit erhöhen. Die Angabe des zusätzlichen Parametes "-C" aktiviert eine gzip Komprimierung des forwardeten Traffics, und der SSH-Session selbst.
X Forwarding ermöglicht das sichere Arbeiten mit X11 Anwendungen. X Forwarding zu benutzen ist äusserst einfach:
ssh -X $ZIELHOST
Nun kannst du mit einer einfachen Anwendung wie z.B. Xeyes testen, ob's funktioniert. Bei langsamen Verbindungen empfiehlt sich noch zusätzlich die Option "-C". Auf trash.net ist X-Forwarding deaktiviert, und kann deshalb nicht benutzt werden.
Auch die Verbindung zum lokal laufenden ssh-agent kann über die SSH Verbindung weitergeleitet werden. Dies ist vorallem dann praktisch, wenn man SSH-Routen aufbauen will, also z.B. über einen Gateway Rechner auf eine Workstation dahinter.
ssh -A $ZIELHOST
Dies baut eine SSH Verbindung mit Agent Forwarding zum Zielhost auf.
SSH lässt sich hervorragend als Transport Layer für rsync benutzen. Damit ist eine sichere und effiziente Übertragung grosser Dateimengen möglich.
rsync -r -e ssh $REMOTEHOST:~/blah .
Dieser Befehl synchronisiert das Verzeichnis "blah" in das momentan aktive Verzeichnis. Dies ist vorallem dann praktisch, wenn die Funktionalität von scp nicht mehr ausreicht.
Leider hat der rsync Daemon noch keinen integrierten Support für verschlüsselte Verbindungen über SSH. Aber auch hierfür gibt es eine Lösung, vorrausgesetzt, du hast einen Shell Account auf dem Zielhost.
ssh -L 8730:localhost:873 $ZIELHOST
Portforwarding hilft uns auch hier wieder weiter. Allerdings verändert sich der Aufruf von rsync.
rsync rsync://$USER@localhost:8730/$ZIELMODUL .
Da man bei rsync eine eigene Kompression einschalten kann, mittels der Option -z, ist es unnötig ssh mit -C aufzurufen.
This document is public domain.