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