Dies ist eine kurze Anleitung, wie man ssh mit keys benutzt. Vergleichbare Anleitungen finden sich wahrscheinlich haufenweise bei Google. Dies hier ist meine, damit ich nicht immer Google bemühen muss.
Voraussetzung dafür ist natürlich, dass PublicKey-Authentifizierung überhaupt erlaubt ist. Dies geschieht durch die Anweisung
PubkeyAuthentication yes in /etc/ssh/sshd_config Und wenn man schon mal die Konfiguration prüft, kann man auch gleich überprüfen, dass Protokoll 2 verwendet wird und nicht das veraltete 1:
~$ egrep "PubkeyAuthentication|Protocol" /etc/ssh/sshd_config
Protocol 2
PubkeyAuthentication yes
Sieht gut aus. Nun können wir einen Key erstellen. Dies geschieht auf dem Client, von dem nachher auf den Server zugegriffen werden soll.
Grundsätzlich gibt es 2 vershiedene Arten: DSA und RSA. Die Art des Keys wird mit dem Parameter -t angegeben(default ist hier RSA). Für RSA-keys kann mit dem Parameter -b noch die bitlänge angegeben werden (default sind hier 768bit, DSA ist nur gültig mit 1024 bit).
user@host ~$ ssh-keygen -b 1024 -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
47:bf:9c:7a:0f:d8:26:15:4f:1f:d0:d7:54:d1:b4:0a user@host
Wichtig: Der Key sollte immer verschlüsselt werden. Also nie eine leere Passphrase angegeben, denn falls dieser Schlüssel in falsche Hände gerät, dann hat der Angreifer damit auch gleich Zugriff auf den Server.
Der Schlüssel besteht dabei aus einem privaten und einem öffentlichen Teil. Der öffentliche Schlüssel (id_rsa.pub) authentifiziert gegen den privaten Schlüssel (id_rsa), d.h. er muß auf den Server kopiert werden. Dafür gibt es den Befehl ssh-copy-id. Man kann es aber auch händisch machen:
user@host ~$ cat id_rsa.pub | ssh user@server 'cat >> .ssh/authorized_keys'
Password:
Fertig. Jetzt noch die Verbindung testen:
user@host ~$ ssh -v -i id_rsa user@server "exit"
[...]
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Offering public key: id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type
Enter passphrase for key 'id_rsa':
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
Es wurde einfach eine SSH-Verbindung mit dem Schlüssel id_rsa (-i) aufgebaut, die gleich wieder beendet wurde.Die Logausgaben (-v) zeigen, dass auch wirklich die PublicKey Methode verwendet wurde (Hervorhebung durch mich).
Das Passwort wird nur zur Entschlüsselung des privaten Schlüssels (id_rsa) benötigt und nicht, um sich auf dem Server anzumelden. Es wandert also nicht über die "Leitung".
Nun ist es bisher nicht sonderlich komfortabel, die Passphrase muß auch weiterhin jedesmal eingegeben werden. Deshalb gibt es den ssh-agent. Wenn dieser gestartet wird, speichert er das Passwort im RAM und nutzt dieses dann zum einloggen. Auch diesem muß einmal das Passwort mitgegeben werden, dann jedoch benötigt er es nicht mehr, vorausgesetzt, der ssh-client weiß, dass er den ssh-agent benutzen soll.
Einen Schlüssel kann dem ssh-agent über ssh-add mitgegeben werden. Hier wird dann auch nach dem Passwort des Schlüssels gefragt.
Zunächst wird der ssh-agent gestartet:
user@host ~$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-UL5yg0m5jV/agent.3636; export SSH_AUTH_SOCK;
SSH_AGENT_PID=5556; export SSH_AGENT_PID;
echo Agent pid 5556;
user@host ~$ eval `ssh-agent`
Agent pid 4520
Wenn der ssh-agent gestartet wird, startet er sofort im Hintergrund und gibt ein paar Umgebungsvariablen aus. Die Ausgabe erfolgt so, dass sie sofort an die bash weitergegeben werden kann. Damit der ssh-agent also genutzt werden kann, müssen diese Umgebungsvariablen der Shell zur Verfügung gestellt werden. Dies kann z.B. mit eval geschehen.
Neue Schlüssel können mit ssh-add hinzugefügt werden:
user@host ~$ ssh-add
Enter passphrase for /home/user/.ssh/id_rsa:
Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)
Damit dies z.B. automatisch bei jedem Einloggen geschieht, kann man das folgende in seine .bashrc schreiben (falls die bash die login Shell ist):
test $SSH_AGENT_PID || exec ssh-agent $SHELL -c "ssh-add; exec $SHELL --login -i"
Der Nachteil, loggt man sich auf verschiedenen Terminals ein, so werden u.U. mehrere ssh-agent gestartet. Wie man das komfortabel löst, erklärt eine andere Geschichte.