SSH Key Agents unter Linux und Windows/Cygwin

508 Wörter 3 Minuten Lesezeit

Schlüssel erzeugen

Mit folgender Befehlskette lässt sich - unter Linux oder Windows mit z.B. Cygwin - leicht ein sicherer Schlüssel (4096 Bits) erstellen, der öffentliche Schlüssel wird ebenfalls auf den Server geladen. Einfach die zwei Variablen user@hostund user@host.domain entsprechend anpassen.

export KEY=user@host && \
export LOGIN=user@host.domain && \
puttygen -t rsa -b 4096 -C "$KEY" -o ./$KEY.ppk && \
puttygen ./$KEY.ppk -O private-openssh -o ./$KEY && \
puttygen ./$KEY.ppk -O public-openssh -o ./$KEY.pub && \
ssh-copy-id -i ./$KEY.pub $LOGIN

Sollte bereits ein KeyAgent aktiv sein wird wahrscheinlich das ssh-copy-id so nicht funktionieren - der Server kennt den Schlüssel ja noch nicht. Der Upload geht im Fehlerfall dann unter Cygwin beispielsweise so:

cat ./$KEY.pub | \
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no $LOGIN "mkdir -p ~/.ssh && cat >>  ~/.ssh/authorized_keys"

ssh config

Damit nicht bei jedem SSH Login der Key explizit mit angegeben werden muss (ssh -i key user@host) kann man in der in der Datei ~/.ssh/config ein entsprechendes Profil einrichten und mit einem einfachen ssh hostname die Verbindung aufbauen (hostname, domain, myuser, /some/path/key.pub entsprechend anpassen).

Host hostname
	Hostname %h.domain
	User myuser
	Port 22
	IdentityFile /some/path/key.pub
	ForwardAgent no
	AddKeysToAgent yes

Key Agents

Vor dem SSH Key hatten wir uns mit einer User/Passwort Kombination angemeldet, sicherer ist nun die Variante User/Key, allerdings müssen wir nun immer noch ein Passwort - diesmal vom Schlüssel - eingeben, sprich für den User hat sich nichts verbessert.

ssh-agent

Der ssh-agent steht sowohl unter Linux als auch Cygwin zur Verfügung. Wird ein Schlüssel benötigt der bereits vom ssh-agent gespeichert ist wird er ohne weitere Abfrage direkt verwendet. Mit ssh-add /path/to/key kann der Schlüssel geladen werden, das Passwort wird nur mehr 1x abgefragt, danach wird der Schlüssel vom Key Agent bereitgestellt.

Zur Start vom ssh-agent wird das folgende Skript z.B. in die .bash_profile eingetragen - der Agent startet sich bei jeder Shell und wird beim Schließen der Shell auch wieder beendet.

SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
	eval `$SSHAGENT $SSHAGENTARGS`
	trap "$SSHAGENT -k" 0
fi

ssh-pageant

Während der ssh-agentdie Schlüssel selbst verwaltet sind bei Windows-Hyprid-Systemen mit Cygwin oder MSYS/MingGW oft 2 Agents aktiv - 1x im Windows (z.B. der Agent pageant.exe von Putty) und 1x im im API Wrapper. Das funktioniert, ist aber mitunter lästig. Cygwin’s ssh-pageant leitet Schlüsselanfragen einfach an den jeweils aktiven Windows-Agenten weiter, somit werden die Schlüssel nur unter Windows verwaltet, stehen aber in beiden Welten zur Verfügung.

Unter Cygwin wird die .bash_profile um folgende Zeilen ergänzt:

SSHAGENT=/usr/bin/ssh-pageant
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
	eval `$SSHAGENT $SSHAGENTARGS`
	trap "$SSHAGENT -k" 0
fi

KeePass KeyAgent

Wer ohnehin für die Passwort-Verwaltung KeePass verwendet kann auch SSH Keys damit verwalten - das geniale Plugin KeeAgent installiert sowohl einen KeyAgent Klienten als auch Server - und KeePass ist somit nicht nur für Passwörter sondern auch für SSH Schlüssel gerüstet. Unter Cygwin kann der KeyAgent entweder mittels ssh-pageant (s.o.) oder über ein Netzwerk-Socket verwendet werden.

Wer den Socket verwenden will (Aktivierung der Integration in den KeyAgent Einstellungen erforderlich!) schreibt dann diese Zeile in seine .bash_profile (ggf. Pfad anpassen!)

export SSH_AUTH_SOCK=/tmp/keepassagent.sock