DSIW

Alles was interessant ist... (Linux, Programmierung, Datenschutz, Medien, uvm.)

SSH-Agent unter Linux einrichten

| Comments

Ein SSH-Agent ist ein Programm, das das Eingeben von Passwörtern erleichtert. Es ist recht mühsam immer wieder das Passwort beim Verbindungsaufbau einzugeben. Durch diesen Agent ist es möglich, das Passwort des Agents nur einmal am Anfang einzugeben. Danach sind weitere Passworteingaben überflüssig und nicht nötig. Da ich so manche Verzeichnisse mittels Unison synchronisiere und dieses Programm ssh nutzt, ist es mit diesem Agent recht bequem. Wie man diesen Einrichtet wird in diesem Artikel erklärt.

Benötigtes Paket

  • openssh (Arch Linux)
  • openssh-client (Ubuntu)

Einrichtung einer Schlüsselpaar-Authentifizierung

Zuerst muss ein Schlüsselpaar erzeugt werden. Was ein Schlüsselpaar ist, kann in einem anderen Artikel gelesen werden, ich werde hier nicht darauf eingehen.

Update vom 2012-03-01: Ich würde nicht mehr einen anderen Pfad, als den Standard-Pfad für id_rsa wählen (siehe Kommentar von Dakira). Ich habe den Artikel dem entsprechend angepasst.

Durch ein

1
ssh-keygen -t rsa

wird ein interaktives Programm gestartet, das ein solches Schlüsselpaar erzeugt. Ich empfehle den Standard-Pfad zu nutzen. Nach dem optionalen Setzen eines Pfades wird gefragt, welches Passwort gesetzt werden soll. Lässt man dieses leer, wird keines gesetzt, ich würde aber eines empfehlen. Natürlich sollte man auf die Güte des Passworts achten. Anschließend wurden in dem Verzeichnis /home/USER/.ssh zwei Dateien angelegt:

  • id_rsa (privater Schlüssel)
  • id_rsa.pub (öffentlicher Schlüssel)

Der öffentliche Schlüssel muss nun nur noch auf den externen Server verschoben werden:

1
ssh-copy-id user@server

Achtung: Dabei ist es absolut wichtig, dass der öffentliche Schlüssel, d.h. die Datei mit der Endung \*.pub auf den Server verschoben wird. Das erledigt der Befehl aber automatisch. D.h. man muss sich selbst nicht darum kümmern, welcher Schlüssel nun kopiert wird.

Nun kann über

1
ssh user@server

geprüft werden, ob es geklappt hat. Der folgende Prompt sollte zur Passwort-Eingabe auffordern: Enter passphrase for key '/home/USER/.ssh/id_rsa': Durch das Eingeben des vorher gesetzten Passworts entschlüsselt den privaten Schlüssel und man gelangt nun auf den gewünschten Server.

Rechte

Ich empfehle, dass die Rechte der Ordners ~/.ssh, so angepasst werden, dass es keine Schreib- und Leserechte für group, world gibt:

1
chmod 700 ~/.ssh

Nun haben wir eine Verbindung eingerichtet, die über öffentliche Schlüssel geschieht und nicht über das Passwort des Users auf dem Server.

Um nicht immer

1
ssh user@server

eingeben zu müssen, empfehle ich das Anpassen der Datei ~/.ssh/config. In dieser können Aliase für Hosts gesetzt werden. In meinem Fall sieht das ganze so aus:

1
2
3
4
Host <home>
    HostName <server>
    User <user>
    Port 22 #(Wenn Port in /etc/sshd_config geändert wurde.)

Hierbei sind natürlich Name des Hosts, server und user anzupassen.

Dadurch reicht ein ssh home, um sich zu dem Server zu verbinden.

Einrichtung des SSH-Agents

Nun sind alle Vorbereitungen getroffen, sodass wir nun den SSH-Agent einrichten können. Es gibt verschiedene Agents, die genutzt werden können. Ich hatte den normalen ssh-agent ausprobiert. Dieser funktionierte leider nicht wie gewünscht. Somit wurde der Agent von GnuPG erfolgreich getestet.

