Donnerstag, 23. Juni 2016

Raspbian Konfiguration ohne Monitor und Keyboard

Als intensiver Raspberry Pi Benutzer hat man eigentlich für alle Fälle ein Image mit einem passenden OS rumliegen. Meine Images sind beispielsweise alle für meine privaten Netzwerke vorkonfiguriert und ich muss diese einfach nur auf eine SD Karte kopieren und in den Raspberry stecken. Dann kann es direkt losgehen – mit was auch immer. Die Konfiguration eines neuen Rasbians kann man meist auch erledigen, indem der kleine Einplatinencomputer mit einem Netzwerkkabel ins LAN gebracht wird.

Es gibt aber Gegebenheiten, in welchen diese Ansätze nicht weiterhelfen und die Umstände es nicht ermöglichen den Raspberry über das Netzwerkkabel ins Netz zu bringen und nur WLAN zur Verfügung steht. Es gibt einen einfachen Weg, diese Konfiguration an einem Laptop direkt nach dem Kopieren des Raspbian Image auf die SD Karte vorzunehmen. Die einzelnen Schritte beschreibe ich für Windows, Linux und (bald auch) OSX.
Ich beziehe mich hier auf das Standard Rasbian, das Howto geht NICHT mit Raspbian lite. (Stand 2016-05-27-raspbian-jessie-lite.img)
Das Image wird von https://www.raspberrypi.org/downloads/raspbian/ heruntergeladen.

Konfiguration unter Windows
Konfiguration unter Linux (Ubuntu)

Konfiguration unter Windows

Das heruntergeladene Image wird mit dem WinDiskImager32 auf die SD Karte kopiert.

Anschließend ist ein Teil (eine von zwei Partitionen) des kopierten Images im Windows Explorer sichtbar.

 In diesen Bereich wird eine neue Datei erstellt, die wpa_supplicant.conf genannt wird. In diese Datei werden die folgenden Informationen eingefügt (zum Editieren verwende ich gern Notepad++ oder Textpad)

update_config=1
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev

network={
   &nbsp ssid="SSID"
    psk="Passwort"
}

Ist die Datei gespeichert kann diese im Raspberry verwendet werden. Wird der Raspberry gestartet, bekommt er vom WLAN eine IP Adresse zugewiesen über welche auf den Raspberry zugegriffen werden kann. Die meisten Router oder Access Points haben ein Web Frontend über das man die IP Adresse des Raspberry herausfinden kann. Ist das nicht möglich, hilft ein Netzwerkscanner. Mit Windows Bordmitteln ist ein Scann des gesamten Netzwerks nicht (so einfach) möglich. Auf iOS und Android Smartphones habe ich dafür Fing.


Konfiguration unter Linux

Unter Linux kann man das Image mit dd auf die SD Karte kopieren. Zuerst wird geschaut, wie der Gerätename der SD Karte unter Linux ist. Bevor die Karte eingesteckt wird werden die gemounteten Speichergeräte aufgelistet. Dies erfolgt mit dem Befehl:

df -h

Anschliessend wird die SD Karte eingesteckt und der Befehl

df -h

erneut ausgeführt. In der Rückgabe sollte

/dev/mmcblk0p1

oder

/dev/sdd1

stehen. Ich verwende hier weiter den mmcblk0p1. Anschließend wird das Device mit umount ausgehangen. Sollten mehrere Partitionen auf der SD Karte sein (erkenntlich an mmcblk0p2, mmcblk0p3, …), müssen diese auch alle ausgehangen werden.
Anschließend kann das Image auf die SD Karte kopiert werden. Wichtig ist dabei, das hier auf die SD Karte und nicht auf eine Partition kopiert wird. Deswegen ist der Name auf den kopiert wird /dev/mmcblk0 oder /dev/sdd und nicht/dev/mmcblk0p1 bzw /dev/sdd1.
Der Befehl zum Kopieren lautet:

