SSH Authentifizierung mittels Public-Keys

Authentifizierung über Public Keys ist die Bezeichnung dafür, dass für das Anmelden an einem SSH Server kein Passwort, sondern ein Kryptographischer Schlüssel verwendet wird, welcher lokal auf dem PC gespeichert ist. Die dazu verwendeten Schlüssel bestehen aus zwei Teilen, einem öffentlichen und einem privaten Teil. Der öffentliche Teil ist kein Geheimnis und wird z.B. auch auf dem Server abgelegt. An Angreifer, welcher in Besitz dieses öffentlichen Teils des Schlüssels gelangt, kann nichts damit anstellen. Der private Teil hingegen muss immer sicher gespeichert und darf nicht weitergegeben werden. Mit ihm ist es möglich sich am Server anzumelden.

Diese Methode ist sicherer als die Anmeldung mit einem Passwort, da es erheblich einfacher ist durch alleiniges ausprobieren (Bruteforce) ein Passwort zu erraten als einen Kryptographischen Schlüssel. Außerdem erleichtert es die Zugriffsverwaltung enorm, da keine Passwörter mehr auf sicherem Weg zum Server transportiert werden müssen bzw. unter verschiedenen Nutzern geteilt werden, welche den gleichen Benutzer auf dem Server verwenden.

Mittels Public-Key-authentifizierung kann z.B. einer dritten Person, welche den SSH Zugang einrichtet einfach der öffentlichen Schlüssel mitgeteilt werden. Die dritte Person hinterlegt diesen dann auf dem Server. Da der öffentliche Schlüssel kein Geheimnis ist, kann er einfach per Mail an diese Person gesendet werden. Falls später einem User der Zugriff zum Server entzogen werden soll, kann einfach der Schlüssel des Users vom Server entfernt werden, ohne das alle anderen, welche den gleichen Benutzer verwenden, ein neues Passwort benötigen.

Schlüssel generieren

Um sich mittels Public-Keys an einem Server anzumelden wird ein Kryptographisches Schlüsselpaar benötigt. Dieses lässt sich wie nachfolgend beschrieben generieren. Während der Generierung fragt das Skript nach einem Speicherort, dies kann einfach mit Enter bestätigt werden. Anschließend wird nach einem Passwort gefragt, mit welchem der Schlüssel geschützt werden soll. Dort sollte ein sicheres Passwort angegeben werden, da sonst jede Person mit Zugriff auf den Schlüssel und das Passwort in der Lage ist sich bei allen SSH Servern anzumelden bei denen der Schlüssel hinterlegt ist.

$ ssh-keygen -t ed25519 -o -a 100
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/carsten/.ssh/id_ed25519.
Your public key has been saved in /Users/carsten/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:bPZq/CAmQcZSNC1TeP72PHsfXcSXPHP3UTKV2Xz7Suw user@host
The key's randomart image is:
+--[ED25519 256]--+ 
|   .++.       oo*|
|   o+.o       .**|
|  . +=         *O|
|   +  ..       oO|
|    .  .S    .  +|
|     . oo.    o.o|
|    . oo.o.  o...|
|     o .oo+ . E. |
|       ...o+ ..  |
+----[SHA256]-----+

Nun wurde ein Schlüsselpaar generiert und im Ordner .ssh im Homeverzeichnis abgelegt. Die Datei ohne Endung ist der private Schlüssel. Die Datei mit Endung .pub ist der öffentliche Schlüssel.

$ ls -al .ssh/
total 16
drwx------   4 user  user  128 Jun 11 10:29 .
drwxr-xr-x  22 user  user  704 Jun 11 10:28 ..
-rw-------   1 user  user  464 Jun 11 10:29 id_ed25519
-rw-r--r--   1 user  user   97 Jun 11 10:29 id_ed25519.pub

Schlüssel auf Server kopieren

