SSH mit dem Raspi – Erstellen von Schlüsseln und Verbinden via SSH

SSH mit dem Raspi – Erstellen von Schlüsseln und Verbinden via SSH

Category : Raspberry Pi

Ausdrucken Ausdrucken

sshkeyHeute beginnen wir eine neue Reihe und ich erkläre Euch, wie Ihr die Kommunikation mit Eurem Raspberry sicherer machen könnt.

Dazu kommen Zertifikate zum Einsatz, mit denen Ihr ein Schlüsselpaar generieren könnt und dann nur derjenige auf den Server Zugriff hat, der im Besitz eines gültigen Schlüssels ist.

Das Ganze gibt es natürlich auch in der Form für https, aber das folgt im zweiten Teil.

Fangen wir an: Zuerst benötigen wir auf unserem Raspi das openSSL-Paket.
In der Regel ist dies bei Raspian bereits vorinstalliert und Ihr könnt diesen Schritt überspringen.

Ob es vorhanden ist, lässt sich zum Beispiel prüfen mit:

Erscheint eine „1“, dann ist es installiert. Bei einer „0“ fehlt das Paket openSSL.

Falls es nicht installiert ist, dann das System zuerst updaten und dann openSSL mit diesen beiden Befehlen installieren.

 

Haben wir nun unser openSSL auf dem Raspi, erstellen wir uns nun ein Schlüsselpaar für den entsprechenden Benutzer – also uns selbst.
Dazu gehen wir in unser Homeverzeichnis:

Jetzt legen wir uns ein verstecktes Verzeichnis an, um darin die Schlüssel abzulegen, die wir nun generieren werden, wechseln in selbiges Verzeichnis und legen eine neue Datei wie folgt an:

Jetzt erstellen wir einen neuen Schlüssel:

Die Zahl 2048 gibt die Schüssellänge an und sollte nicht kleiner gewählt werden. 2048 ist vollkommen ausreichend, alternativ 4096 für Extremparanoiker 🙂
Beide Werte gelten als Sicher, aber ein 2048Bit großer Schlüssel ist schneller generiert. 1024 sollte man nicht mehr verwenden!

2048 Bit ist übrigens nicht doppelt so sicher wie 1024, sondern 2^1024 mal so sicher, also „1,797693134862315907729305190789e+308“ mal so viel (308 stellige Dezimalzahl). Das sollte wohl erstmal ausreichen, da muss ein oder mehrere Rechner lange für Rechnen. 🙂

Danach erfolgt folgender Dialog zeilenweise:

Wohin der Key gespeichert werden soll („Enter file in which to save the key“), kann mit Enter übergangen werden, dann wird in den vorgeschlagenen Pfad kopiert.

Dann wird nach einem Passwort gefragt und nach der Wiederholung.

Geschmackssache ob man eines verwenden möchte. Ich nutze zusätzlich zum Schlüsselpaar bis auf eine Ausnahme IMMER noch zusätzlich ein Passwort und empfehle es auch. (Faulheit ist ein Sicherheitsrisiko und Ihr solltet immer überlegen, dass Euer Rechner von der ganzen Welt aus erreichbar ist. Auch für diese Idioten, die versuchen, sich unberechtigt Zugang zu verschaffen.)

So, ist das abgeschlossen, wechseln wir mit

in das Schlüsselverzeichnis.

Es müssen sich nun folgende drei Dateien darin befinden die wir uns mit „ls -la“ auflisten lassen.


id_rsa
ist der private Schlüssel und id_rsa.pub ist der öffentliche Schlüssel.
In der authorized_keys2 legen wir nun all die öffentlichen Schlüssel ab, die der Nutzer noch so haben wird.
Die Datei authorized_keys2 hatten wir ja mittels touch neu angelegt, also ist sie noch leer.
Packen wir nun mittels des „cat„-Befehls unseren ersten Public-Key dort hinein.

ACHTUNG: Es ist wichtig, den cat-Befehl IMMER mit doppelten Pfeilen >> auszuführen, denn das ist die Anweisung, dass cat immer an das Inhaltsende der Datei schreiben, also anfügen soll.
Macht man das nicht, so löscht cat den Inhalt der Datei und schreibt den aktuellen Schlüssel als ersten neuen Wert hinein!

