Raspberry Media Center – Teil 28: SSH-Zugang absichern

SSH ist eine feine Sache – speziell beim Arbeiten mit Raspberry Pi Rechnern. Per Text-Konsole kann man damit von einem anderen Rechner auf den RasPi zugreifen, um Änderungen vorzunehmen, oder den Pi zu booten. Das alles sogar verschlüsselt. Sicherheitsrisiken bleiben allerdings, vor allem, wenn die herstellerseitigen Standardpassworte nicht geändert werden. In Zeiten von Bot-Netzen haben wir gelernt, dass nicht nur Rechner von unbedarften Windowsnutzern gekapert werden, sondern zunehmend auch Router, Drucker oder Netzwerkkameras. In diesem Artikel zeige ich, wie wir für SSH eine Authentifizierung über Public-Keys einrichten und dann auf Passworte verzichten können.

Grundsätzliches zu SSH, und was wir damit in einer Raspberry Media Center Umgebung machen können, habe ich in einem eigenen SSH-Artikel beschrieben. Dort ist auch nachzulesen, wie man SSH aufruft und welche Passworte für XBian, OSMC und OpenELEC voreingestellt sind. Für das neue LibreELEC lautet der Aufruf von einem Linuxrechner aus:

ssh root@libreelec

Das voreingestellte Passwort ist „libreelec“.

Sicherheitserwägungen

Und hier liegt auch bereits das Problem. Alle Betriebssysteme für den Raspberry Pi, auch Raspbian, haben bei der Installation einen voreingestellten User und für diesen ein Standardpasswort. Wenn das vom Anwender nicht geändert wird und der Raspberry Pi – auf welchem Weg auch immer – aus dem Internet oder über ein freies WLAN erreichbar ist, dann haben wir ein Sicherheitsproblem. Die Betriebssystemprogrammierer haben das erkannt und bei neueren Auslieferungen zum Beispiel bei Raspbian oder dem neusten LibreELEC ist SSH erst mal deaktiviert.

Bei Raspbian würde man nach der Installation das Passwort für den Standarduser Pi abändern und hat dann mit SSH auch kein Problem mehr. Bei OpenELEC und seinem Brüderchen LibreELEC ist eine Passwortänderung aber leider immer noch nicht möglich. Es sei denn, man würde diese Betriebssysteme selbst kompilieren, oder versuchen Passwortdateien auszutauschen. Machen wir kurz den Versuch bei LibreELEC das Passwort ändern zu wollen:

LibreELEC:~ # passwd

 There is no working 'passwd'.

 The 'passwd' command changes passwords for user accounts.

 With LibreELEC it is not possible to change the system password

 SSH is included only as a last support resort. SSH is off by default.
 Most users never need SSH and need help using it so we need a default
 password. If you need to keep SSH always on then this is unsupported
 but can be secured with certificates.

 TIP: disable password authentication in ssh and use public key authentication.

Es gibt also keine Möglichkeit mit passwd das Passwort zu ändern. Statt dessen wird empfohlen für SSH die Passwortauthentifizierung abzudrehen und statt dessen eine Public Key Authentifizierung zu verwenden. Und genau das tun wir jetzt.

Public Key Authentifizierung – so funktionierts

Stellen wir uns vor, wir haben einen Raspberry Media Center Rechner mit beispielsweise LibreELEC als Betriebssystem. Auf der anderen Seite steht ein Linux PC (mit Namen hal9000) von dem aus wir per SSH eine Verbindung zum RasPi aufbauen wollen. Wenn wir auf die Passwortabfrage verzichten wollen, dann müssen wir dem Raspberry Pi mitteilen, dass der Rechner hal9000 künftig berechtigt sein soll, sich per SSH anzumelden. Und wir müssen ihm eine Möglichkeit geben, hal9000 bei dessen Anmeldung zweifelsfrei zu identifizieren, damit kein anderer Rechner vorgeben kann hal9000 zu sein.

Erreicht wir das durch ein asymmetrisches RSA Schlüsselpaar. Auf hal9000 wird ein privater und ein öffentlicher Schlüssel erzeugt. Der private verbleibt ausschließlich auf hal9000, sollte dort durch ein Passwort (Passphrase) geschützt werden und darf nicht weitergegeben werden. Der öffentliche Schlüssel wird an LibreELEC übertragen und dort als autorisierter Schlüssel für hal9000 gespeichert. Das passiert einmalig zu Anfang.

Wenn hal9000 nun auf LibreELEC zugreifen möchte, dann generiert LibreELEC einen zufälligen Datenblock namens Challenge und sendet diesen an hal9000 zurück. Hal9000 verschlüsselt nun die Challenge mit seinem eigenen privaten Schlüssel und sendet diese Signatur wieder an LibreELEC. Wenn LibreELEC nun bei der Entschlüsselung der Signatur mit Hilfe des öffentlichen Schlüssels von hal9000 wieder die ursprüngliche Challenge erhält, dann ist hal9000 eindeutig identifiziert.

