dieser Artikel ist eine Kopie aus dem Blog mit der Addresse http://debian.asconix.com/key-ssh-authentication-debian-lenny-howto
zum Konservieren habe ich diesen Artikel kopiert.
Einleitung
Hat man bspw. als Systemadministrator eine Vielzahl von Linux-Rechnern bzw. Linux-Servern via SSH zu administrieren, verliert man u.U. schnell den Überblick über die einzelnen den Rechnern zugehörigen Passwörter. Zudem ist die Passwortabfrage bei SSH Sessions insbesondere bei selbstgeschriebenen Skripten, die bspw. der Automatisierung von Prozessen dienen sollen, hinderlich, da bei jeder SSH-Verbindung das System nach dem entsprechenden Passwort fragt. Aus diesem Grund existiert eine komfortable Lösung, sich gegenüber einem SSH-Server via Key zu authentifizieren (Public-Key Verfahren). Das folgende Howto beschreibt eine solche Lösung auf einem Debian GNU/Linux 5.0 (aka „Lenny“) System, läßt sich jedoch problemlos auf jede andere Distribution anwenden.
Generierung der RSA- und DSA-Schlüsselpaare
Zunächst einmal benötigen wir auf dem lokalen Rechner, dem späteren SSH Client, je ein Schlüsselpaar, bestehend aus einem privaten und einem öffentlichen Schlüssel, jeweils für die Verschlüsselungsverfahren RSA und DSA. Die Schlüsselpaare erzeugen wir für jeden User, der die SSH-Authentifizierung verwenden möchte.
Erzeugung des RSA Schlüsselpaares
Zuallererst generieren wir ein für das Verschlüsselungsverfahren RSA benötigte Schlüsselpaar (in unserem Fall für den Benutzer foobar):
localhost:$ ssh-keygen -t rsa
Daraufhin fragt uns das System nach dem Dateinamen, unter dem es den RSA-Key speichern soll. Wir verwenden den vom System vorgeschlagenen Speicherort:
Generating public/private rsa key pair. Enter file in which to save the key (/home/foobar/.ssh/id_rsa): <---- ENTER drücken
Daraufhin fragt uns das System nach einem Passwort, das zur Veschlüsselung des privaten RSA-Schlüssels verwendet werden soll. Da wir eine komplett passwortlose und automatisierte Authentifizierung anstreben, geben wir an dieser Stelle kein Passwort ein:
Enter passphrase (empty for no passphrase): <---- ENTER drücken Enter same passphrase again: <---- ENTER drücken
Anschließend quittiert uns das System das erfolgreiche Erstellen des RSA-Schlüsselpaares mit der Angabe der Dateien, in den der generierte private und öffentliche Schlüssel gespeichert werden, sowie einem Fingerprint des Schlüssels:
Your identification has been saved in /home/foobar/.ssh/id_rsa. Your public key has been saved in /home/foobar/.ssh/id_rsa.pub. The key fingerprint is: ba:de:24:34:e0:9a:28:dd:35:f3:ac:e0:e3:a1:42:4c foobar@nelson
Erzeugung des DSA Schlüsselpaares
Im zweiten Schritt erzeugen wir das das Verschlüsselungsverfahren DSA benötigte Schlüsselpaar:
localhost:$ ssh-keygen -t dsa
Daraufhin fragt uns das System nach dem Dateinamen, unter dem es den DSA-Key speichern soll. Wir verwenden den vom System vorgeschlagenen Speicherort:
Generating public/private rsa key pair. Enter file in which to save the key (/home/foobar/.ssh/id_rsa): <---- ENTER drücken
Daraufhin fragt uns das System, wie auch oben beschrieben, nach dem Passwort, das zur Veschlüsselung des privaten DSA-Schlüssels verwendet werden soll. Aus den gleichen Gründen, wie oben geben wir auch hier kein Passwort an:
Enter passphrase (empty for no passphrase): <---- ENTER drücken Enter same passphrase again: <---- ENTER drücken
Wie bereits bei der Erzeugung der RSA-Keys, quittiert das System auch diesen Vorgang mit der Angabe der Dateien, in den der generierte private und öffentliche Schlüssel gespeichert werden, sowie einem entsprechenden Fingerprint:
Your identification has been saved in /home/foobar/.ssh/id_dsa. Your public key has been saved in /home/foobar/.ssh/id_dsa.pub. The key fingerprint is: 55:ab:06:47:9c:9c:81:13:87:dd:29:9a:23:bb:48:00 foobar@nelson
Anmerkung: da die privaten Schlüssel nicht durch ein Passwort selbst geschützt sind, dürfen diese auf keinen Fall weitergegeben werden! Lediglich der alleinige Besitz der eigenen privaten Schlüssel sichert den entfernten SSH-Server vor unerwünschen Logins Dritter!
Kopieren der öffentlichen Schlüssel auf den Server
Da es sich bei der hier beschriebenen Authentifizierung um ein asynchrones Verfahren handelt, benötigt der SSH-Server die jeweiligen öffentlichen Schlüssel, die wir dorthin kopieren und der Konfigurationsdatei /etc/ssh/authorized_keys auf dem Server anhängen. Dies tun wir, indem wir auf dem lokalen Rechner, also dem SSH-Client, die folgenden Kommandos ausführen:
localhost:$ cat ~/.ssh/*.pub | ssh user@remoteserver 'umask 077; cat >> .ssh/authorized_keys'
Soll ein lokaler Benutzer auch als Root auf einem entfernten System lediglich via Key authentifiziert werden, müssen die öffentlichen Schlüssel zudem in das SSH-Verzeichnis von root kopiert werden:
localhost:$ cat ~/.ssh/*.pub | ssh root@remoteserver 'umask 077; cat >> .ssh/authorized_keys'
Anmerkung: insbesondere die schlüsselbasierte Authentifizierung als Root birgt erhebliche Risiken mit sich! Wo es immer möglich ist, sollte diese nicht verwendet werden. Muss dennoch auch Root via Schlüssel authentifiziert werden, müssen die privaten Schlüssel vor Einsicht Dritter besonders geschützt werden!
Konfiguration des SSH-Servers für passwortlose Authentifizierung
Damit der Server selbst die schlüsselbasierte Authentifizierung von Benutzern beim Aufbau einer SSH Verbindung unterstützt, muss die folgende Option in der Konfigurationsdatei /etc/ssh/sshd_config auf dem Server aktiviert werden:
PubkeyAuthentication yes
Testen der Konfiguration
Loggen wir uns nun als normaler Benutzer bzw. Root auf dem entfernten Rechner ein und haben dort unsere öffentlichen Schlüssel der Konfigurationsdatei ~/.ssh/authorized_keys wie oben beschrieben hinzugefügt, sollte der auf diesem Rechner laufende SSH-Server uns nun nicht mehr nach einem Passwort fragen, sondern uns allein anhand des zueinander passenden Schlüsselpaares authentifizieren.
Zum Abschnitt Kopieren der öffentlichen Schlüssel auf den Server: schaut euch mal ssh-copy-id an. Quasi der Debianway ![]()