Hat man das richtig gemacht, bleibt die Ausgabe fehlerlos und der Cursor wartet in einer neuen Zeile auf weitere Eingabe.

So, die Hälfte ist geschafft, sprich, das Schloss haben wir installiert, jetzt müssen wir uns nur noch einen passenden Schlüssel aus dem Schlüssel basteln, wenn wir Putty unter Windows verwenden wollen.

Hat man als Zugriffsrechner einen weiteren Rechner mit Linux-System, hat man ja schon einen fertigen Schlüssel, mit dem man sich remote am Rechner, zum Beispiel via SSH anmelden kann, aber dazu gleich mehr.

Jetzt müssen wir nur noch sorgen, dass wir den privaten Schlüssel auf den eigenen Rechner kopiert bekommen.
Hier gibt es ein mögliches Sicherheitsproblem, denn mit der folgenden Methode kopiert Ihr mittels einfachem FTP-Protokoll den Key von Eurem Server zu Eurem anderen Rechner.
Rein theoretisch könnte man das Paket dabei abfangen, da FTP nicht verschlüsselt ist.
Zusätzlich gilt zu beachten, dass diese Methode nur funktioniert, wenn ein FTP-Demon (beispielsweise „ProFTPd“, „PureFTPd“ oder „vsftpd“) auf dem Raspi installiert und konfiguriert ist. (Ich werde später mal einen Beitrag zu einer Standard-ProFTPd-Installation noch schreiben.)

Wer den Raspi in der Nähe, oder keinen FTP-Demon installiert hat, kann natürlich auch einen USB-Stick nehmen und dort den privaten Key darauf speichern und ihn dann auf seinen anderen Rechner transferieren mittels HMP (Human-Moving-Protocol).

Reine Linux-Nutzer wären hier fertig, denn nachdem sie den Key auf ihren zweiten Linux-Rechner kopiert haben, können sie einfach eine Verbindung mittels

aufbauen, wobei die IP-Adresse natürlich Eurem Raspi entsprechen muss.
Dasselbe gilt für den Port, solltet Ihr den SSH-Dienst auf einen Alternativport (wie das geht kann man ab hier weiter unten lesen) gelegt haben.

 

Der Windows-Putty-Teil

Wollt Ihr via FTP Euren Key kopieren, so könnt Ihr hierfür beispielsweise den FTP-Browser WinSCP nutzen. (Ein kostenloses, einfaches, schönes Programm, was man gerne empfehlen kann.)
Nach dem Start gibt man dann nur noch die IP-Adresse des Servers ein, wo die Schlüssel liegen, seinen Benutzernamen und Passwort.

winscp1

Nachdem Ihr Euch erfolgreich eingeloggt habt, wechselt Ihr rechts in das .ssh-Verzeichnis und links in ein lokales Verzeichnis Eurer Wahl.

winscp2

Zum Vergrößern Bild anklicken

Jetzt müsst Ihr den privaten Schlüssel „id_dsa“ einfach anklicken und ihn auf die linke Seite ziehen (Drag’n’Drop).

Ihr braucht natürlich noch das Programm Putty aus dem Internet für die folgenden Schritte.

So, nun müssen wir den Originalschlüssel Puttytauglich machen, da Putty ein eigenes Format verwendet, das so genannte Putty Private Key File mit der Dateiendung *.PPK.

Dazu verwenden wir das mit Putty mitgelieferte Program namens „Puttygen“ (Putty Key Generator).
Tragt „Puttygen“ einfach in die Suchleiste Eure Windowssuche ein und startet das Programm.
Die Maske sieht wie folgt aus:

winscp3

Im Topmenue links oben unter „File„, oder rechts mittig wählen wir nun „Load“ aus und laden unseren Schlüssel.
Achtet unbedingt darauf, dass Ihr bei Dateityp „All files“ auswählt, denn sonst wird „id_dsa“ nicht angezeigt.

winscp4

Zum Vergrößern Bild anklicken