Das klingt erst mal aufwendig, aber wenn man bedenkt, dass dadurch der Dialog zur Passwortabfrage entfällt, dann ist die Public Key Authentifizierung für den Anwender eine deutliche Erleichterung.

Public Key Authentifizierung einrichten – in vier Schritten

1) SSH freigeben

Bei LibreELEC ist SSH zuerst einmal abgeschaltet. Falls wir bei der initialen Konfiguration des Systems SSH noch nicht erlaubt hatten, können wir das folgendermaßen nachholen: In der Kodi-Oberfläche gehen wir auf Einstellungen (Zahnrad oben), LibreELEC, Services und aktivieren rechts SSH. Der Menüpunkt SSH-Kennwort deaktivieren bleibt im Moment noch aus, weil wir für die Einrichtung den kennwortbasierenden Zugang noch brauchen.

2) RSA Schlüsselpaar generieren

Diese Aktion erfolgt nicht am Raspberry Pi sondern auf dem Rechner, der auf den RasPi zugreifen will, im Beispiel also hal9000. In einem Terminalfenster geben wir ein:

hal@hal9000:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hal/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/hal/.ssh/id_rsa.
Your public key has been saved in /home/hal/.ssh/id_rsa.pub.
The key fingerprint is:
78:38:fe:f1:b5:94:66:04:96:d2:78:49:5b:94:15:ac hal@hal9000
The key's randomart image is:
+--[ RSA 2048]----+
|          ..o+o. |
|         + =. .  |
|        o O  .   |
|       o + .E    |
|      + S   .    |
|     . o   . .   |
|      . .   *    |
|       . o = .   |
|        . . .    |
+-----------------+

Bei der Abfrage des Dateinamens behalten wir die Vorgabe bei. Den privaten Schlüssel können wir mit einer Passphrase schützen. Das sollten wir immer dann machen, wenn die Gefahr besteht, dass jemand die Datei id_rsa von hal9000 entwenden könnte. Das hat allerdings den Nachteil, dass bei Benutzung des Schlüssels jedesmal die Passphrase abgefragt wird. Wenn wir sicher sind, dass niemand Zugang zu hal9000 hat, dann können wir auch auf die Passphrase verzichten und bestätigen die Abfragen jeweils nur mit Enter.

3) Public Key auf Raspberry Pi übertragen

Im dritten Schritt muss der eben erzeugte Public Key (und nur dieser) auf den Raspberry Pi, also LibreELEC kopiert werden. Dazu müssen wir als Vorbereitung dort im Homeverzeichnis ein Unterverzeichnis .ssh anlegen. Dazu melden wir uns per SSH an LibreELEC an:

hal@hal9000:~$ ssh root@libreelec

Das voreingestellte Passwort ist „libreelec“. Und dann erzeugen wir das Unterverzeichnis:

LibreELEC:~ # mkdir -p ~/.ssh

Der Parameter -p bewirkt, dass keine Fehlermeldung erzeugt wird, falls das Verzeichnis bereits existiert. Von LibreELEC können wir uns nun abmelden, der eigentliche Kopiervorgang erfolgt wieder von hal9000 aus:

hal@hal9000:~$ cat ~/.ssh/id_rsa.pub | ssh root@libreelec 'cat >> .ssh/authorized_keys'
root@libreelec's password:

Hier muss nun letztmalig das Passwort „libreelec“ eingegeben werden. Durch diesen Schlüsselaustausch ist nun die Public Key Authentifizierung bereits fertig eingerichtet, die nötige Software bringt das Linux auf dem Raspberry Pi von Haus aus mit. Wir können jetzt einen erneuten Anmeldeversuch von hal9000 aus per SSH an LibreELEC versuchen und werden feststellen, dass kein Passwort mehr erforderlich ist.

hal@hal9000:~$ ssh root@libreelec
##############################################
#                 LibreELEC                  #
#            http://libreelec.tv             #
##############################################

LibreELEC (community) Version: 7.90.009
LibreELEC:~ #

Wenn der private Schlüssel mit einer Passphrase geschützt ist, wird diese an dieser Stelle abgefragt, für weitere Anmeldungen aber zwischengepuffert. Wir können nach dem Aufbau der SSH Verbindung kurz prüfen, was aus unserem öffentlichen Schlüssel geworden ist:

LibreELEC:~ # cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXEUmZTLb018MkTSicmIKMx2eTGavtLOK
JvRpuaFn7SygbXce2M5hUUFDAxtLvGJ3do89Qh1OsZanD3emIMbkwZ9u8bkUI0QduUbvzx5
WBxwu4kryDhCSTkbbxQcw/or6BD34IMhW//+gV/lA0Y0aURaqp3YIiTNEhjnXyK8amffZbk
AhXyxSHrtJkoJmlTES7TuLqQxY/YpK6vAblknjE11N3sWJ2nUHT4vPT6fUn6jAixJi6zjwC
mg7tjQ5rkN0p8FHKBf5V4F1h9qUi7/y0cNxqXLhPphkqKXdvq/CX8OhVWCboWCb+7IWSjLg
YGITq7kse2DYFGNRl12qEYysn hal@hal9000

