SSH Key Authentication

Wenn euer Server aus dem Internet erreichbar ist solltet ihr die SSH Authentication auf SSH Key umstellen. Hier zeige ich euch eine kurze Anleitung wie man das am Besten bewerkstelligt.

Wir benötigen drei Schritte um die Authentication auf Keys umzustellen.

  • SSH Key lokal generieren
  • Public Key auf deinen Server kopieren
  • SSH Agent konfigurieren

SSH Key generieren

user@myMacbook ~ % ssh-keygen -t rsa -b 4096 -C "myRaspis" -f .ssh/myRaspis_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in .ssh/myRaspis_rsa.
Your public key has been saved in .ssh/myRaspis_rsa.pub.
The key fingerprint is:
SHA256:+8wmN/aTxbiqiii3+k9dO3fanpcXtTiOcb4yIIOTpp8 myRaspis
The key's randomart image is:
+---[RSA 4096]----+
|                 |
|                 |
|                 |
|                .|
|      o S    o. o|
|     * + + ..+oo |
|    + o * o B+...|
|. .+ .. .*=B++o .|
|.=+o+E...**=B+.. |
+----[SHA256]-----+

Während der Erstellung der Keys wird man nach einer Passphrase gefragt, diese sollte man definitiv vergeben. Es gibt im SSH Package ein kleines Programm ssh-agent, dieses kleine Programm nimmt uns das eingeben der Passphrase bei jedem Login ab. Später dazu mehr. Danach findet man in .ssh/ zwei neue Dateien:

user@myMacbook ~ % ls -l .ssh
-rw-------  1 bzimmer  staff   3414  4 Mai 21:51 myRaspis_rsa
-rw-r--r--  1 bzimmer  staff    734  4 Mai 21:51 myRaspis_rsa.pub

Die Datei myServer_rsa ist der private Schlüssel und sollte gut aufgehoben und nirgends hinkopiert werden, ausser in dein Keepass(x).

SSH Key auf Remote Server kopieren

Die Datei myServer_rsa.pub ist der public Key und wird auf all deine Server kopiert. Dies kann man zum einen per ssh-copy-id oder ganz klassisch, den Inhalt vom public Key auf den Servern in die Datei .ssh/authorized_keys einfügen.

user@myMacbook ~ % ssh-copy-id -i .ssh/myRaspis_rsa.pub pi@192.168.21.56
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/myRaspis_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
pi@192.168.21.56's password:

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'pi@192.168.21.56'"
and check to make sure that only the key(s) you wanted were added.

Nun müsste auf dem Server in der Datei .ssh/authorized_keys der public Key enthalten sein. Man sollte so etwas ähnliches hier sehen:

pi@raspi-sp1: ~ $ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1........SS5XYCRbhdQ== myRaspis

Nun kann man sich per ssh pi@192.168.21.56 und Key authentication auf dem Server einloggen.

user@myMacbook ~ % ssh pi@192.168.21.56 -i .ssh/myRaspis_rsa
Enter passphrase for key '.ssh/myRaspis_rsa':

pi@raspi-sp1: ~ $

Die Option -i .ssh/myRaspis_rsa ist nur notwendig, da wir ganz am Anfang die erzeugten Keys in die Dateien .ssh/myRaspis_rsa und .ssh/myRaspis_rsa.pub geschrieben haben. Standardmäßig werden die Dateien .ssh/id_rsa und .ssh/id_rsa.pub erzeugt. Diese werden dann auch beim verbinden standardmäßig ausgewählt.

SSH Agent konfigurieren

Nun wollen wir das lästige eingeben der Passphrase noch irgendwie umgehen. Dazu haben die Entwickler von SSH das Programm ssh-agent entwickelt. Mit ssh-add -L kann man checken ob der Agent die Keys schon geladen hat. Dies wird wahrscheinlich beim ersten Mal nicht der Fall sein. Um die Keys zu laden führt man den Befehl ssh-add aus, danach wird man für jeden vorhandenen Public Key nach der Passphrase gefragt, die dann in der lokalen keychain abgelegt wird.

user@myMacbook ~ % ssh-add -L
The agent has no identities.
# Alle Keys laden und Passphrase in Keychain eintragen
user@myMacbook ~ % ssh-add
Enter passphrase for /home/user/.ssh/myRaspis_rsa:
Identity added: /home/user/.ssh/myRaspis_rsa (/home/user/.ssh/myRaspis_rsa)

# Nun sollte man hier alle geladenen Keys sehen
user@myMacbook ~ % ssh-add -L
ssh-rsa AAAAB3Nza..............FTcrMMZS0OzKlQ== myRaspis

Beim nächsten ssh login kann man sich ohne Eingabe der Passphrase einloggen. Als allerletztes kann man jetzt in der /etc/ssh/sshd_config das Login per Password verbieten in dem man die Password Authentication auf NO setzt: PasswordAuthentication no.

Nun müsste man jedesmal bevor man sich auf diesem/diesen Servern einloggt alle Keys laden mit ssh-add. Um dies zu umgehen müssen wir die Datei ~/.ssh/config erstellen, wenn noch nicht vorhanden. In diese Datei müssen wir folgende Sequenz einfügen:

Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/myRaspis_rsa

Danach müssen wir den Mac einmal neustarten und wir brauchen beim SSH Login keine Passphrase mehr eingeben.

Zusammenfassung

Hier nochmal alles in Kürze und mit Standardwerten, also ohne die oben angegebenen „myRaspis_rsa“ und „myRaspis_rsa.pub“.

# Keys erzeugen
ssh-keygen -t rsa -b 4096 -C "myRaspis"

# public Keys auf remote Server kopieren
ssh-copy-id pi@192.168.21.56

# SSH Keys in den SSH Agent laden
ssh-add

# Config Datei auf Macbook anlegen
Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_rsa

# auf dem Server die PasswordAuthentication abschalten 
PasswordAuthentication no