VIGTIGT: LÆS DETTE, før du beslutter dig for at bygge noget i denne retning. Denne enhed forbindes direkte til 230V, hvilket er livsfarligt at rode med! Jeg joker ikke – Det gør i bedste fald p*sseondt at få stød, og i værste fald DØR du af det. Du kan starte en brand og det kan man også DØ af! Du bør ikke rode med netspænding uden et minimum af viden&erfaring.
Sidste artikel fik vi specificeret dimsen vi skal lave. Før vi begynder på at lave hardware og den egentlige kode, så 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.
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:
https://www.raspberrypi.org/learning/noobs-install/
Det er kommet en ny version af Rasbian, ”Jessie”, og jeg har valgt LITE versionen da vi ikke skal bruge desktoppen til noget.
Vent lige med at tilslutte noget netværk til RPIen 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 osv.
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 som 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 så 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.
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 ligesom 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 og køre, så lukker vi også for 80/http. Jeg anbefaler UFW (uncomplicated firewall) som er en skal ovenpå 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):
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, f.eks. 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 echo 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 (link til hw-artikel).
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 dermed kan du ikke 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 ser denne advarsel i din netbank, så 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, men det er ikke uden problemer. Læs f.eks. 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:
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 et 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.