4) Kennwortzugang am Raspberry Pi deaktivieren

Im letzen Schritt kann (und sollte) nun der SSH-Zugang per Passwort deaktiviert werden, so dass nur noch Rechner mit eingerichteter Public Key Authentifizierung Zugriff auf LibreELEC haben. Das passiert wieder wie in Schritt 1) in der Kodi-Oberfläche von LibreELEC. Dort gehen wir auf Einstellungen (Zahnrad oben), LibreELEC und Services und aktivieren den Punkt SSH-Kennwort deaktivieren.

Ein Anmeldeversuch von einem Rechner, dessen Public Key nicht in der Datei .ssh/authorized_keys enthalten ist, wird nun von LibreELEC wie folgt abgelehnt:

helmut@pdp8:~$ ssh root@libreelec
Permission denied (publickey,keyboard-interactive).

Und es wird auch kein Passwortdialog mehr angeboten.

Andere Raspberry Pi Betriebssysteme

Im Beispiel oben habe ich LibreELEC 8 (Alpha 9) als Betriebssystem angenommen. Das Gesagte lässt sich aber auf andere Betriebssysteme für den RasPi übertragen. Auch Raspbian ist dazu übergegangen, den SSH Zugang in der Standardauslieferung erst einmal zu deaktivieren, um das Sicherheitsrisiko SSH mit Standardpasswort zu umgehen. In Raspbian, XBian, OSMC und sicherlich vielen weiteren Betriebssystemen kann aber das Passwort des Standardusers (Pi bei Raspbian) geändert werden und das sollte man unbedingt machen. Damit muss man nicht unbedingt auf ein Public Key Verfahren umstellen. Aber die Möglichkeit, sich ohne Passwortabfrage am Raspberry Pi anzumelden, bringt auch hier zusätzlichen Komfort.

Für LibreELEC und OpenELEC gilt dagegen: So lange sich bei diesen Betriebssystemen das Root-Passwort nicht ändern lässt, sollte SSH entweder ganz deaktiviert, oder die Public Key Authentifizierung verwendet werden.

Und was ist mit Windows?

Hal9000 in meinem Beispiel ist ein Linuxrechner, was den Vorteil hat, dass das Betriebssystem bereits alles mitbringt, was für das Generieren von Schlüsseln und für den SSH-Zugriff per Public Key Methode benötigt wird. Aber auch unter Windows können wir uns per Public Key Authentifizierung am Raspberry Pi anmelden. Windowsnutzer verwenden Putty als SSH-Client und wie für Putty Schlüssel generiert werden können, beschreibt ein sehr guter Artikel auf pc-erfahrung.de, auf den ich hier gerne verweise.


Weitere Artikel in dieser Kategorie:

4 Kommentare

  1. Michael

    Hallo Herr Karger,
    Ich lese Ihren Blog gerne und interessiere mich für kodi auf dem Raspberry Pi 3. Ich besitze selber 3 von diesen wundervollen kleinst PCs auf welchen ich kodi, pi hole und der 3. Ist eine Testumgebung. Mich würde interessieren wie es aussieht mit kodi und online Speicher Dienste wie Google drive oder ähnliches, ist Ihnen eine Möglichkeit bekannt diese Speicher in kodi zu verwenden um hier Video Daten zu hinterlegen ?

    Antworten
    1. Helmut (Beitrag Autor)

      Hab ich selber noch nie probiert, aber Kodi bietet ja eine Menge Zugriffsmöglichkeiten auf andere Systeme. Die Frage wäre also, was der jeweilige Cloudstorage an Zugriffsmöglichkeiten anbieten kann und ob es dann Gemeinsamkeiten gibt. Falls nicht, würde ich mal die Kodi Add-Ons durchforsten, vielleicht gibt es welche für Cloud-Anbindungen.

      Antworten
  2. Markus

    Bei LibreELEC in der Version 9 kann man das Passwort ändern.
    Da ich hinter einer Fritzbox hänge und die Kiste nur gegen Laien sichern muss würde ich gerne ein einfaches Passwort nehmen.
    Leider ist dies jedoch nicht möglich da Richtlinien ein komplexes Kennwort erzwingen wollen, als Alternative bleibt nur das bekannte „libreelec“
    Irgendeinen Plan wie ich die Prüfung der Komplexität (auch für root) deaktivieren kann?

    PS: Ja, ich weiß was ich hier tue ;)

    Antworten
    1. Helmut (Beitrag Autor)

      Nein sorry, die Version 9 kenne ich noch nicht.

      Antworten

Schreiben Sie einen Kommentar

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