dd bs=4M if=2016-05-27-raspbian-jessie.img of=/dev/mmcblk0

Das Kopieren geht natürlich auch mit einer GUI mit einem aktuellen Ubuntu (16.x) geht dies recht einfach mit dem usb-imagewriter. Dieser muss gegeben falls nach installiert werden.
Nach dem die Karte beschrieben wurde, muss die SD Karte neu gemountet werden. Am einfachsten kurzzeitig entfernen und neu einstecken. Mit

df -h

erkennt man, dass die Karte zwei Partitionen hat. Eine Partition heißt /dev/mmcblk0p1 und die andere /dev/mmcblk0p2. Hier ist die kleinere Partition mit einer Größe von ca 50 bis 100MB interessant. Auf diese werden wir die WLAN Informationen kopieren, die später beim ersten Start von Raspbian im Raspberry an die richtige Stelle verschoben werden.
Im Terminal wird mit dem Befehl:

sudo wpa_passphrase testwifi testpassword >> /dev/ mmcblk0p1/wpa_supplicant.conf

werden die relevanten Informationen in die wpa_supplikant Datei geschrieben. Wer mag kann diese dann öffnen und folgende (fett geschriebenen) Informationen voranstellen, so dass die Datei dann folgenden Inhalt hat.

update_config=1
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
network={
    ssid="testwifi"
    #psk="testpassword"
    psk=d28f6e7bcc45536a1930c0010f1d8a8e16c5dc154cc1309ae97859f2586924df
}

Um sich später mit dem Raspberry verbinden zu können, muss die IP Adresse in Erfahrung gebracht werden. Wenn die MAC Adresse (oder der Herstellercode) bekannt ist, wird der Raspberry gestartet und nach einigen Momenten mit nMap nach dem Raspberry gescannt. Den Herstellercode (OUI genannt) kann man unter http://aruljohn.com/mac.pl herausfinden. Bei der Eingabemaske auf vendor lookup klicken und den Hersteller der Karte eingeben.

Die MAC Adressteil 80:F1:02 steht hier exemplarisch für meinen Edimax WIFI USB Adapter.

nmap -sP 192.168.50.0/24 | awk '/^Nmap/{ip=$NF}/80:F1:02/{print ip}'


Damit hat man alle Informationen, um sich mit SSH auf den Raspberry zu verbinden.

Mittwoch, 10. Februar 2016

Schlüssel basierte SSH Verbindung zum Raspberry

Wird mit dem Raspberry remote und ohne GUI gearbeitet, kommt SSH zum Einsatz. Mit dem Benutzernamen und dem Passwort kann man sich mit dem Raspberry verbinden. Unter Windows wird für diese Verbindung Putty verwendet bei Unix,Linux und macOS/OSX kann man das mit Bordmitteln.
Putty kann man von http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html herunterladen.
Diese Verbindung statt mit einem Passwort mit einem SSH Schlüssel aufzubauen hat einige Vorteile wie z.B.
  • Das Passwort wird nicht über das Netzwerk übertragen
  • Wenn der Raspberry im Internet steht, wird die Wahrscheinlichkeit von erfolgreichen Brute-Force Angriffen erheblich reduziert
  • man kann sich automatisiert und ohne Passwort mit dem Raspberry verbinden

Erstellen der Schlüssel

Um unter Windows einen Schlüssel zu erstellen wird von der Putty Webseite der PuttyGen geladen und gestartet. Anschließend wird geprüft ob der Schlüsseltyp auf SSH2 RSA steht und ob die Schlüssellänge ausreichend erscheint. Wobei 2048 ausreichend sein sollte. Zum Erstellen des Schlüssels wird auf Generate geklickt.

Ist der Schlüssel erzeugt, werden im PuttyGen Informationen zum Schlüssel angezeigt.