Anschließend kann der öffentliche Schlüssel auf den Server kopiert werden. Dazu kann ssh-copy-id verwendet werden. Es benötigt als Eingabe den öffentlichen Teil des Schlüssels sowie den Server auf den er kopiert werden soll. Während der Ausführung fragt es noch nach dem Passwort zum Anmelden am Server.

$ ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_ed25519.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
user@server's password: 

Number of key(s) added:        1

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

Nun sollte wie angezeigt noch geprüft werden, ob auch nur der angegebene Schlüssel auf dem Server hinzugefügt wurde. Dazu muss man sich zuerst mit dem Server verbinden. Die SSH Passwortabfrage sollte jetzt schon nicht mehr kommen sondern stattdessen die Frage nach dem Passwort für den Schlüssel.

$ ssh user@server                                                                             
Enter passphrase for key '/home/user/.ssh/id_ed25519': 
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.x.x-xx-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Thu Jun 11 11:23:14 UTC 2020

  System load:             5.91
  Usage of /:              0.6% of 1.79TB
  Memory usage:            4%
  Swap usage:              0%
  Temperature:             42.0 C
  Processes:               212
  Users logged in:         1
  IPv4 address for enp6s0: xxx.xxx.xxx.xxx
  IPv6 address for enp6s0: xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx

0 updates can be installed immediately.
0 of these updates are security updates.


Last login: Thu Jun 11 09:09:01 2020 from xxx.xxx.xxx.xxx

Auf dem Server angekommen muss nun die Datei authorized_keys im Verzeichnis .ssh im Homeverzeichnis genauer angeschaut werden.

In der Datei sollte nur eine Zeile stehen welche identisch mit der Datei id_ed25519.pub auf dem eigenen PC ist. Falls zusätzliche Schlüssel hinzugefügt werden wird für jeden Schlüssel eine zusätzliche Zeile eingefügt.

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK7PQzYwkk1+CTCACPhSUCV1+TMyDcfOx7FC4kRkOjNE user@host

Zweites Schlüsselpaar generieren

Für den Fall, dass ein Server oder die genutzte Software ed25519 nicht unterstütz sollte zusätzlich ein RSA Schlüsselpaar mit einer ordentlichen Länge generiert werden. Dies geht analog zur Generierung des ed25519 Schlüssels mit nachfolgendem Befehl erledigt werden.

$ ssh-keygen -t rsa -b 4096 -o -a 100
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:sxVb8JTZxKx/MgQdzgwEP/sXd9eMcPVtGcMMb9oM5lc user@host The key's randomart image is:
+---[RSA 4096]----+
|          oo+X*+.|
|           =+=*+*|
|          . *==+E|
|           ++=B+o|
|        S o .=.=*|
|         +   .= *|
|        .     .+.|
|               . |
|                 |
+----[SHA256]-----+

Der RSA Schlüssel kann mit den gleichen Befehlen wie der ed25519 Schlüssel auf den Server kopiert werden.

Authentifizierung über Passworte deaktivieren

Nachdem geprüft wurde das die Anmelung mittels Schlüssel funktioniert sollte noch auf Serverseite die Authentifizierung über Passwörter deaktiviert werden. Dazu einfach die Konfigurationsdatei /etc/ssh/sshd_config als root öffnen und die Werte wie nachfolgend beschrieben anpassen bzw. ergänzen.

 PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes

Damit die Änderungen wirksam werden muss im Anschluss noch die Konfiguration des SSH Servers neu geladen werden.

$ sudo service ssh reload

Zum Abschluss sollte noch geprüft werden, dass die Anmeldung mittels Passwort nicht mehr möglich ist.

$ ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no user@server
user@server: Permission denied (publickey).

Im Artikel Sichere SSH Konfiguration habe ich meine komplette SSH Konfiguration beschrieben. Diese reduziert z.B. die erlaubten Kryptographischen Algorithmen auf als sicher geltende.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.