SSH Keys erstellen cover image

SSH Keys erstellen

Michal Jacko • 30. April, 2020

web-development tools-and-tips

SSH-Schlüssel stellen eine erhöhte Sicherheit für das Login auf einem Server dar im Gegensatz zu SSH mit einem Passwort.

SSH-Schlüssel-Paare bestehen aus einem öffentlichen Schlüssel und einem privaten Schlüssel.

Der private Schlüssel (Private Key) bleibt auf dem Client-Rechner, der öffentliche Schlüssel (Public Key) wird auf den Remote-Server übertragen. Zur SSH Authentifizierung auf dem Remote-Server brauch man dann kein Passwort mehr. Allerdings erhöht eine Passphrase (Passwort-Phrase) für den Private Key die Sicherheit um einen weiteren Faktor.

tl;dr

  1. Keys interaktiv generieren:
$ ssh-keygen -t rsa -b 4096
  1. Datei Namen nach dem Schema [user].[host] setzen.
  2. Optional Passphrase setzen
  3. Public Key nach dem Erstellen auf den Server kopieren
    (Alternative für Windows siehe unten):
$ ssh-copy-id -i ~/.ssh/[user].[host].pub user@host
  1. In lokaler ~/.ssh/config hinzufügen:
Host [domain]
    Hostname [host]
    user [user]
    IdentityFile ~/.ssh/[user].[host]
  1. Login testen:
$ ssh [domain]

Übersicht

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in ~/.ssh/id_rsa.
Your public key has been saved in ~/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Up6KjbnEV4Hgfo75YM393QdQsK3Z0aTNBz0DoirrW+c myusername@MyClient.local
The key´s randomart image is:
+---[RSA 2048]----+
|    .      ..oo..|
|   . . .  . .o.X.|
|    . . o.  ..+ B|
|   .   o.o  .+ ..|
|    ..o.S   o..  |
|   . %o=      .  |
|    @.B...     . |
|   o.=. o. . .  .|
|    .oo  E. . .. |
+----[SHA256]-----+

RSA-Schlüsselpaar Generierung

Das Schlüsselpaar wird mit dem Befehl ssh-keygen(Quelle) auf dem Client-Rechner erzeugt:

$ ssh-keygen -t rsa
Generating public/private rsa key pair

Schlüssellänge

Mit dem Parameter b kann die Schlüssellänge angegeben werden. Und dies sollte man auch, da mit den Standardeinstellungen nur 2048 bit lange Schlüssel erzeugt werden, diese gelten aber nicht mehr als sicher, da früher oder später knackbar. Um also sicherere Schlüssel mit 4096 bit Schlüssellänge zu generieren, einfach mit dem Parameter b aufrufen:

$ ssh-keygen -t rsa -b 4096

Schlüssel Namen

Der ssh-keygen-Befehl stellt nun interaktive Fragen:

Enter file in which to save the key (~/.ssh/id_rsa):

Enter speichert die Datei im vorgeschlagenen Verzeichnis. Bei einem neuen Schlüsselpaar ist der Default-Name immer id_rsa und id_rsa.pub. Ein zweites Schlüsselpaar für einen weiteren Server würde die Schlüssel überschreiben und den alten Schlüssel unbrauchbar machen! Darum kann man die Dateinamen der Schlüssel während der Erzeugung ändern oder ergänzen. Wenn weitere Schlüssel erzeugt werden, ändert man die Dateinamen, z.B.

~/.ssh/id_rsa_server1

Die Dateinamen der Schlüssel lauten dann id_rsa_server1 und id_rsa_server1.pub.

Passphrase für mehr Sicherheit

Enter passphrase (empty for no passphrase):

Die Passphrase chiffriert den Private Key zusätzlich und muss beim Login wie ein Passwort eingegeben werden, um den Private Key zu entschlüsseln. Es geht auch ohne Passphrase, aber das lokale Passwort ist ein weiterer Sicherheitsmechanismus: Die Sicherheit des Private Keys beruht darauf, dass er für niemanden sichtbar ist. Sollte der lokale Rechner kompromittiert werden (z.B. wenn der Rechner gehackt oder gestohlen wird), kann sich der Hacker ohne die Passphrase immer noch nicht einloggen.

Warum Passphrase und nicht Passwort? Im Gegensatz zum Passwort kann eine Passphrase nicht nur Buchstaben, Ziffern und Sonderzeichen enthalten, sondern auch Leerzeichen.

Die Erzeugung der Schlüssel

Nach der Abfrage der Passphrase erzeugt der Client das Schlüsselpaar und zeigt den Fingerprint sowie eine Visualisierung des Keys an:

The key fingerprint is:
SHA256:Up6KjbnEV4Hgfo75YM393QdQsK3Z0aTNBz0DoirrW+c myusername@MyClient.local
The key´s randomart image is:
+---[RSA 2048]----+
|    .      ..oo..|
|   . . .  . .o.X.|
|    . . o.  ..+ B|
|   .   o.o  .+ ..|
|    ..o.S   o..  |
|   . %o=      .  |
|    @.B...     . |
|   o.=. o. . .  .|
|    .oo  E. . .. |
+----[SHA256]-----+

Der Private Key liegt jetzt unter ~/.ssh/id_rsa.
Der Public Key unter ~/.ssh/id_rsa.pub:

$ ls -lha
-rw-------   1 myusername  staff  1766  1 Mär 07:21 id_rsa
-rw-r--r--   1 myusername  staff   416  1 Mär 07:21 id_rsa.pub
-rw-r--r--@  1 myusername  staff  1875 29 Dez 15:42 known_hosts

cat zeigt den Inhalt des Public Key:

ssh-rsa AAAAB3NzaC1yc2EAAAAD… myusername@MyClient.local

Public Key auf den Server kopieren

Jetzt muss der Public Key auf dem Server in der Datei authorized_keys eingetragen werden. Dafür gibt es das Tool ssh-copy-id (Quelle). Es verbindet sich über SSH zum Remote-Server, stellt sicher, dass die Datei authorized_keys existiert und fügt dann den Public Key hinzu.

$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

Alternativ auf Windows (da hier bei OpenSSH aktuell das Tool ssh-copy-id fehlt) mit Powershell direkt per SSH:

$ type .\.ssh\id_rsa.pub | ssh user@host "cat >> .ssh/authorized_keys"

Achtung: Hier fehlen die Checks, ob z.b. authorized_keys existiert!

Danach kann man den Login-Test machen:

$ ssh -l root 123.45.67.89
Enter passphrase for key '~/.ssh/id_rsa': 

Mehr als ein Schlüsselpaar?

Wenn Public Key und Private Key für mehr als einen Server angelegt wurden, kann in einer Config-Datei auf dem Client-Rechner SSH für die Zuweisung Host -> Schlüssel konfiguriert werden.

Wenn es noch keine Config-Datei gibt, einfach im .ssh-Verzeichnis anlegen mit folgender Struktur:

$ touch config
$ nano config
Host server1
  Hostname 123.45.67.89
  user webmaster
  IdentityFile ~/.ssh/id_rsa_server1
Host server2
  Hostname 98.76.543.210
  user webmaster
  IdentityFile ~/.ssh/id_rsa_server2

und anmelden mit

$ ssh server1 oder
$ ssh server2

Passphrase des Private Key ändern

Möchte man die Passphrase für einen existierenden Schlüssel ändern, kann man das mit folgendem Befehl tun:

$ ssh-keygen -f id_rsa -p