Wer mag kann unter Key Comment einen Kommentar zu diesem Schüssel einfügen, damit man später den Verwendungszweck wieder erkennen kann. Zusätzlich kann man seinen Schlüssel mit einem Passwort schützen, dies muss dann bei jeder Verbindung zum Raspberry eingegeben werden. Ich verwende dies in diesem Fall nicht, da ich den Vorteil eines schnellen, automatisierbaren und passwortfreien Verbindungsaufbau haben möchte.
Sind alle Informationen so vollständig wie man sich das wünscht, wird der Privatschlüssel gespeichert, indem auf Save Private Key geklickt wird. Normalerweise ist die Dateiendung ppk.
Man kann ebenfalls den Öffentlichen Schlüssel, den public Key speichern, notwendig ist dies hier nicht. Wir verwenden den Keystring aus dem PuttyGen und des Weiteren kann dieser öffentliche Schlüssel bei Bedarf immer aus dem privaten Schlüssel erzeugt werden.
Da der öffentliche Schlüssel später noch verwendet wird, wird PuttyGen erst mal nicht geschlossen.


Raspberry für SSH Keys konfigurieren

Davon ausgehend, daß der Raspberry läuft, wird mit Putty eine Nutzer/Passwort Verbindung aufgebaut.


In diesem Beispiel wird die Konfiguration für den Standardnutzer pi vorgenommen. Nach dem einloggen wird das Verzeichnis für den öffentlichen SSH Schlüssel erzeugt. Die erfolgt mit dem Befehl:

mkdir -p ~/.ssh

Danach wird die Datei für alle mit dem Nutzer verknüpften Schlüssel geöffnet (und falls nicht vorhanden erzeugt)

sudo nano ~/.ssh/authorized_keys

Aus dem PuttyGen wird der vollständige öffentliche Schlüssel markiert und kopiert. Dieser wird in dem Puttyfenster mit einem Rechtsklick wieder eingefügt. Der Schlüssel darf dabei nur auf einer Zeile stehen. Mit der Ende Taste sollte man an das Ende der Zeile springen und schauen dies mit dem Ende des Schlüssels in PuttyGen übereinstimmt.

Die Datei wird mit der Tastenkombination CTRL X anschließend Y und Enter gespeichert. Ist die Datei gespeichert wird diese mit folgenden Befehlen gesichert:

sudo chmod 644 ~/.ssh/authorized_keys
sudo chown pi:pi ~/.ssh/authorized_keys
sudo chmod 700 ~/.ssh

Der öffentliche Schlüssel befindet sich auf dem Raspberry, jetzt muss noch geprüft werden ob die Konfiguration für SSH passt. Dazu wird die Konfigurationsdatei mit

sudo nano /etc/ssh/sshd_config

geöffnet und geprüft ob die folgenden Einstellungen so in der Datei stehen (wahrscheinlich an unterschiedlichen Stellen in der Datei). Gegeben falls müssen voranstehende # Symbole entfernt werden.

PermitRootLogin no
AllowUsers pi
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
UsePAM no

Mussten an der Datei Änderungen vorgenommen werden, wird diese mit der Tastenkombination CTRL X anschließend Y und Enter gespeichert. Anschließend wird der SSH Deamon neu gestartet:

sudo systemctl restart sshd

Putty für die Verbindung mit SSH Key konfigurieren

Zu guter Letzt muss noch der Putty als SSH Client konfiguriert werden. Im Putty müssen unter Session die IP Adresse oder der Hostname eingegeben werden. Unter der Kategorie Connection->Data wird der Benutzername eingegeben und bei Connection->SSH->Auth den Pfad und Dateinamen des privaten Schlüssels. Siehe die folgenden drei Screenshots:
Abschliessend werden die Einstellungen gespeichert, indem unter Session ein Sessionname gewählt wird und auf Save geklickt wird.
 Später kann die Session mit einem Doppelklick gestartet werden. Wenn eine SSH Verbindung mit dem Schlüssel aufgebaut, sieht man die Erfolgsmeldung abschließend in der Konsole.
Über Kommentare und Hinweise zu dem Post freue ich mich :)