Collegarsi da remoto a Home Assistant installato su Raspberry (Raspbian)

9 minuti di lettura
SCOPI DELLA GUIDA:
  • Fornire al proprio Home Assistant (installato su Raspberry Pi) il più alto grado possibile di sicurezza per la connessione remota via Internet (la guida per HASSIO è invece qui)
  • Livello di difficoltà: medio
CONCETTI AFFRONTATI:
  • Installazione e configurazione software
  • Configurazione modem/router
COMPONENTI SOFTWARE UTIlIZZATE:
PREREQUISITI:
  • Home Assistant configurato e funzionante
  • Raspberry Pi con sistema operativo Raspbian
DISPOSITIVI FISICI UTILIZZATI:
GUIDA maggiormente indicatA per:

Tutti gli ambienti

Note e disclaimer
  • qualsiasi eventuale modifica agli impianti domestici dev'essere progettata ed realizzata SOLO da personale qualificato;
  • qualsiasi modifica attuata in proprio è a propria responsabilità personale nonché a proprio rischio e pericolo (i contenuti della presenta pagina hanno puro scopo didattico);
  • qualsiasi modifica attuata in proprio a un dispositivo ne fa decadere garanzia, omologazioni e certificazioni di qualità.
Revisione guida: 4.6
ATTENZIONE: questa guida è dedicata agli utenti che abbiano installato Home Assistant Core su Raspberry Pi (con sistema operativo Raspbian). Gli utenti HASSIO devono invece far riferimento all’add-on “DuckDNS” illustrato presso quest’altra guida.

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).

N.b. Utenti HASSIO: per collegarsi in sicurezza ad Home Assistant in distribuzione HASSIO la procedura è estremamente più semplice: è infatti sufficiente installare e configurare l’add-on Duck DNS. La presente guida non si applica al vostro tipo di installazione.

In questa guida 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 che non presenti i problemi di cui sopra. Si consiglia, prima di procedere, di leggere con attenzione la pagina dedicata al concetto e al funzionamento del “controllo remoto” in domotica.

Si parte

Assunti

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 (o similari). Per gli utenti HASSIO, invece, la guida corretta è questa.

Si assume pertanto che l’utente dedicato al servizio Home Assistant sia “homeassistant” e che l’installazione dell’HUB sia presente presso il path /home/homeassistant/.homeassistant“.

Configurare DuckDNS

