SSH Authentifizierung sicher verwenden
Aus Fedorawiki.de
Inhaltsverzeichnis |
Einleitung
Jeder der einen oder mehrere Linux Server verwaltet, kennt die Situation. Jedesmal, wenn man mit ssh auf Server zugreift, muss man das Passwort eingeben. Dies ist eine normale Tätigkeit, kann aber mit der Zeit und mit wachsender Anzahl der Server umständlich sein.
In diesem Artikel wird beschrieben wie man ohne Eingabe des Passwortes trotzdem eine sichere Authentifizierung durchführen kann. Die Anmeldeprozedur soll damit angenehm und vor allem sicher gestaltet werden. Die Beispiele in diesem Artikel beziehen sich auf die bekannte Client-Server Architektur
Schlüsselpaar erstellen
Um das Schlüsselpaar auf der Client-Seite zu erstellen, wechselt man in das Verzeichnis ~/.ssh
| |
Anmerkung:
Sollte das Verzeichnis nicht vorhanden sein, dieses mit: mkdir ~/.ssh && chmod 700 ~./.ssh erstellen. |
ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/sshuser/.ssh/id_dsa):
Hier mit Enter bestätigen.
Enter passphrase (empty for no passphrase):
Es gibt aber einen besseren, sicheren Weg schlüsselbasierte Authentifizierung zu verwenden. Im Laufe dieses Artikels wird erklärt, wie man dieses Ziel erreicht.
Nach der Generierung des Schlüssels werden zwei Dateien erzeugt: der öffentliche (id_dsa.pub) und der private (id_dsa) Schlüssel.
-rw------- 1 sshuser users 744 2004-04-02 09:44 id_dsa -rw-r--r-- 1 sshuser users 613 2004-04-02 09:44 id_dsa.pub
Öffentlicher Schlüssel exportieren
Der öffentliche Schlüssel (id_dsa.pub) muss auf den Server in die Datei ~/.ssh/authorized_keys kopiert werden:
cat id_dsa.pub | ssh sshuser@[server-IP] 'cat >>~/.ssh/authorized_keys'
| |
Tipp:
Aus Sicherheitsgründen sollte der private Schlüssel niemals exportiert werden. |
Verbindung herstellen
Es ist nun an der Zeit einen ersten Verbindungsaufbau zu initiiren:
ssh sshuser@[server-IP]
Wobei hier für [server-IP] die IP-Adresse eures Servers einzutragen ist.
Sollte nicht die untere Meldung erscheinen:
Enter passphrase for key '/home/sshhuser/.ssh/id_dsa'
ist wahrscheinlich bei der Konfiguration ein Fehler aufgetreten. Häufige Fehlerursachen sind falsche Verzeichnis- oder Dateiberechtigungen.
Sollte dies auch nicht den erwünschten Erfolg bringen, ist die Konfigurationsdatei (sshd_config) des Servers genauer zu untersuchen.
Die Frage wird sicher aufkommen: wieso muss ich das Passwort noch eingeben?
Aus Sicherheitsgründen wurde der private Schlüssel mit der Passphrase verschlüsselt, so daß beim Verbindungsaufbau diese auch abgefragt wird. Dies hat jedoch als Nachteil, daß bei jedem Verbindungsversuch die Passphrase abgefragt wird. Somit ist das Ziel einer passwortlosen bzw. passphraselosen Anmeldung noch nicht erreicht.
ssh-agent
Ein ssh-agent ist ein Daemon-Prozess, der private Schlüssel zwischenspeichert und auf authentifizierungsbezogene Anfragen von ssh-Clients antwortet. In diesem Fall ist es nicht mehr notwendig für jede einzelne ssh-Verbindung die Passphrase einzugeben. Vom Client aus öffnet man eine Konsole und führt den Befehl:
eval `ssh-agent` ssh-add
aus. Dadurch wird dem ssh-agent der private Schlüssel hinzugefügt. Nach einer einmaligen Eingabe der Passphrase kontaktieren von nun an alle ssh-Clients bei schlüsselrelevanten Operationen automatisch den Agenten.
Wird nun eine Verbindung zum Server gestartet, kann man sich ohne Eingabe der Passphrase anmelden.
ssh sshuser@[server-IP]
Diese Lösung funktioniert jedoch nur, wenn die Konsole, in welcher die Befehle eingegeben wurden, geöffnet bleibt; eine unbefriedigende Lösung.
Es sind noch weitere Nachteile aufzuzählen, welche das Ergebnis in keinem guten Licht stehen lassen:
- die Variablen die mit dem Befehl eval `ssh-agent` initiirt werden, stehen nach dem Schließen der Konsole dem System nicht mehr zur Verfügung.
- man kann keine Cronjobs verwenden, die auf den ssh-agent zugreifen.
Diese Probleme werden von Keychain gelöst.
Keychain
Keychain ist ein Bash-Skript, welches von Daniel Robbins, der Gründer von Gentoo Linux, geschrieben wurde. Es ermöglicht einen einzigen ssh-agent zu benutzen, nicht nur für mehrere Login-Sessions, sondern für ein ganzes System. Vereinfacht gesagt, ist Keychain ein Frontend für den ssh-agent.
Keychain installieren
Die Quell- sowie RPM Pakete sind auf der Seite des Authors verfügbar. Mit
rpm -i keychain-version.rpm
wird das Paket installiert. Anschließend fügt man der Datei ~/.bash_profile folgende Zeilen hinzu:
/usr/bin/keychain ~/.ssh/id_dsa
source ~/.keychain/${HOSTNAME}-sh
Keychain initialisieren
Es wird Zeit, Keychain in Aktion treten zu lassen. Hat man die obigen Zeilen in die ~/.bash_profile eingetragen, meldet man sich am System ab und wieder an. Keychain wird nun ausgeführt und nimmt die Eingabe der Passphrase entgegen:
KeyChain 2.5.5; http://www.gentoo.org/proj/en/keychain/ Copyright 2002-2004 Gentoo Foundation; Distributed under the GPL
* Found existing ssh-agent (7352) * Adding 1 ssh key(s)... Enter passphrase for /home/sshuser/.ssh/id_dsa: Identity added: /home/sshuser/.ssh/id_dsa (/home/sshuser/.ssh/id_dsa)
Um an dieser Stelle die Vorteile von Keychain hervorzuheben, ist eine erneute Ab- bzw. Anmeldung erforderlich. Wie man sieht, ist die Eingabe der Passphrase nicht mehr notwendig und es wird kein neuer ssh-agent Prozess gestartet:
KeyChain 2.5.5; http://www.gentoo.org/proj/en/keychain/
Copyright 2002-2004 Gentoo Foundation; Distributed under the GPL
* Found existing ssh-agent (7352)
* Known ssh key: /home/sshuser/.ssh/id_dsa
Damit bleibt der private Schlüssel im Cache des ssh-agent, solange das System nicht rebootet wird.
Um Gewissheit über unser erreichtes Ziel zu erhalten, wird nun eine Verbindung zum Server aufgebaut:
ssh sshuser@[server-IP]
Wird an dieser Stelle die Passphrase nicht abgefragt, hat alles funktioniert und man kann, trotz Eingabe der Passphrase bei der Generierung der Schlüssel, eine sichere passphrasefreie Anmeldung durchführen.
Cronjobs
ssh oder scp Befehle in Cronjobs können auch passwortfreie Verbindungen aufbauen. Um dieses zu realisieren, muss am Anfang jedes Skriptes, welches von Cron aufgerufen wird, folgendes eintragen:
source ~/.keychain/${HOSTNAME}-sh
Damit kann jeder ssh oder scp Befehl den laufenden ssh-agent Prozess finden und eine passwortfreie Verbindung aufbauen.
Zusammenfassung
Mit Hilfe von Keychain ist es nicht mehr notwendig private Schlüssel ohne Passphrase zu erstellen.
Weblinks
