Controllare da remoto Home Assistant su Raspberry Pi in piena sicurezza

SCOPI DELLA GUIDA:
  • Fornire alla propria installazione Raspberry Pi di Home Assistant il più alto grado possibile di sicurezza per la connessione remota via Internet
  • Livello di difficoltà: medio/alto
CONCETTI AFFRONTATI:
  • Installazione e configurazione software
  • Configurazione modem/router
COMPONENTI SOFTWARE UTIlIZZATE:
PREREQUISITI:
  • Home Assistant configurato e funzionante su Raspberry Pi e sistema operativo Raspbian (no HASSIO, no Docker)
  • Raspberry Pi configurato con IP fisso all’interno della propria rete domestica e che raggiunga Internet
DISPOSITIVI FISICI UTILIZZATI:
GUIDA maggiormente indicatA per:

Tutti gli ambienti

Note e disclaimer
  • qualsiasi modifica all'impianto elettrico dev'essere effettuata da personale qualificato
  • qualsiasi modifica attuata in proprio è a propria responsabilità personale nonché a proprio rischio e pericolo (la presente guida ha puro scopo didattico)
  • qualsiasi modifica attuata in proprio a un dispositivo ne fa decadere la garanzia.
Revisione guida: 3.1

Abstract

Come spiegato durante un episodio del nostro podcast, la sicurezza in ambito domotico non è mai troppa. Non la è – troppa – mai in assoluto, ma quando si corre il rischio di esporre a eventuali malintenzionati le nostre componenti domotiche (poco male quando si tratta di illuminazione, va peggio quando si parla di allarmi, di serrature o altro) è necessario dotarsi di un sistema il più possibile sicuro.

Per coloro che abbiano saggiamente deciso di adottare l’HUB personale Home Assistant, uno degli scogli più importanti da affrontare è quello di renderlo raggiungibile dall’esterno del propio ambiente domotico.

Home Assistant offre la possibilità di inibire l’accesso tramite l’uso di una singola password piuttosto che la gestione vera e propria di utenze (a partire dalla versione 0.77 – agosto ’18). Quel che rimane scoperto (di base) è l’uso della crittografia per la trasmissione dei dati, la quale se implementata ci tutela a fronte di eventuali reti non sicure nelle quali qualcuno “in ascolto” potrebbe intercettare i dati in transito, credenziali di accesso incluse.

La crittografia si attiva da tempo tramite la guida offerta da Home Assistant community, la quale però presenta vari problemi:

  • usa il client ufficiale di certbot, il quale è pesantissimo e offre tutta una serie di funzionalità che in definitiva non ci servono in questo ambito;
  • richiede che la porta 80 non sia in uso al momento del refresh dei certificati crittografici;
  • richiede che la porta 80 sia configurata in forwarding verso l’istanza Home Assistant oltre alla canonica 8123.

Andrea Gohn ha assemblato una procedura che utilizza:

  •  uno script leggerissimo per generare i certificati chiamato “dehydrated“;
  • i challenge DNS-01

unitamente ai soliti servizi di DDNS (DuckDNS) e di emissione certificati gratuiti (Let’s Encrypt).

In questa guida quindi riassumiamo i passi operativi per dotare la vostra installazione di Home Assistant su Raspberry Pi (non quella dedicata HASSIO) del supporto SSL crittografico e di un meccanismo automatico di rinnovo certificato senza i problemi di cui sopra.

Nb. IMPORTANTE – L’intera guida si basa sull’assunto che l’installazione di Home Assistant sia stata effettuata su Raspbian in ambito virtuale python come da nostra guida. Si assume quindi che l’utente dedicato al servizio Home Assistant sia “homeassistant” e che l’installazione dell’HUB sia presente presso il path “/home/homeassistant/.homeassistant“.

Nb. Si consiglia, prima di procedere, di leggere con attenzione la pagina dedicata al concetto e al funzionamento del “controllo remoto” in domotica.

Si parte

Configurare DuckDNS

Perché sia raggiungibile dall’esterno, la vostra rete deve possedere un nome univoco (FQDN) il quale veda l’IP corrispondete aggiornarsi automaticamente ad ogni variazione, dato che quello assegnato al vostro modem/router cambia ciclicamente. Per fare questo interviene il servizio Dynamic DNS (o DDNS), ovvero un servizio che tenga traccia dell’ultima variazione e risponda, ai sistemi che chiedano la risoluzione (traduzione) del nome DNS, l’ultimo IP conosciuto, ovvero quello attuale.

DuckDNS è il servizio che abbiamo scelto per questa funzione.

Collegarsi quindi al servizio tramite l’indirizzo https://www.duckdns.org e, una volta registrati creare un proprio dominio che, univocamente, rappresenterà il vostro router collegato ad Internet.

Per questa guida, porremo di aver creato l’FQDN:

casamia.duckdns.org