Perché sia raggiungibile dall’esterno, la vostra rete deve possedere un nome univoco (chiamato 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, daremo per assunto di aver creato il seguente FQDN:

casamia.duckdns.org

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

All’interno della vostra sezione privata di DuckDNS troverete anche un campo importante chiamato “token“, 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 di dominio definito sul servizio DuckDNS (inteso come terzo livello, quindi nel caso sopra solo “casamia“)
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.

Questo però è valido una tantum, ovvero quando Home Assistant si avvia. Per far sì che l’IP sia sempre aggiornato – in caso di variazioni nel tempo – è necessario implementare un piccolo processo spiegato nel dettaglio in questa guida.

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

  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

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

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:

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 (nome di 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...
+ Fetching account ID...
+ 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+C. L’esecuzione è comunque corretta.

Automatizzare il rinnovo del certificato

Dato che il certificato crittografico ha una durata limitata,(90 giorni) configureremo ora un processo che ne richieda quotidianamente l’aggiornamento automatico, cosa che andrà a buon fine quando la durata rimanente del certificato in uso sarà inferiore ai 30 giorni.

Entrare in editing delle pianificazioni automatiche del sistema operativo Raspbian tramite il comando:

export VISUAL=nano; crontab -e

se viene richiesto quale editor utilizzare, si consiglia di utilizzare “nano“.
Aggiungere dunque alla configurazione crontab (in fondo) la seguente voce:

0 1 * * * /home/homeassistant/dehydrated/dehydrated -c | tee /home/homeassistant/dehydrated/update.log

salvare e uscire.
Questa configurazione farà sì che ogni giorno all’una di notte venga effettuata una verifica sulla scadenza del certificato e, laddove manchino meno di 30 giorni, provveda a richiederne l’aggiornamento.

N.b. Per personalizzare il lasso di tempo di verifica, si consiglia di utilizzare questo tool online.

Infine, uscire dall’impersonificazione dell’utente homeassistant con:

exit

Riconfigurare Home Assistant

A questo punto va aggiunta la voce relativa alla crittografia nel file di configurazione configuration.yaml presente, come sempre, nel percorso “/home/homeassistant/.homeassistant“.

Per farlo è necessario identificare la pre-esitente configurazione relativa al blocco “http all’interno del file e variarla come segue (attenzione: ovviamente “casamia” va corretto col proprio nome dominio):

http:

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

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


dove “ssl_certificate” rappresenterà il percorso del certificato appena creato e “ssl_key” il percorso delle chiavi.

Completata la modifica, salvare, non riavviare ancora Home Assistant ma recarsi presso la sezione “Impostazioni” > “Generale“: in basso, alla voce “External URL“, esplicitare il proprio URL:

https://casamia.duckdns.org:8123

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

NOTA BENE: L’indirizzo è cambiato anche nel prefisso, da http:// a https:// !!
Inoltre: se il campo “Porta esterna” è stato modificato dalla consigliata porta 8123, l’indirizzo dovrà variare di conseguenza.

Salvare e riavviare. Ora il vostro Home Assistant sarà controllabile da remoto in modo sicuro tramite l’indirizzo appena configurato (quello in verde qui sopra).

Verificare la scadenza del certificato

È inoltre possibile verificare la durata del certificato in uso tramite uno specifico sensore, aggiungendo al file di configurazione di Home Assistant una configurazione come segue:

sensor:
 - platform: cert_expiry
   host: casamia.duckdns.org
   port: 8123

Ovviamente sarà necessario personalizzare la stringa “host” col proprio nome dominio e “port” con la propria porta.

Affinché questo sensore funzioni può essere necessario che ssh-cert-check sia installato.
In caso sia assente, installarlo tramite i comandi:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install ssl-cert-check

Inoltre è necessario eseguire il seguente comando:

sudo nano /etc/sudoers 

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

homeassistant ALL=(ALL) NOPASSWD:ALL

Dopodiché salvare, uscire e riavviare.

Questa configurazione genererà un’entità chiamata sensor.cert_expiry_casamia_duckdns_org_8123 (il nome varierà in base alle proprie impostazioni) che riporterà, espressa in giorni mancanti, la scadenza del certificato. Ovviamente, lo stato di tale sensore sarà, volendo, visualizzabile presso il frontend web Lovelace UI.

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

Connessione locale

Quando ci si trova in casa – quindi collegati alla Wi-Fi/LAN domestica – è possibile collegarsi a Home Assistant senza dover necessariamente utilizzare l’indirizzo FQDN esterno, ma direttamente il puntamento all’indirizzo mDNS “raspberry.local” oppure all’indirizzo IP del Raspberry. L’unica accortezza necessaria sarà quella di utilizzare comunque il protocollo SSL.

N.b. Tra l’altro la cosa risulta particolarmente utile in caso di problemi col servizio DuckDNS e/o con l’aggiornamento del proprio FQDN.

In sostanza, anziché utilizzare:

https://casamia.duckdns.org:8123

sarà possibile utilizzare l’indirizzo (se attivo l’mDNS):

https://raspberry.local:8123

oppure, più semplicemente, tramite l’indirizzo IP del Raspberry Pi:

https://IP_DEL_RASPBERRY:8123

dove ovviamente “IP_DEL_RASPBERRY” sarà l’indirizzo IP assegnato al proprio Raspberry IP e già utilizzato per il portforwarding presso il router.

Due precisazioni importanti. La prima: collegandosi localmente utilizzando l’indirizzo mDNS o tramite l’IP causa un errore sui log: è più che normale, dato che ci si sta collegando utilizzando dei certificati crittografici erogati in realtà per l’FQDN; la seconda: per collegarsi in queste modalità (mDNS o IP) è possibile utilizzare solo il browser.


Home Assistant Official Logo ATTENZIONE: 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.