Messen mit dem Raspberry, Login mit SSH

IT | 14. Februar 2014

Die Bauteile für Sender und Empfänger sind noch nicht eingetroffen, eine gute Gelegenheit, den Raspberry auf seine Aufgabe als Messwerkzeug vorzubereiten.

Die Aufgabe des Raspberry wird darin bestehen, die gesendeten Messwerte der Sensoren entgegenzunehmen und an den NAS-Server zu übermitteln. Dort werden die Daten in eine Datenbank geschrieben und können auf einer Webseite abgerufen werden. Der Raspberry braucht also im Prinzip für den Betrieb keine Tastatur oder Maus und keinen Monitor, er wird "Headless" betrieben.

Auch die Konfiguration und die Programmierung wird so erfolgen. Anpassungen der Konfiguration erfolgen im Terminal mittels vi (oder nano), Skripte und sonstiger Quellcode wird auf dem Desktop geschrieben und per SFTP auf den Raspberry geladen. Für den Terminalzugriff ist beim Mac keine zusätzliche Software erforderlich. Der Zugriff erfolgt über das LAN per SSH mit der Terminal-Applikation von OS X. Skripte (sowie alles andere abseits von C oder Swift) schreibe ich mit dem Editor Coda von der Fa. Panic.

SSH

SSH (Secure Shell) kommuniziert über TCP/22 und bietet im Gegensatz zu Telnet eine verschlüsselte Verbindung zwischen den Netzwerkknoten zur Verfügung. Sofern irgendwo beides angeboten bzw. möglich ist, ist SSH dem unsicheren Telnet auf jeden Fall vorzuziehen.

SSH ist auf dem Mac und dem Raspberry vorinstalliert. Auf Windows-PCs kann es zusammen mit PuTTY installiert werden. Der Verbindungsaufbau erfolgt nach diesem Schema:

  1. Aushandeln der Protokollversion
  2. Aushandeln der Kryptoalgorythmen
  3. Server erzeugt Public Key
  4. Server sendet Public Key und Server-Signatur
  5. Client prüft unter known_hosts (Falls nicht vorhanden, Sicherheitsmeldung)
  6. Client berechnet Public Key
  7. Client berechnet Session-Keys für Verschlüsselung aus Public Key
  8. Austausch der neuen Keys
  9. Verschlüsselte Verbindung initialisiert

SSH mit Passwort

Eine Authentifizierung am Remote-Client kann klassischer Weise per UserID und Passwort erfolgen:

  • ssh IP-Adresse (mit aktueller UserID am Remote-Client anmelden)
  • ssh UserID@IP-Adresse (mit anderer UserID am Remote-Client anmelden)

(Bei erstmaligem Verbindungsaufbau zu einem Remote-Client ist dessen Host-Schlüssel noch unbekannt (nicht in der lokalen Datei „~/.ssh/known_hosts“ eingetragen. Soll die Verbindung aufgebaut werden, ist die Meldung

The authenticity of host … can't be established.
RSA key fingerprint is …
Are you sure you want to continue connecting (yes/no)?

ist mit „yes“ zu beantworteten (ein „y“ reicht nicht). Nach Eingabe des Passwortes ist man auf dem Remote-Client angemeldet.

SSH schlüsselbasiert

Ich möchte auf dem Raspberry Aufgaben automatisieren. Dazu ist z.B. ein Login von einem anderen Rechner auf den Raspberry ohne Passwort erforderlich. SSH bietet hier neben der Authentifizierung mittels Passwort auch die Möglichkeit einer Authentifizierung mittels Schlüsselaustausch. SSH verwendet hierzu ein Paar aus privaten und öffentlichen Schlüsseln für die Anmeldung. Das ist sicher und sehr schnell gemacht:

  • Der lokale Rechner ist "Mac"
  • Der lokale User ist "volker"
  • Der Raspberry ist "Pi"
  • Der User auf dem Raspberry ist "admin"

Zuerst melde ich mich auf "Pi" als Benutzer "admin" an und erzeuge das Verzeichnis in dem die Schlüssel gespeichert werden:

mkdir ~/.ssh

Danach erzeuge ich auf "Mac" als Benutzer "volker" ein Schlüsselpaar. Wichtig: Es wird ohne scp Passphrase gespeichert (empty for no passphrase):

[volker@Mac:~] ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/volker/.ssh/id_rsa): 
Created directory '/Users/volker/.ssh'.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /Users/volker/.ssh/id_rsa. 
Your public key has been saved in /Users/volker/.ssh/id_rsa.pub. The key fingerprint is: 3e: ...

Dieser Befehl erzeugt im Benutzerverzeichnis die Datei id_rsa (~/.ssh/id_rsa) mit dem Schlüssel. Als nächstes wird der Inhalt dieser Datei auf den Raspberry transferiert:

[volker@Mac:~] cat ~/.ssh/id_rsa.pub | ssh admin@Pi 'cat >> .ssh/authorized_keys'

Dadurch wird der öffentliche Teil des Schlüsselpaares (der Inhalt von ~/.ssh/rsa_id auf dem Quellrechner) nach erfolgreicher Anmeldung an die Textdatei ~/.ssh/authorized_keys des Benutzers "admin" auf "Pi" angehängt. Da jeder Benutzer von mehreren Clients aus auf den Zielrechner zugreifen können sollten, sind in dieser Datei mehrere Schlüssel erlaubt. Sie werden jeweils in einer neuen Zeile gespeichert.

Die nächste Anmeldung erfolgt bereits per Schlüsselaustausch und ohne, dass ich ein Passwort eingeben muss.