dove “duckdns.org” è la parte fissa mentre “casamia” è il dominio da noi creato a mo’ di esempio.

All’interno della vostra sezione privata di DuckDNS troverete anche un campo importante chiamato “toker”, il quale appare analogo a questo:

e3ff465f-c6d6-acb1-4416-44b2af152111

Appuntatelo da una parte, tornerà utile a breve.

Configurare il componente “duckdns”

Ora è necessario implementare su Home Assistant un elemento che, a fronte del cambiamento dell’IP Internet del proprio modem/router, comunichi tale variazione a DuckDNS, in modo da aggiornare la risoluzione dell’FQDN.

Per far questo è sufficiente aggiungere al file configuration.yaml di Home Assistant il seguente codice:

duckdns:

  domain: casamia

  access_token: il-tuo-token-duckdns

dove:

domain nome del dominio definito su DuckDNS
access_token toker definito da DuckDNS

Una volta inserita questa configurazione e rilanciato Home Assistant, DuckDNS conoscerà in tempo reale l’IP del vostro modem/router, e con lui, voi e chi interrogherà tale FQDN.

Attivare il port forwarding sul router

Per accedere, dalla rete esterna, al nostro Home Assistant è ora necessario configurare il modem/router in modo che qualsiasi chiamata esterna verso la porta (8123, o altra) venga girata direttamente all’IP statico del Raspberry sulla porta 8123, ovvero quella di Home Assistant.

Per effettuare l’attività di configurazione del port forwarding si consiglia la lettura di questo articolo dell’ottimo Aranzulla; i dati necessari applicando tale guida sono:

  • IP destinazione: IP statico del Raspberry Pi (assegnato in precedenza);
  • Porta esterna: 8123 (a meno che non vogliate usarne un’altra, è lo stesso);
  • Porta interna: 8123

Identificare ora, presso Home Assistant, la preesitente configurazione relativa al blocco “http” del configuration.yaml e configurarla (avendo cura di sostituire “casamia” col proprio dominio) come segue:

http:

  api_password: la-tua-password

  base_url: casamia.duckdns.org:8123

Salvare e riavviare Home Assistant.

A questo punto (effettuata la configurazione) collegandosi dall’esterno della rete Wi-Fi (tramite browser o tramite l’app mobile di Home Assistant per iOS o Android) all’indirizzo:

http://casamia.duckdns.org:8123

(ovviamente sostituendo “casamia” col vostro dominio precedentemente definito) dovrebbe apparire la nostra istanza di Home Assistant.

Nb. Se il campo “Porta esterna” è stato modificato dalla consigliata porta 8123, l’indirizzo deve variare in relazione a tal modifica.

Installare e configurare “dehydrated”

Una volta collegati via SSH al Raspberry Pi, cambiare l’utente in uso in “homeassistant”:

sudo su -s /bin/bash homeassistant

dopodiché accedere al path dedicato a Home Assistant:

cd /home/homeassistant

ed eseguire:

git clone https://github.com/lukas2511/dehydrated.git

al fine di clonare dentro il percorso lo script “dehydrated” da Github.
Entrare ora nel path dello script appena creato e creare un nuovo file, “domains.txt“:

cd dehydrated

sudo nano domains.txt

e copia-incollare il seguente testo:

casamia.duckdns.org

dove “casamia” va sostituito col proprio dominio. Uscire e salvare con CTRL+X / Y / invio.

Ora creare un nuovo file “config“:

sudo nano config

e copia-incollare il seguente testo:

# Which challenge should be used? Currently http-01 and dns-01 are supported
CHALLENGETYPE="dns-01"

# Script to execute the DNS challenge and run after cert generation
HOOK="${BASEDIR}/hook.sh"

ed uscire salvando con CTRL+X / Y / invio.

Ora creare il file hook.sh:

sudo nano hook.sh

e copia-incollare il seguente testo:

#!/usr/bin/env bash
set -e
set -u
set -o pipefail
 
domain="myhome"
token="your-duckdns-token"
 
case "$1" in
    "deploy_challenge")
        curl "https://www.duckdns.org/update?domains=$domain&token=$token&txt=$4"
        echo
        ;;
    "clean_challenge")
        curl "https://www.duckdns.org/update?domains=$domain&token=$token&txt=removed&clear=true"
        echo
        ;;
    "deploy_cert")
        sudo systemctl restart home-assistant@homeassistant.service
        ;;
    "unchanged_cert")
        ;;
    "startup_hook")
        ;;
    "exit_hook")
        ;;
    *)
        echo Unknown hook "${1}"
        exit 0
        ;;
esac

avendo cura di sostituire le valorizzazioni dei campi “domain” e “token” con i dati già visti durante la configurazione di DuckDNS su Home Assistant (dominio personale e token).

Infine uscire salvando con CTRL+X / Y / invio.

Rendiamo ora lo script “hook.sh” appena creato eseguibile:

chmod 0777 hook.sh

Generare il certificato con il comando:

./dehydrated --register  --accept-terms

il quale riporterà un output simile a questo:

# INFO: Using main config file /home/homeassistant/dehydrated/config

+ Generating account key...

+ Registering account key with ACME server...
 + Done!

Eseguire poi il seguente comando:

./dehydrated -c

il quale riporterà un output simile a questo:

# INFO: Using main config file /home/homeassistant/dehydrated/config
Processing myhome.duckdns.org+ Signing domains...+ Generating private key...+ Generating signing request...+ Requesting challenge for myhome.duckdns.org...OK+ Responding to challenge for myhome.duckdns.org...OK+ Challenge is valid! + Requesting certificate...+ Checking certificate...+ Done!+ Creating fullchain.pem...+ Walking chain...+ Done!

Nb. In caso al termine di questa esecuzione venga richiesta la password dell’utente in uso, interrompere con CTRL+X. L’esecuzione è comunque corretta.

Automatizzare il rinnovo del certificato

Dato che il certificato crittografico ha una durata limitata, configureremo ora un processo che ne richieda l’aggiornamento automatico ogni primo del mese.

Eseguire:

export VISUAL=nano; crontab -e

se viene richiesto quale editor utilizzare, si consiglia di utilizzare “nano”.

Aggiungere dunque alla configurazione crontab la seguente voce:

0 1 1 * * /home/homeassistant/dehydrated/dehydrated -c

salvare e uscire.
Questa configurazione farà sì che ogni primo del mese il certificato si rinnovi automaticamente.

Riconfigurare Home Assistant

A questo punto va aggiunta la voce relativa alla crittografia nel file configuration.yaml.

Identificare la preesitente configurazione relativa al blocco “http” e configurarla (avendo cura di sostituire “casamia” col proprio dominio) come segue:

http:

  api_password: la-tua-password

  ssl_certificate: /home/homeassistant/dehydrated/certs/casamia.duckdns.org/fullchain.pem

  ssl_key: /home/homeassistant/dehydrated/certs/casamia.duckdns.org/privkey.pem

  base_url: casamia.duckdns.org:8123

dove

api_password è la password d’accesso a Home Assistant
ssl_certificate è il certificato appena creato
ssl_key sono le chiavi appena create
base_url  è l’indirizzo al quale puntare per accedere alla vostra istanza di Home Assistant (attenzione ad adeguare in modo corretto l’FQDN)

Una volta riavviato Home Assistant, sia dall’esterno che dall’interno, tramite l’indirizzo

https://casamia.duckdns.org:8123

(ovviamente sostituendo “casamia” col vostro dominio precedentemente definito) dovrebbe apparire la nostra istanza di Home Assistant.

Nb. Se il campo “Porta esterna” è stato modificato dalla consigliata porta 8123, l’indirizzo deve variare in relazione a tal modifica.

Ora il vostro Home Assistant è controllabile da remoto in modo sicuro.

Verificare la scadenza del certificato

È inoltre possibile verificare presso il frontend la durata del certificato in uso tramite uno specifico sensore, come segue:

sensor:
  - platform: command_line
    name: Scadenza certificato SSL
    unit_Of_measurement: Giorni
    #12 ore indicato in secondi
    scan_interval: 43200
    command: "/usr/bin/sudo ssl-cert-check -b -c /home/homeassistant/dehydrated/certs/my_domain.duckdns.org/cert.pem | awk '{ print $NF }'"

Ovviamente sarà necessario personalizzare la stringa “my_domain” col proprio nome dominio.

Affinché questo sensore funzioni è necessario che ssh-cert-check sia installato.
In caso sia assente, installarlo tramite il comando:

sudo apt-get install ssl-cert-check

Inoltre è necessario eseguire il seguente comando:

sudo visudo

e appurare che esista la seguente riga (altrimenti, aggiungerla) nel file che apparirà:

homeassistant ALL=(ALL) NOPASSWD:ALL

Dopodiché salvare, uscire e riavviare.

Aggiornamento automatico

Può capitare che l’IP della WAN assegnato al router cambi e che l’aggiornamento non venga recepito da DuckDNS, in quanto tale tale aggiornamento viene effettuato solo all’avvio di Home Assistant, in base a quanto realizzato tramite questa guida fin qui.

Si consiglia pertanto di seguire la seguente guida per configurare il sistema operativo Raspbian affinchè, ciclicamente, invii un aggiornamento dell’IP a DuckDNS:

Aggiornare automaticamente DuckDNS dal proprio Raspberry


Home Assistant iconATTENZIONE: ricorda che sul nostro community FORUM c'è una sezione ad hoc dedica a Home Assistant, per qualsiasi dubbio, domanda, informazione nel merito specifico di queste componenti.