Threatmodel
De Raspberry Pi is een populair hardwareplatform om zelf een domoticacontroller te bouwen. Of je dat nu met een geïntegreerd domoticaplatform doet of door zelf domoticasoftware aan elkaar te koppelen, beveiliging is altijd belangrijk. Daarover gaat het in deze laatste aflevering van de reeks over de Raspberry Pi als brein van je smarthome.
Wat is je threatmodel?
Als je wil beginnen met het beveiligen van je smarthome moet je eerst bedenken wát je precies wil beveiligen. Daarom is het belangrijk te bedenken wat je threatmodel is. Die term uit de cybersecurity wordt gebruikt om te bepalen voor wie je iets veilig houdt en waarom. Iedereen heeft een ander threatmodel. Welke bedreigingen vind jij relevant in jouw situatie en wat mag zeker niet gebeuren? De ene persoon wil zich misschien alleen beschermen tegen automatische botnets, maar een ander zou ook graag de AIVD buiten de deur willen houden als puntje bij paaltje komt. Beide threatmodels hebben een andere aanpak nodig.
Om te bepalen wat je eigen threatmodel is, kun je beginnen door jezelf een vraag te stellen: “Wat kan er mislopen in mijn smarthome?” Een in de branche veelgebruikt model om bedreigingen te identificeren, is het door Microsoft ontwikkelde Stride. Dit acroniem staat voor zes categorieën van bedreigingen: spoofing, tampering, repudiation, information disclosure, denial of service en elevation of privilege. Deze bedreigingen zijn een voor een schendingen van gewenste eigenschappen van een systeem, respectievelijk authenticiteit, integriteit, onbetwistbaarheid, vertrouwelijkheid, beschikbaarheid en autorisatie.
Bekijk eens enkele voorbeelden van oefeningen om een threatmodel voor een smarthome te ontwikkelen. Ontwikkelaar Kevin Kredit heeft bijvoorbeeld een uitgebreid threatmodel uitgewerkt dat als inspiratie kan dienen.
Isoleer je domoticanetwerk
De belangrijkste maatregel die je kunt nemen om je smarthome te beveiligen, is al je domoticatoestellen isoleren van de rest van je thuisnetwerk. Als er dan iemand door een kwetsbaarheid in slaagt om in een van je domoticatoestellen in te breken, kan hij dat niet als opstapje gebruiken om bijvoorbeeld toegang tot je nas of pc te krijgen.
De belangrijkste maatregel die je kunt nemen, is al je domoticatoestellen isoleren van de rest van je thuisnetwerk
De professionele aanpak van dit scenario is met een virtual local area network, of vlan. Je partitioneert apparaten die met hetzelfde netwerk verbonden zijn in verschillende ‘virtuele netwerken’ die van elkaar geïsoleerd zijn. Je maakt dan een afzonderlijk vlan voor je smarthome aan. Daarvoor heb je een switch nodig die met vlans overweg kan. Je maakt dan bijvoorbeeld op je accesspoint twee ssid’s aan en elk ken je aan een ander vlan toe.
Niet iedereen heeft netwerkapparatuur in huis die vlans ondersteunt. Een toegankelijkere manier om een geïsoleerd smarthomenetwerk te creëren, is dat je een afzonderlijk accesspoint voor dit netwerk instelt. Gebruik er een met minstens één lanpoort, zodat je zowel je Raspberry Pi als de wifiapparaten in je smarthome hierop kunt aansluiten. De wanpoort van het accesspoint gaat naar een van de lanpoorten van je hoofdrouter/switch. In de firewallinstellingen van het accesspoint stel je in wat de verbonden apparaten kunnen doen, bijvoorbeeld geen communicatie buiten het smarthomenetwerk.
Sommige apparaten, zoals de Raspberry Pi die als domoticacontroller werkt, hebben wel internettoegang nodig, bijvoorbeeld om updates te downloaden of om informatie uit onlinebronnen in een dashboard te tonen. Geef in de firewall alleen die apparaten internettoegang die het nodig hebben.
OpenWrt en SPIN
In principe kun je elk accesspoint gebruiken voor je smarthomenetwerk, maar uiteraard moet je dit ook veilig houden. Een goede keuze is OpenWrt, dat talloze accesspoints ondersteunt. En als je een ouder accesspoint hebt dat geen updates meer krijgt van de fabrikant, kan OpenWrt het een nieuw leven geven.
Als je wat meer zichtbaarheid in het verkeer van je smarthometoestellen wilt, kun je op een OpenWrt-accesspoint SPIN installeren, waarvan onlangs versie 1.0 is uitgekomen. SPIN staat voor Security and Privacy for In-home Networks en is een project van SIDN Labs om het netwerkverkeer van apparaten op je lokale netwerk te inspecteren. Zie je verdacht of ongewenst verkeer, dan kun je dit ook in enkele clicks blokkeren.
Welke manier je ook gebruikt om je smarthomenetwerk te isoleren, het is belangrijk dat je die isolatie zo goed mogelijk doorvoert. Zodra je het mogelijk maakt om vanaf je smartphone met een app je domoticacontroller aan te sturen, introduceer je weer risico’s. Een veiligere manier is om een tablet die je alleen als dashboard voor je domoticacontroller gebruikt, met je smarthomenetwerk te verbinden. Zodra je het mogelijk maakt om vanaf je smartphone met een app je domoticacontroller aan te sturen, introduceer je risico’s
Authenticatie
Om te voorkomen dat onbevoegden toegang tot je smarthometoepassingen krijgen, moet je zoveel mogelijk gebruikmaken van authenticatie. Zo vraagt Home Assistant je de eerste keer om een account aan te maken en een wachtwoord in te stellen. Node-RED daarentegen schakelt standaard geen authenticatie in. Daarvoor moet je in het bestand settings.js gebruikers en een bijbehorende wachtwoordhash toevoegen. Het bestand bevat al voorbeeldcode daarvoor, maar die is 'uitgecommentarieerd'. Verwijder de // ervoor en pas de waarden aan. Doe dit voor adminAuth (de editor), nodeAuth (het dashboard) en staticAuth (statische pagina’s).
De wachtwoordhash genereer je met de opdracht node-red admin hash-pw of, als je Node-RED in een Docker-container draait, docker exec -ti node-red node-red admin hash-pw, waarbij de eerste Node-RED de naam van de container is en de tweede de naam van de binary. Vul dan je wachtwoord in en plaats de uitvoer van de opdracht in de string bij 'password' in het configuratiebestand.
In de MQTT-broker Mosquitto voeg je authenticatie toe door in het configuratiebestand mosquitto.conf naar een wachtwoordbestand te verwijzen:
password_file /mosquitto/config/passwords
Dit wachtwoordbestand creëer je dan met:
docker exec -ti mosquitto /usr/bin/mosquitto_passwd -c /mosquitto/config/passwords GEBRUIKERSNAAM
Vul dan het wachtwoord voor de gebruiker in. Andere gebruikers voeg je eenvoudig toe met dezelfde opdracht, maar dan zonder de optie -c, die een nieuw wachtwoordbestand aanmaakt. Zolang de optie allow_anonymous true niet aanstaat in het configuratiebestand, moeten alle MQTT-clients zich nu met een geldige gebruikersnaam en een geldig wachtwoord aanmelden.
Sterke wachtwoorden
Kies altijd een sterk wachtwoord en gebruik waar mogelijk tweefactorauthenticatie. Zo kun je in je gebruikersprofiel van Home Assistant 2fa inschakelen. Dat kan met time-based one-time password, of totp, in combinatie met een app zoals Authy of Google Authenticator, of met hotp in combinatie met de notify-component van Home Assistant. Hiermee kun je aanmeldcodes sturen via tientallen notificatiediensten.

