SSH Authentifizierung sicher verwenden

Aus Fedorawiki.de

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der HOWTO Sammlung

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

Client server.png

Schlüsselpaar erstellen

Um das Schlüsselpaar auf der Client-Seite zu erstellen, wechselt man in das Verzeichnis ~/.ssh

Anmerkung 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):


Wichtig Wichtig:

An dieser Stelle werden viele verführt einfach kein Passwort einzugeben. Auch wenn diese Methode sehr angenehm ist, (man wird nicht mehr aufgefordert eine Passphrase einzugeben), entsteht dadurch ein erhebliches Sicherheitsrisiko. Sollte es Dritten gelingen, in den Besitz des privaten Schlüssels zu kommen, können alle Server, welche mit diesem Schlüssel konfiguriert wurden, kompromitiert werden.

Nur durch Eingabe eines Passwortes wird der private Schlüssel verschlüsselt abgespeichert.

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 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