Update vom 2012-03-01: Da leider auch der GPG-Agent nicht 100%-ig zuverlässig funktioniert hatte, bin ich mittlerweile auf keychain umgestiegen. Siehe meinen Artikel Komfortabler SSH-Agent mit keychain. Somit sind die nachfolgenden Schritte nicht zu empfehlen.

Benötigtes Paket

  • gnupg2

Das folgende Skript write-env-gnupg-agent.sh startet den GnuPG-Agent, falls dieser nicht aktiv ist, oder nutzt den gestarteten.

1
2
3
4
5
6
7
8
#!/bin/sh

envfile="${HOME}/.gnupg/gpg-agent.env"
if test -f "$envfile" && kill -0 $(grep GPG_AGENT_INFO "$envfile" | cut -d: -f 2) 2>/dev/null; then
    eval "$(cat "$envfile")"
else
    eval "$(gpg-agent --enable-ssh-support --daemon --write-env-file "$envfile")"
fi

Dieses Skript habe ich in meinem ~/bin-Verzeichnis abgelegt und mittels

1
2
chmod u+x
write-env-gnupg-agent.sh

ausführbar gemacht. Außerdem wird dieses Skript gestartet, wenn meine Desktopumgebung geladen wurde. Dafür gibt es zwei Möglichkeiten dies einzurichten.

Möglichkeit 1: Graphical User Interface

Durch diese Möglichkeit wird das Skript mittels einer grapfischen Oberfläche eingerichtet. Unter meiner Desktopumgebung 'GNOME3' wird das Programm gnome-session-properties durch das Eingabeaufforderungsfeld, nach dem Drücken der Tastenkombination [Alt]+[F2] und dem Bestätigen mittels Enter gestartet.

Nach einem beherzten Klick auf 'Hinzufügen' öffnet sich ein Dialog, der folgendermaßen befüllt werden sollte:

Durch das Schließen der beiden Fenster, werden die Einstellungen gespeichert.

Möglichkeit 2: Command Line Interface

Das, was man per GUI machen kann, funktioniert auch durch das Erstellen einer desktop-Datei.

Die Datei write-env-gnupg-agent.sh.desktop mit dem folgenden Inhalt

1
2
3
4
5
6
7
8
9
[Desktop Entry]
Type=Application
Exec=/home/USER/sys/bin/sys/write-env-gnupg-agent.sh
Hidden=false
X-GNOME-Autostart-enabled=true
Name[de_DE]=GPG-Agent
Name=GPG-Agent
Comment[de_DE]=
Comment=

wird in dem Ordner ~/.config/autostart/ abgespeichert. Damit werden die Schritte getan, die auch die GUI machen würde. Natürlich müssen auch hier wieder die Pfade angepasst werden.

Nun werden wir den GPG-Agent konfigurieren: Die Konfigurationsdatei ~/.gnupg/gpg-agent.conf hat in meinem Fall diesen Inhalt:

1
2
3
4
5
6
default-cache-ttl 18000
default-cache-ttl-ssh 18000
max-cache-ttl 86400
ignore-cache-for-signing

write-env-file /home/USER/.gnupg/gpg-agent.env

Mit den Zeilen 1 und 2 wird die Speicherdauer des Agent-Passwort auf drei Stunden gesetzt. Dadruch gibt man das Passwort nur alle drei Stunden ein.

Zu guter Letzt, wird die Zeile

1
source $HOME/sys/bin/sys/write-env-gnupg-agent.sh

in die ~/.bashrc oder ~/.zshrc eingetragen, sodass das Skript auch bei jedem Bash- oder ZSH-Aufruf ausgeführt wird.

Nun kann mittels

1
ssh-add

ein Schlüssel mit dem dazugehörigen Passwort im Agenten abgespeichert werden.
Mittels

1
ssh-add -l

werden alle hinzugefügten Schlüssel angezeigt.

Ich habe noch das Paket pinentry installiert, das das Passwort nicht nur in der Konsole abfragen kann, sondern sich ein Dialog-Fenster öffnet. Somit kann das Passwort auch bei einem grafischen Programm eingegeben werden.

Weitere Informationen

Comments