In je profiel van Home Assistant voeg je het best 2fa toe met een totp-app.
Autorisatie en je eigen certificaatautoriteit
Naast authenticatie, dus alleen gewenste gebruikers toelaten, heb je autorisatie nodig voor een goede beveiliging van je smarthome: bepalen welke gebruikers wat mogen doen. Je wilt niet dat elke gebruiker alles met alle apparaten of software in je smarthome kan aanvangen.
In het configuratiebestand settings.js van Node-RED stel je bij individuele gebruikers hun permissies in bij de string permissions. * betekent dat de gebruiker, bijvoorbeeld de beheerder, alles mag, read dat de gebruiker alleen leesrechten heeft. Je kunt ook specifiekere rechten geven voor elk van de api-endpoints. De api-documentatie van elk endpoint legt uit welke permissies nodig zijn. Zo kun je met flows.read de configuratie van de huidige flow bekijken en met flows.write diezelfde configuratie wijzigen.
In Mosquitto gebeurt autorisatie met een access-control list-, of acl-bestand. Daarnaar verwijs je in mosquitto.conf:
acl_file /mosquitto/config/acl
In dit bestand bepaal je voor elke gebruiker op welke topics hij kan inschrijven en op welke topics hij kan publiceren. Wil je bijvoorbeeld de gebruiker admin lees- en schrijftoegang tot alle topics geven, dan is de acl:
user admin
topic #
Het is een goed idee om voor elk domoticaprogramma dat van je MQTT-broker gebruikmaakt, een gebruiker aan te maken in Mosquitto en een bijbehorende acl met permissies aan te maken. Als je bijvoorbeeld 'bt-mqtt-gateway' alleen gebruikt om data van Bluetooth LE-sensoren naar je MQTT-broker te sturen, geeft de volgende acl die permissies en niet meer:
user bt-mqtt-gateway
topic write bt-mqtt-gateway/#
Voor een programma als rtl_433, dat draadloze sensors uitleest, doe je dan hetzelfde. Als je dan in Node-RED een dashboard hebt gemaakt dat de temperatuurgegevens van al deze sensors toont, laat dit dan verbinding maken met de MQTT-broker door middel van gebruikersnaam 'dashboard' en geef het deze acl:
user dashboard
topic read bt-mqtt-gateway/+/+/temperature
topic read rtl433/+/+/+/temperature_C
Overigens kunnen deze acl’s in Mosquitto ook dynamisch aangepast worden met een beveiligingsplug-in. Een ander belangrijk punt is dat je het best zoveel mogelijk netwerkcommunicatie versleutelt
Versleutelde verbindingen
Een ander belangrijk punt in de beveiliging van je smarthome is dat je het best zoveel mogelijk netwerkcommunicatie versleutelt, doorgaans via TLS. Hiermee voeg je niet alleen encryptie toe, maar ook authenticatie van de server: het TLS-certificaat dat de server je toont, geeft je garanties dat je verbinding maakt met de juiste server.
In het eenvoudigste geval maak je gewoon een self-signed certificate aan, maar het is netter om je eigen certificaatautoriteit, of CA, aan te maken en daarmee het certificaat van je server te ondertekenen. Als je dan het CA-certificaat toevoegt aan de lijst met vertrouwde CA’s van je webbrowser en/of besturingssysteem, krijg je geen waarschuwing.
Vooral als je meer dan één server in je smarthome gebruikt, is het handiger om met een CA te werken; anders moet je elk van die certificaten toevoegen aan de lijst met vertrouwde certificaten en dat op al je apparaten die toegang tot die servers nodig hebben.
Er zijn diverse manieren om een certificaatautoriteit aan te maken en er servercertificaten mee te ondertekenen. Het kan rechtstreeks met OpenSSL-opdrachten, of met een tool als mkcert of step-ca. Die laatste is een heuse ACME-compatibele certificaatautoriteit. Smallstep, de ontwikkelaar van step-ca, heeft instructies gepubliceerd om automatisch certificaten aan te vragen en te vernieuwen in Caddy, Nginx, Apache en Traefik.
/i/2004847562.png?f=imagenormal)
Met mkcert maak je eenvoudig een CA en TLS-certificaten aan voor je interne netwerk.
Certificaten gebruiken
Heb je eenmaal een CA en certificaat voor je server, dan is het een kwestie van dit certificaat gebruiken in de gewenste software. Sla de root-CA, de sleutel en het certificaat bijvoorbeeld op in een directory 'containers/certificates' en koppel deze in je Docker-containers als read-only volume.
Voor Node-RED doe je dat bijvoorbeeld door - ./containers/certificates:/etc/ssl/private:ro aan de volumes in je Docker Compose-bestand toe te voegen. Dan commentarieer je in het begin van het configuratiebestand settings.js var fs = require("fs"); uit en zoek je daarna naar Https. Daar voer je dan het volgende in om naar de sleutel en het certificaat te verwijzen en HTTP-verkeer automatisch naar Https door te verwijzen:
https: {
key: fs.readFileSync('/etc/ssl/private/key.pem'),
cert: fs.readFileSync('/etc/ssl/private/cert.pem')
},
requireHttps: true,
Voor Mosquitto werkt dit net zo. Koppel de certificaten in een volume met - ./containers/certificates:/mosquitto/config/certs:ro in het Docker Compose-bestand. Verander bij de poorten ook - "1883:1883" in - "8883:8883", de standaardpoort voor Mqtts (MQTT over TLS). In je mosquitto.conf verwijs je dan naar de root-CA, de sleutel en het certificaat met:
listener 8883
cafile /mosquitto/config/certs/rootCA.pem
keyfile /mosquitto/config/certs/key.pem
certfile /mosquitto/config/certs/cert.pem
Als je nu bijvoorbeeld in Node-RED een ‘mqtt in’-node aanmaakt en dan een MQTT-broker toevoegt, kies je bij de verbindingseigenschappen poort 8883. Verzeker je ervan dat je dezelfde hostname invult als de hostname waarvoor je het TLS-certificaat hebt aangemaakt. Schakel dan ook TLS in en voeg een nieuwe TLS-configuratie toe. Upload daar je CA-certificaat. In het tabblad Security vul je de vereiste combinatie van gebruikersnaam en wachtwoord in.

