Per ssh-key auf headless Servern einloggen

Wie man die Public-Key-Authentifizierung zum sicheren Login auf entfernten Rechnern nutzt

Wenn man einen Server wie z. B. einen kleinen Raspberry Pi betreibt, der weder an einen Monitor noch eine Tastatur angeschlossen ist, kann per secure shell von einem anderen Computer aus anmelden. Über die secure shell (ssh) ist eine sichere, verschlüsselte Verbindung von einem Gerät zu einem anderen möglich. Zudem kann man darüber erreichen, dass sich nur bestimmte authentifizierte Geräte mit dem Server per ssh verbinden dürfen.

Grundlagen

Wenn ssh auf dem Zielgerät aktiv ist, kann man sich von seinem Rechner aus über ein Terminal per ssh an dem Zielgerät anmelden. Der Befehl dafür hat zunächst die folgende Struktur:

$ ssh benutzer@server-ip

benutzer ist der Benutzername auf dem Zielgerät. Lässt man benutzer@ weg, wird der auf dem lokalen Rechner verwendete Benutzername angenommen und versucht, sich mit diesem Benutzer auf dem Zielgerät einzuloggen. Als server-ip kann entweder die IP-Adresse oder der Hostname des Zielgerätes angegeben werden.

Bei der ersten Verbindung erfolgt eine Abfrage, ob dem Zielgerät vertraut werden soll. Es folgt die Passwortabfrage für den genannten Benutzer. Hat man sich erfolgreich authentifiziert, landet man nun in der Shell des Zielgerätes und kann hier arbeiten, als säße man direkt vor dem Gerät.

Auf diese Weise kann man sich mit dem Benutzernamen und Passwort eines auf dem Server zugelassenen Accounts über ssh anmelden. Bequemer und sicherer ist es jedoch, statt der Anmeldung per Benutzername und Kennwort die Public-Key-Authentifizierung zu verwenden. Hierfür wird ein Schlüsselpaar erstellt, das aus einem privaten und einem öffentlichen Schlüssel besteht. Der öffentliche Schlüssel wird auf den Server geladen, der private verbleibt auf dem lokalen Gerät und kann zusätzlich noch mit einem Passwort verschlüsselt werden.

Erzeugen eines Schlüsselpaares

Auf dem lokalen Gerät wird zunächst ein Schlüsselpaar erzeugt:

$ ssh-keygen -t ed25519 

Die Frage nach dem Speicherort kann man einfach bestätigen oder man gibt manuell den Pfad an, wo und unter welchem Namen das Schlüsselpaar gespeichert werden soll. In unserem Fall lassen wir es bei der Standardeinstellung (~/.ssh/id_ed25519).

Als nächstes wird nach einem Passwort gefragt, mit dem man den privaten Schlüssel zusätzlich verschlüsseln kann. Hier kann, muss aber nicht, ein Passwort vergeben werden, das zur Verwendung des Schlüssels erforderlich ist. Da ich den Schlüssel beispielsweise auch innerhalb von Skripten verwende, die automatisch laufen sollen, habe ich kein Passwort vergeben.

Anschließend wird der öffentliche Schlüssel auf den Zielrechner übertragen:

$ ssh-copy-id -i ~/.ssh/id_ed25519.pub benutzer@server-ip

Nach Eingabe des Passwortes für den entfernten benutzer, wird der öffentliche Schlüssel auf dem Server zu den autorisierten Schlüsseln (~/.ssh/authorized_keys) hinzugefügt.

Fortan kann man die ssh-Schlüssel zur Anmeldung auf dem entfernten System verwenden. Je nach Konfiguration kann der Befehl dafür jedoch recht lang sein, z. B. bei Verwendung anderer Ports:

$ ssh -i ~/.ssh/id_ed25519 benutzer@server-ip -p 1234

Es bietet sich daher an, einen Eintrag in der ~/.ssh/config anzulegen.

Die .ssh/config

In der Datei ~/.ssh/config können für jeden Zielrechner bestimmte Informationen abgespeichert werden, die dann nicht jedes Mal beim Einloggen abgefragt werden, z. B. der Benutzername, der Port oder die Adresse des entfernten Gerätes. Auch kann hier definiert werden, welcher ssh-Schlüssel verwendet werden soll und wo dieser abgespeichert ist. Ein Eintrag in der config-Datei könnte also wie folgt aussehen:

# Server-Konfiguration
Host Kurzname
  HostName 192.168.1.123
  Port 1234
  User benutzer
  IdentityFile ~/.ssh/id_ed25519
  UseKeychain yes
  • Als Kurzname kann ein beliebiger Name für den Server vergeben werden (siehe weiter unten).
  • Hinter HostName wird die IP-Adresse oder der Hostname des Servers eingetragen, worüber man sich bisher angemeldet hat.
  • Mit Port kann man den Port definieren, unter dem der ssh-Zugang erreichbar ist.
  • Mit User definiert man den Benutzernamen, mit dem man sich auf dem Server anmelden möchte.
  • IdentityFile gibt an, mit welchem ssh-Schlüssel man sich anmelden möchte.
  • Will man nicht jedes Mal das Passwort des ssh-Schlüssels eingeben müssen, kann man UseKeychain yes nutzen. Das Passwort wird dann im Schlüsselbund des lokalen Rechners gespeichert.

Per ssh-key auf dem entfernten Gerät einloggen

Hat man einen Eintrag in der ~/.ssh/config für den entfernten Rechner hinzugefügt, kann man sich nun mit einem kurzen Befehl per ssh auf dem Server einloggen:

$ ssh Kurzname

Je nach Konfiguration wird nur noch nach dem Passwort des ssh-Schlüssels gefragt.

Nur noch Public-Key-Authentifizierung auf Server zulassen

Standardmäßig kann man sich weiterhin mit Benutzername und Passwort auf dem entfernten Gerät anmelden. Um dies zu unterbinden und nur noch die Anmeldung über die Public-Key-Authentifizierung zuzulassen, müssen ein paar Änderungen in der /etc/ssh/sshd_config auf dem Server vorgenommen werden.

Hierzu meldet man sich auf dem Server an und öffnet die Datei mit Schreibrechten:

$ sudo nano /etc/ssh/sshd_config

In der Grundeinstellung sind die meisten Einstellungen auskommentiert. Wir fügen die folgenden Zeilen hinzu, um den Server etwas abzusichern:

Port 1234                   # benutzerdefinierter ssh-Port
PermitRootLogin no          # root-login verbieten
MaxAuthTries 3              # maximal dreimalige Passworteingabe erlauben
PasswordAuthentication no   # Anmeldung mit Passwort nicht mehr möglich
UsePAM no                   # Anmeldung mit Passwort nicht mehr möglich

Wir speichern die Datei mit STRG+O und schließen sie anschließend mit STRG+X. Damit die Einstellungen übernommen werden, muss die ssh-Konfiguration neu eingelesen werden:

$ sudo /etc/init.d/ssh reload 

Die folgenden Beiträge könnten Dich auch interessieren: