Vorteile & Vorraussetzungen von public Key Authentifizierung
Vorteile
Die erste Frage, die man sich stellt, bevor man etwas neues einrichtet, ist
meistens:
Was bringt mir public Key Authentifizierung ?
- Im Verbund mit ssh-agent ist nur eine einmalige Angabe des Passwortes erforderlich
- Durch das Einsetzen des public Key Verfahrens wird kein Passwort mehr übermittelt, ist also sicherer
- Will man das Passwort ändern, so reicht es, das des private Keys zu ändern
Vorraussetzungen
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:
- Du steigst auf ein freies Betriebsystem um z.B. Linux oder eines der freien BSD's
- Du benutzt das Einsteiger HOWTO
public Key Authentifizierung einrichten
Keypair erzeugen
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 public Key und einem private Key.
Wie der Name sagt, gehört der public Key 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 public Key, der auf die Remote Server gehört |
Den public Key platzieren
Nun musst du deinen public Key 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 public Key.
Der erste Einloggversuch
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
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.
ssh-agent automatisch starten
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
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 public Key
Authentifizierung.
scp & sftp
scp
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 public Key
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 public Key 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
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: public Key Authentication und On-the-fly
Komprimierung über gzip.
Port & X und Agent Forwarding
Port Forwarding
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
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.
Agent Forwarding
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.
rsync over ssh
Ohne rsync Server
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.
Mit rsync Server
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.
Für weitere Fragen, Kritik oder Korrekturen stehe ich gerne zur
Verfügung: lb auf trash.net
|