Artikel top billede

Gør det selv-IOT del 2: Byg en dims, der kan tænde og slukke for andre dimser over internettet - installation og forberedelse af Raspberry Pi

Klumme: Internet of Things er tidens store buzzword, men kan man selv ved hjælp af lidt fingersnilde strikke en IoT-løsnings sammen, som kan tilgås fra en åben platform? Her er andel del af det store selvbyggerprojekt.

I foregående klumme fik vi specificeret dimsen, vi skal lave.

Før vi begynder på at lave hardware og den egentlige kode, skal vi have klargjort vores Raspberry Pi til brug.

Den process beskriver jeg i denne klumme, og de to næste klummer kommer så til at handle om hardwaren og selve softwaren.

Advarsel: Ved at læse denne artikel risikerer du skader på pande og næse! Vi skal igennem en masse basic stuff, og det kan være lidt søvndyssende - Se bare mig under skrivningen:

I det følgende antager jeg at vi starter med en Raspberry Pi med en frisk installation af Rasbian.

Hvis du har brug for hjælp til at installere, så se her

Det er kommet en ny version af Rasbian kaldet "Jessie", og jeg har valgt LITE-versionen, da vi ikke skal bruge desktoppen til noget.

Vent lige med at tilslutte noget netværk til RPI'en, og forbind et keyboard via USB samt en skærm til HDMI-porten.

Forbind strøm til RPI'en, og når den er færdig med at starte op, ender den i en login-prompt. Login med "pi" som brugernavn og "raspberry" som password.

Først konfigurerer vi nogle standard-ting ... hostname, tidszone og så videre.

sudo raspi-config

Expand filesystem

Så er vi sikre på, at hele SD kortet er til rådighed for filsystemet.

Advanced options -> Hostname
Jeg vælger "skarpline-iot". Vælg det, du finder passende. Bemærk, at specialkarakterer ikke understøttes.

Advanced options -> SSH
SSH skal være enabled.

Advanced options -> Memory Split
Hvor meget RAM skal dedikeres til grafikkortet? Vælg den laveste værdi (16), da vi ikke skal bruge grafik, og vi derfor lige så godt kan frigøre mest mulig RAM til systemet.

Internationalisation Options -> Change Timezone
- Timezone: Copenhagen

Vælg 'Finish', og reboot RPI'en, og log ind igen med 'pi' som bruger.

Det næste, vi skal have fikset, er udskiftning af standard-brugernavn og password, og det bør man altid gøre, før RPI'en så meget som lugter til en internetforbindelse!

Vi skal først sikre os, at den nye bruger får samme rettigheder som den gamle, så lad os se, hvilke grupper brugeren 'pi' er medlem af:

pi@skarpline-iot:~ $ groups
pi adm dialout cdrom sudo audio video plugdev games users input netdev gpio i2c spi
På nær 'pi', som vi sletter, vil vi have samme grupper til vores nye bruger. 

Så tag listen, fjern 'pi' og sæt kommaer mellem de andre (fjern mellemrum). Min nye bruger hedder 'rpi_admin'.

pi@skarpline-iot:~ $ sudo useradd -m -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi rpi_admin
Nu skal vi tildele den nye bruger et passende password.
pi@skarpline-iot:~ $ sudo passwd rpi_admin
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Reboot
pi@skarpline-iot ~ $ sudo reboot
Login med den nye bruger, vi har lavet, og slet 'pi'-brugeren.
rpi_admin@skarpline-iot ~ $ sudo deluser --remove-all-files pi

Nu kan vi forbinde RPI'en til vores internetrouter med et ethernetkabel og prøve at forbinde til den via SSH.

Når du har tilsluttet kablet, skal vi tjekke, om enheden har fået en IP-adresse:

rpi_admin@skarpline-iot ~ $ ifconfig
eth0 Link encap:Ethernet HWaddr b8:27:eb:aa:d8:af
inet addr:192.168.1.40 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1236 errors:0 dropped:0 overruns:0 frame:0
TX packets:770 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:165094 (161.2 KiB) TX bytes:128214 (125.2 KiB)
Min enhed har altså IP-adressen 192.168.1.40. Hvis din enhed ikke har fået en IP-adresse, skal du fejlsøge på det. Det er forudsætningen for det videre forløb, at RPI'en har netværksforbindelse.

Nu har vi fat i netværksforbindelsen, så skærm og keyboard kan frakobles. Fra nu af benytter vi kun SSH.

