SSH Nachbrenner


Von Lukas Beeler (lb auf trash.net)


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. Kopiere die Datei ~/.ssh/id_dsa.pub via scp (s. unten) oder sftp 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