Habt Ihr beim Generieren ein Passwort eingetragen, so müsst Ihr es nun auch eintragen.
War das erfolgreich, erscheint ein Hinweis, dass Ihr den Schlüssel nun speichern könnt, damit er nun im PPK-Format vorliegt.

winscp5
Das tun wir jetzt und speichern den Schlüssel entweder über das Topmenü unter „File„, oder mittig mit dem Button „Save private key„.

winscp6

Das wars. Natürlich könnt Ihr den hier verwendeten Namen „dsa“ für Euren Schlüssel auch anders benennen, denn es spielt keine Rolle wie die Datei heißt, nur dass Ihr wisst, wie Ihr sie benannt habt und das der öffentliche Schlüssel der auf dem Server verbleibt der *.pub-Schlüssel ist.

Damit wir uns nun mit Putty anmelden können, ist es wichtig, dass neben der IP, Anmeldename, Passwort und Port auch der Pfad zum Schlüssel auf der ersten Seite konfiguriert wurde.

winscp7

Dazu müssen wir links unter „SSH“ -> „Auth“ auswählen und mittels „Browse“ suchen wir unseren Schlüssel heraus.

winscp8

Jetzt wechselt Ihr links wieder auf den ersten Punkt „Session“ und speichert die Einstellungen für die neue Session ab, wenn Hostname bzw. IP-Adresse eingetragen, der Port gesetzt sind, so wie die Einstellung für den Connection-Typ auf „SSH“ steht.

Fertig. Jetzt könnt Ihr Euch mit Putty zu Eurem Raspi verbinden.

Beim ersten Mal gibts einen Warnhinweis mit vielen Zahlen und „Fingerprints“. Putty will Euch nur mitteilen, dass er den Server noch nicht kennt, er ihn aber in seine Liste bekannter Server eintragen kann, so dass er beim nächsten Mal nicht wieder nervig nachhaken muss.

Gab es kein „Server refuses our key“ beim Anmelden, so habt Ihr alles richtig gemacht.
Ansonsten überprüft, ob in Putty der Pfad zum Schlüssel auch wirklich korrekt bei „Auth“ eingetragen ist und dass der Schlüssel auch der ist, der zum Schloss passt.

Ansonsten heißt es Fehler suchen und ggf. Prozedur wiederholen.

So, jetzt haben wir es fast geschafft, denn zum Abschluss stählen wir unser System noch ein wenig, um es besser vor Angreifern zu schützen:

 

Nochmal auf den Raspi-Server

Kleiner Tipp: Kleine Kinder versuchen gerne SSH-Server zu hacken.
Es ist kein Allheilmittel, aber wenn Ihr den Standard-Port auf dem OpenSSH-Server von 22 auf einen freien Port im hohen fünfstelligen Bereich legt, so wird es im Logfile sehr viel ruhiger.
Vergesst dann aber nicht, diesen Port auch bei Putty und anderen Programmen einzustellen, mit denen Ihr remote auf den Server zugreifen wollt.

Dort den Eintrag „Port 22“ auf den gewünschten Wert ändern.
Hier gibt es eine Liste aller Ports und wie sie belegt sind und was frei ist.
Natürlich können auch freie Ports auf Eurem System von einem anderen Programm bereits belegt sein.
Die aktuell belegten Ports Eures Raspis könnt Ihr Euch ansehen mit dem Befehl

Habt Ihr mit Eurem Benutzernamen und Eurem Schlüssel Euch erfolgreich anmelden können (und erst dann, sonst habt Ihr Euch ausgeschlossen), dann solltet Ihr folgende Dinge auch noch entsprechend einstellen. Habt Ihr Probleme, dann schaut etwas tiefer unter „#AuthorizedKeysFile„.

Öffnet auf Eurem Raspi die Konfiguration des SSH-Demons:

Sucht nach den folgenden Einträgen, ändert bzw. ergänzt sie wie folgt und speichert die Datei anschließend ab.