På linux eller OSX åbner du en kommandoprompt og skriver (hvor IP-adressen skiftes til den for din RPI).

ssh rpi_admin@192.168.1.40
Bruger du Windows, anbefaler jeg, at du downloader putty (http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html).

Nu skal vi sikre, at al software på RPI'en er opgraderet til nyeste version - dette kan tage nogen tid:

sudo apt-get update && sudo apt-get upgrade
It-sikkerhed er krig, og lige som generalen i krigen, der sørger for at lukke flanker, skal vi sørge for at lukke for alt det, man ikke har brug for. 

En åben port kan angribes. Derfor installerer vi en firewall og blokerer alt andet end 22/SSH 80/HTTP og 443/HTTPS.

Når vi har fået SSL op at køre, lukker vi også for 80/http. Jeg anbefaler UFW (uncomplicated firewall), som er en skal oven på iptables, der er nem at bruge.

rpi_admin@skarpline-iot:~ $ sudo apt-get install ufw
Et rigtigt stærkt værktøj til at tjekke, om en host er beskyttet, er nmap.

Her undersøger vi, om vores RPI er beskyttet af en firewall (bemærk: nmap skal køres fra en pc i netværket. Nmap er et linux/osx tool, men det kan hentes i en windows version her: https://nmap.org/book/inst-windows.html):

sudo nmap -sA 192.168.1.40
... All 1000 scanned ports on 192.168.1.40 are unfiltered ...
Og det er den tydeligvis ikke (unfiltered=ikke blokeret).
Nu enabler vi UFW og indfører reglerne for port 22, 80 og 443.
rpi_admin@skarpline-iot:~ $ sudo ufw enable
rpi_admin@skarpline-iot:~ $ sudo ufw allow 22/tcp
rpi_admin@skarpline-iot:~ $ sudo ufw allow 80/tcp
rpi_admin@skarpline-iot:~ $ sudo ufw allow 443/tcp
Gentager vi portscan af vores RPI.
sudo nmap -sA 192.168.1.40

Not shown: 997 filtered ports
PORT STATE SERVICE
22/tcp unfiltered ssh
80/tcp unfiltered http
443/tcp unfiltered https

Meget bedre! Nu er alle porte lukket på nær de porte, som vi aktivt vælger at åbne for.

Vi skal nu have installeret nogle småting, for eksempel fail2ban som beskytter mod forsøg på uautoriserede logins.

rpi_admin@skarpline-iot:sudo apt-get install fail2ban
Vi skal selvfølgelig have installeret en webserver. Jeg vælger apache2, og vi skal også installere php.
rpi_admin@skarpline-iot:~ $ sudo apt-get install apache2
rpi_admin@skarpline-iot:~ $ sudo apt-get install php5
Lad os se om vi kan få fat i enheden. 

I en browser skriver du http://192.168.1.40, hvor du skifter 192.168.1.40 ud med den IP-adresse, som din RPI har fået.

Smukt!

Lad os se, om php virker. Lav en php-fil i web folderen:

pi_admin@skarpline-iot:~ $ cd /var/www/html/
rpi_admin@skarpline-iot:/var/www/html $ sudo touch test.php
rpi_admin@skarpline-iot:/var/www/html $ sudo nano test.php
Skriv følgende i php-filen (du gemmer med ctrl-x):
< ?php
phpinfo();
?>
Prøv nu i din browser http://192.168.1.40/test.php

Fornemt. Vi er vi ved at være der, men ikke før, vi har slået SSL til.

rpi_admin@skarpline-iot:/var/www/html $ sudo a2enmod ssl
rpi_admin@skarpline-iot:/var/www/html $ sudo service apache2 restart
rpi_admin@skarpline-iot:/var/www/html $ sudo a2ensite default-ssl
Lad os se om det virker. Prøv nu i din browser https://192.168.1.40/test.php

Åhh, jeg må knibe en tåre. Det virker sgu!

Havde det været hardware, var dette tidspunktet, hvor du løfter hænderne og forsigtigt fjerner dig fra opstillingen.

Hvorfor denne advarsel i din browser?

Det er blot din browser, der fortæller dig, at det pågældende SSL-certifikat ikke er et officielt certifikat, og at du dermed ikke kan stole på, at certifikatet tilhører websidens adresse.

Du vil altid få denne fejl, hvis adressen er en IP-adresse, da SSL-certifikatet binder til webserverens FQDN (Fully Qualified Domain Name), men i vores tilfælde vil du også få den, selv hvis RPI'en tilgås fra dit domæne, da vores certifikat er såkaldt "self signed".

Hvis du derimod ser denne advarsel i din netbank, vil jeg kraftigt fraråde, at du fortsætter med dine bankforretninger!

Jeg vælger i vores tilfælde at være ligeglad - krypteringen er lige så god i vores certifikat, og dette er tilstrækkeligt til vores formål.

Hvis det var til et kommercielt produkt, bør man selvfølgelig købe et certifikat. Man kan få gratis certifikater, læs for eksempel her: https://www.sslshopper.com/article-free-ssl-certificates-from-a-free-certificate-authority.html

Vi accepterer risikoen i browseren og kan nu se vores side gennem HTTPS:

Den sidste ting, vi mangler, er at få wifi til at virke.
Først, lad os se om, wifi-donglen virker - den burde automagisk virke, når den er sat i USB-stikket.

rpi_admin@skarpline-iot:~ $ sudo iwlist wlan0 scan
wlan0 Scan completed :
...
Cell 03 - Address: 12:34:56:78:98:76
ESSID:"mit_ssid_rager_ikke_dig"
Protocol:IEEE 802.11bgn
Mode:Master
Frequency:2.472 GHz (Channel 13)
Encryption key:on
Bit Rates:144 Mb/s
Extra:rsn_ie=30140100000fac040100000fac040100000fac020c00
IE: IEEE 802.11i/WPA2 Version 1
Group Cipher : CCMP
Pairwise Ciphers (1) : CCMP
Authentication Suites (1) : PSK
IE: Unknown: DD8C0050F204104A0001101044000102103B0001031047001092C81F59E93B13E0061B4916F8D00DBE102100055A7958454C1023000C564D47383932342D423130411024000C564D47383932342D4231304110420007393633363847571054000800060050F20400011011000C564D47383932342D4231304110080002200C103C0001031049000600372A000120
Quality=48/100 Signal level=100/100

rpi_admin@skarpline-iot:~ $

Fint - jeg kan se mit trådløse netværk. 

Nu skal vi så bare konfigurere indstillingerne i RPI'en. Det gøres i wpa_supplicant.conf-filen:

rpi_admin@skarpline-iot:~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
Og tilføje detaljerne til bunden af filen (hvor du selvfølgelig indsætter dit eget SSID og WPA-key).
network={
ssid=" mit_ssid_rager_ikke_dig "
psk=" min_wpakey_rager_slet_ikke_dig "
}
Genstart din raspberry, og husk at tage LAN-kablet ud. 

Efter boot skulle den gerne forbinde til dit wifi (det kan godt tage et minuts tid.)

Sidste ting, vi lige skal have med, er installationen af et passende library til håndtering af GPIO. Jeg vælger wiringPi, som skal installeres fra Github. Først installerer vi git:

rpi_admin@skarpline-iot: $ sudo apt-get install git-core
Så henter vi wiringPi:
rpi_admin@skarpline-iot:~ $ git clone git://git.drogon.net/wiringPi
Cloning into 'wiringPi'...
remote: Counting objects: 944, done.
remote: Compressing objects: 100% (770/770), done.
remote: Total 944 (delta 671), reused 217 (delta 142)
Receiving objects: 100% (944/944), 290.40 KiB | 306.00 KiB/s, done.
Resolving deltas: 100% (671/671), done.
Checking connectivity... done.
rpi_admin@skarpline-iot:~ $
Så installerer vi wiringPi:
rpi_admin@skarpline-iot:~ $ cd wiringPi/
rpi_admin@skarpline-iot:~/wiringPi $ ./build
Gu've om det virker?
pi_admin@skarpline-iot:~/wiringPi $ gpio -v
gpio version: 2.31
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Lækkerier!

Så skal der strikkes hardware og kodes. Vi ses i næste klumme.

Husk, I kan følge mig på facebook, hvor jeg skriver løst og fast om teknologi, og hvor I kan komme med forslag til emner som jeg kan tage op i klummen: https://www.facebook.com/en.noerds.bekendelser/

Min lille private teknologiske losseplads finder I på http://www.nørdoteket.dk/ hvor jeg dumper de artikler, jeg har skrevet, og diverse andet snask - alt sammen med primær fokus på teknologi.

Læs også:

Gør det selv-IoT, del 1: Sådan bygger du en dims, der kan aktivere andre dimser over internettet.