Gør det selv-IOT: Sådan bygger du en dims der kan tænde/slukke for andre dimser over internettet – Del 2/4: Installation og forberedelse af Raspberry Pi.

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

del3_raspiconfig

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.

del3_apache2loadHttp

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

del3_phpLoadHttp

 

 

 

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

del3_phpLoadHttps

Å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:

del3_phpLoadHttpsWarn

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

This site uses Akismet to reduce spam. Learn how your comment data is processed.