Stel in Node-RED de TLS-configuratie voor je MQTT-broker in.
Proxy's en tunnels
Reverse proxy
Als je heel wat software van een TLS-configuratie moet voorzien, is het waarschijnlijk handiger om met een reverse proxy te werken, zoals Traefik, Nginx of Nginx Proxy Manager. Je draait de software in je Docker-containers dan op een onversleutelde HTTP-verbinding die alleen vanaf een intern Docker-netwerk bereikbaar is. Je maakt dan verbinding over Https met de reverse proxy, die afhankelijk van de bezochte hostname of poort automatisch met de juiste container verbinding maakt. Je kunt op deze manier ook authenticatie toevoegen.
Het is handig als je een lokale dns-server draait die je toelaat om wildcard-subdomeinen aan het IP-adres van je Raspberry Pi toe te kennen. Je geeft je Raspberry Pi bijvoorbeeld de hostname smart.home, en alle subdomeinen eronder verwijzen naar hetzelfde IP-adres. In combinatie met een reverse proxy kun je dan bijvoorbeeld Zigbee2MQTT bezoeken op https://zigbee.smart.home, Node-RED op https://node-red.smart.home, Home Assistant op https://home-assistant.smart.home enzovoort.
/i/2004847566.png?f=imagenormal)
Met een reverse proxy zoals nginx verzorg je een TLS-verbinding voor al je Docker-containers.
Veilige toegang op afstand
Tot nu toe gingen we ervan uit dat je alleen toegang tot je smarthomesoftware krijgt van in je huis zelf, het liefst zelfs alleen van in een geïsoleerd smarthomenetwerk. Maar wat als je van buitenaf toegang wilt? Misschien ben je wel het huis uit en wil je een camerabeeld bekijken of je rolluiken omlaagdoen. Uiteraard wil je niet dat anderen dat ook kunnen.
De klassieke manier is met portforwarding. Je laat bijvoorbeeld poort 8443 in je modem/router doorsturen naar poort 8123 van Home Assistant op je Raspberry Pi, die daarvoor een statisch IP-adres nodig heeft of een statische mapping in je DHCP-server. Daarnaast heb je dynamische DNS nodig, zodat je met een domein naar het mogelijk veranderlijke publieke IP-adres van je modem kunt verwijzen. Een van die diensten is Duck DNS en die heeft ook een add-on in Home Assistant. Daarnaast heb je een TLS-certificaat voor het dynamische domein nodig, bijvoorbeeld van Let’s Encrypt. De add-on van Duck DNS in Home Assistant neemt dat ook op zich.
De dynamische DNS kun je ook zelf regelen met een Docker-container van DDclient, zoals die van linuxserver. Het programma ondersteunt diverse dyndns-providers. Een Let’s Encrypt-certificaat regel je eenvoudig met Certbot of een andere ACME-client. Een populaire Docker-container daarvoor is SWAG van linuxserver.
Tunnel naar een relayserver
Een andere manier voor toegang op afstand zijn zogenoemde localhost tunneling-oplossingen, zoals ngrok, PageKite en Cloudflare Argo Tunnel. Op je Raspberry Pi creëer je dan een netwerktunnel naar een relayserver op internet. Doorgaans kent die je een subdomein toe van het domein van de dienst. Als je in een webbrowser dat subdomein bezoekt, wordt al het netwerkverkeer via de (versleutelde) tunnel naar je Raspberry Pi gestuurd. Overigens kun je bij PageKite de relayserver ook op een eigen VPS draaien. De software is open source.
Voor de hoogste beveiliging genereer je het best je eigen TLS-certificaat
Het grote voordeel van deze aanpak met een tunnel is dat je geen dynamische DNS of portforwarding hoeft in te stellen op je router/modem, omdat de verbinding wordt geïnitieerd vanaf je Raspberry Pi. Een ander voordeel is dat het subdomein dat je wordt toegekend, niet naar je IP-adres thuis verwijst, maar naar de relayserver. Je houdt je IP-adres dus verborgen.
Voor de hoogste beveiliging genereer je overigens het best je eigen TLS-certificaat, zodat de dienst die de relayserver draait, je onversleutelde netwerkverkeer niet kan inzien. Zo maakt PageKite standaard gebruik van een wildcardcertificaat voor *.pagekite.me. De verbinding tussen je webbrowser en de relayserver van PageKite, en ook die tussen de relayserver en je Raspberry Pi zijn wel versleuteld, maar toch kunnen medewerkers van PageKite je netwerkverkeer onderscheppen. In de documentatie van PageKite vind je hoe je met een eigen TLS-certificaat werkt.
Gebruik je Home Assistant, dan is de eenvoudigste manier wellicht de functie Remote UI van de dienst Home Assistant Cloud van Nabu Casa, het bedrijf dat Home Assistant ontwikkelt. De dienst kost vijf dollar per maand en zet een veilige verbinding van je Home Assistant-installatie naar de cloud op, vergelijkbaar met wat ngrok en PageKite doen. In end-to-endencryptie wordt voorzien met een Let’s Encrypt-certificaat. Je schakelt dit eenvoudig in bij Instellingen / Home Assistant Cloud. Daarna is je Home Assistant-installatie van overal te bereiken via een URL met de vorm https://abcdefghijklmnopqrstuvwxyz.ui.nabu.casa.
VPN-server
De derde manier om op afstand toegang tot je smarthome te krijgen, is een VPN-server bij je thuis draaien, in combinatie met een dynamisch domein. Dat kun je op je modem/router doen of op je Raspberry Pi. In het laatste geval moet je de poort van je VPN-server naar je Raspberry Pi forwarden. PiVPN is een handig project voor de installatie en het beheer van een VPN-server op je Raspberry Pi.
De populaire keuzes voor een VPN-server zijn OpenVPN en WireGuard. Beide hebben hun voorstanders. OpenVPN is een volwassen project, flexibel en uitbreidbaar, maar ook complex. WireGuard is van nul af opgebouwd en heeft daardoor een kleine codebase, maar is niet zo volledig en flexibel als OpenVPN. Beide projecten kun je met behulp van PiVPN installeren en beheren. Voor beide projecten bestaan ook mobiele apps voor Android en iOS. Zodra je verbonden bent met de VPN-server, heb je toegang tot je lokale netwerk, waaronder je domoticadiensten.
/i/2004847568.png?f=imagenormal)
Met PiVPN installeer en beheer je eenvoudig een VPN-server op je Raspberry Pi.
Conclusie
Als je zelf je smarthome bouwt met behulp van een Raspberry Pi, is ook beveiliging je eigen verantwoordelijkheid. Je smarthomenetwerk isoleren, authenticatie en autorisatie zijn daarbij de belangrijkste maatregelen. Daarnaast zijn versleutelde verbindingen en een veilige manier om op afstand toegang te krijgen, aandachtspunten. Verder moet je natuurlijk rekening houden met de algemeen geldende veiligheidsmaatregelen. Hou al je software up-to-date, maak het niet te ingewikkeld en zorg voor een gelaagde beveiliging (defense in depth). Op deze manier kun je zorgeloos genieten van je smarthome.