Jetzt beschreibe ich, wie mit Single-Sign on bereits beim Einloggen die SSH Schlüssel entschlüsselt werden können.
Zunächst installiert man das Paket libpam-ssh. Dieses Pam-Paket (Die Möglichkeiten von PAM würden den Rahmen dieses Artikels sprengen) ermöglicht es, bereits bei der Anmeldung am System die SSH-Schlüssel zu entschlüsseln und den ssh-agent zu starten. Dafür stellt es die beiden Module pam-ssh-auth (Authentifizierung anhand des ssh-keys) und pam-ssh-session (Start des SSH Agents sowie Laden der Schlüssel) zur Verfügung.
Nach der Installation muß man dann das System so konfigurieren, dass bei bestimmten Aktionen die beiden Module geladen werden. Möchte man z.B. beim Einloggen auf einer Konsole, dass die vorhandenen Schlüssel geladen werden, dann sollte man diese beiden Module in die Datei /etc/pam.d/login (Für den Loginzugriff bei Debian System verantwortlich) hinzufügen. Beim Start des grafischen Loginmanagers ist dann die Datei /etc/pam.d/gdm bzw, kdm, wdm oder xdm für den jeweiligen Loginmanager zuständig. Weitere Module könnten angepasst werden (z.B. ssh für den Login per ssh) In diesen Scripten steht im Prinzip in welcher Reihenfolge bestimmte Pam Module geladen werden sollen
Nun wird in vielen Howtos und Anleitungen empfohlen das Modul pam-ssh-auth vor dem Modul common-auth zu laden. Der Effekt der dadurch erzielt wird, ist, dass man beim Login dann grundsätzlich sein SSH Schlüssel Passwort eingeben muß und nicht sein Standard Unix Passwort. Wer das möchte, der kann das gerne machen, ich finde das nicht so schön, v.a. weil es mich nervt, wenn ich mich als User einlogge, der gar keine SSH Schlüssel besitzt.
Es ist aber auch möglich, sich mit seinem Unix Passwort anzumelden und dennoch die SSH Schlüssel zu laden, vorausgesetzt, die beiden Passwörter stimmen überein. Prinzipiell sollte es auch möglich sein, wenn das Passwort anders ist, denn über den Parameter try_first_pass sollte pam-ssh in der Lage sein, bei einem nicht passenden Passwort extra nachzufragen. Das tut er aber hier nicht:
root@t41:/etc/pam.d# cat pam-ssh-auth
auth sufficient pam_ssh.so try_first_pass keyfiles=id_dsa,id_rsa,identity,id_dsa1,id_dsa2,id_dsa3
root@t41:/etc/pam.d# man libpam-ssh
[...]
try_first_pass This option is similar to the use_first_pass option,
except that if the previously obtained password fails,
the user is prompted for another password.
root@t41:/etc/pam.d#
Wo wir gerade bei den Parametern sind, die weiteren Parameter geben an, in welche SSH Schlüssel beim Start geladen werden sollen. D.h. falls noch mehr Schlüssel geladen werden sollen, müssen hier die Namen angepasst werden.
Ein Beispiel Modul (hier wdm):
root@t41:/etc/pam.d# cat wdm
#%PAM-1.0
auth required pam_nologin.so
auth required pam_env.so
@include common-auth
@include pam-ssh-auth
@include common-account
@include common-session
@include pam-ssh-session
Login sieht ähnlich aus, auch hier wird nach der Zeile @include common-auth die Zeile @include pam-ssh-auth hinzugefügt. Und die Zeile @include pam-ssh-session wird hinter die Zeile @include pam-session eingefügt.
Wenn man das Prinzip verstanden hat, wie pam konfiguriert wird, ist es relativ simpel. Man könnte z.B. auch die obigen Zeilen an das Ende der Dateien common-auth bzw. common-session hinzufügen. Der Vorteil hier ist, dass automatisch alle Services, die diese beiden Module benutzen automatisch die pam-ssh Module benutzen.
Ich muß noch hinzufügen, dass pam-ssh hier bei grafischer Anmeldung nicht funktioniert hat. Es wurden keinerlei Keys geladen. Woran das lag, konnte ich jetzt nicht feststellen. Außerdem sollte man vielleicht noch erwähnen, dass es unter Berücksichtigung der Sicherheit eventuell kein so guter Rat ist, dass alle Schlüssel das gleiche Passwort haben und das diese Schlüssel dann auch alle gleich beim Start geladen werden. Wenn der Zugang kompromittiert wurde, müssen dann nämlich auch die Zugänge zu allen anderen Systemen als kompromittiert gelten, wenn die Schlüssel ohne Passwort benutzbar ist. (Das gilt natürlich im gleichen Maße für keychain).
Vielleicht wäre es auch keine schlechte Idee, wenn ssh-add mit dem Parameter -t gestartet würde. So kann man angeben, dass diese Schlüssel nur eine bestimmte Zeitspanne gültig sind:
cb@t41:~$ ssh-add -t 5 ~/.ssh/id_dsa && ssh-add -l && sleep 5 && ssh-add -l
Enter passphrase for /home/cb/.ssh/id_dsa:
Identity added: /home/cb/.ssh/id_dsa (/home/cb/.ssh/id_dsa)
Lifetime set to 5 seconds
1024 d4:3d:21:a7:fe:16:39:a4:f5:12:d7:cd:8f:aa:6d:10 /home/cb/.ssh/id_dsa (DSA)
The agent has no identities.
cb@t41:~$

