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 /home/user/.ssh/id_ed25519.
Your public key has been saved in /home/user/.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.

$ ll .ssh/
total 8
total 4.0K
drwx------ 0 user user 512 2017-06-01 18:21 ./
drwxr-xr-x 0 user user 512 2017-06-01 18:20 ../
-rw------- 1 user user 464 2017-06-01 18:20 id_ed25519
-rw-r--r-- 1 user user  97 2017-06-01 18:20 id_ed25519.pub
-rw-r--r-- 1 user user 142 2017-06-01 18:21 known_hosts

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 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).

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

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

0 packages can be updated.
0 updates are security updates.

Last login: Thu Jun  1 18:56:32 2017 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]-----+

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

Authentifizierung über Passworte deaktivieren

Jetzt 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
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.

0 thoughts to “SSH Authentifizierung mittels Public-Keys”

Schreibe einen Kommentar

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