AllowGroups
erlaubt es Euch neben der direkten Auswahl der Benutzer mittels AllowUsers eine Gruppe freigeben zu können.
Dies macht dann Sinn, wenn man neue Nutzer anlegt und nicht bei jedem einzelnen Nachdenken möchte, in welche Programme man ihn ranlassen möchte oder nicht.
Am besten ist dennoch AllowUsers und AllowGroups gleichzeitig zu nutzen.

Auf jeden Fall mittels PermitRootLogin den Zugriff per Root abstellen.

Mit LoginGraceTime 30 gebt Ihr Euch, bzw. dem Benutzer 30 Sekunden lang Zeit, sich anzumelden.
Geschieht dies nicht, wird die Verbindung wieder getrennt.
Der Hintergrund ist der, das jeder geöffnete SSH-Task – auch wenn er ungenutzt offen ist – Rechenzeit und Speicher wegfrisst, was gerade auf dem Raspi doch Mangelware ist. Daher sollte die Zahl der laufenden Prozesse möglichst gering sein.

MaxStartups ist eine sehr interessante Einstellungsmöglichkeit die in diesem Beispiel wie folgt zusammengesetzt ist: Die 3 bedeutet, dass drei SSH-Verbindungen gleichzeitig geöffnet werden können zum einloggen. Ab der dritten gibt es aber nur eine 30%ige Wahrscheinlichkeit, dass eine weitere geöffnet werden kann.
Das ganze steigt linear um jeweils 10% an, bis nach 10 offenen Verbindungen definitiv keine neue mehr geöffnet werden kann, da wir dann 100% erreicht haben.
Bereits eingeloggte Benutzer sind hiervon ausgenommen.
Das hindert automatisierte Scripte daran, mehrere SSH-Sitzungen gleichzeitig zu öffnen und man auf diese Weise natürlich auch mehrere Passworte auf einen Treffer hin austesten kann.

StrictModes überprüft die allgemeine Sicherheit für den SSH-Dienst, beispielsweise, dass gewisse Dateien die benötigt werden, bestimmte Zugriffsrechte und Besitzer haben. So wird verhindert, dass beispielsweise mit falschen Zugriffsrechten ausgestattete authorized_keys (muss das Zugriffsrecht 0644 haben) den Sicherheitsmechanismus aushebeln könnten.

PasswordAuthentication auf no bedeutet, dass reine Passwort-Logins ohne Schlüssel generell nicht erlaubt sind.

Es gäbe noch ein paar Einstellungen mehr, beispielsweise könnte man gewissen IP-Bereichen den Zugriff blocken usw., aber für ein Sparschwein  baue ich auch keinen Bunker mit 20 Meter dicken Wänden und ohne Tür. 🙂

Dennoch fährt man mit diesen Einstellungen ein sehr sicheres System.

Gibt es Probleme, weil der Server beim Anmelden den öffentlichen Schlüssel nicht findet, dann versucht es, in dem Ihr die Zeile AuthorizedKeysFile aktiviert.

Jetzt müssen wir zum Abschluss den SSH-Dienst neu starten, damit unsere Änderungen aktiv werden. Das machen wir mit

So, nun habt Ihr einen sicheren Schlüssel- und Passwortgesicherten Zugang zu Eurem Raspi.

Im nächsten Teil statten wir einen Apachen mit SSL aus, damit wir unser Intranet auch mit https verwenden können.


Mario

20. August 2017 at 5:16 pm

Ein kleiner Fehler hat sich eingeschlichen.

ACHTUNG: Es ist wichtig, den cat-Befehl IMMER mit doppelten Pfeilen >> auszuführen, denn das ist die Anweisung, dass cat immer an das Inhaltsende der Datei schreiben, also anfügen soll.
Macht man das nicht, so löscht cat den Inhalt der Datei und schreibt den aktuellen Schlüssel als ersten neuen Wert hinein!

cat id_dsa.pub >> authorized_keys2
Es müsste wohl so aussehen.
cat id_rsa.pub >> authorized_keys2

    Ronin

    20. August 2017 at 9:58 pm

    Vielen Dank für den Hinweis. Ist korrigiert. Super, sehr aufmerksam gelesen 🙂

    Viele Grüße,
    Michael

Schreibe einen Kommentar