Collegarsi da remoto a Home Assistant Core installato su Raspbian di Raspberry Pi

10 minuti di lettura
SCOPI DELLA GUIDA:
  • Fornire al proprio Home Assistant (installato Core su sistema operativo Raspbian di Raspberry Pi) il più alto grado possibile di sicurezza per la connessione remota via Internet
  • Livello di difficoltà: medio
CONCETTI AFFRONTATI:
  • Installazione e configurazione software
  • Configurazione modem/router
COMPONENTI SOFTWARE UTIlIZZATE:
PREREQUISITI:
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: 5.5
GUIDE Alternative:

Abstract

Come spiegato anche durante un episodio del nostro podcast, la sicurezza in ambito domotico non è mai troppa. Non la è 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 di suo la possibilità di inibire l’accesso tramite una gestione vera e propria di utenze che abbiano diritto all’accesso. 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, componente piuttosto pesante che 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.

Lo sviluppatore 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 (Duck DNS) 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 Home Assistant Core installato come applicativo Python su venv su Raspberry Pi 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 Core sia stata effettuata su Raspbian in ambito virtuale venv come da nostra guida (o similari).

Si assume pertanto che il percorso contenente la configurazione (e altro) relativa all’HUB sia “/home/homeassistant/.homeassistant“.

Servizio Duck DNS

Affinché sia raggiungibile dall’esterno, il punto di accesso esterno alla rete domestica (interfaccia WAN del modem) deve possedere un nome univoco (chiamato FQDN) il quale veda l’IP ad esso associato 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.

Duck DNS è 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 nome dominio che, univocamente, rappresenterà il vostro router collegato ad Internet. Il suffisso è sempre lo stesso (“.duckdns.org“) mentre ciò che cambia e va scelto è il suffisso (per esempio “casamia“).

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 dominio da noi creato a mo’ di esempio.

All’interno della vostra sezione privata di Duck DNS troverete anche un campo importante chiamato “token“, il quale appare analogo a questo:

e3ff465f-c6d6-acb1-4416-44b2af152111

Appuntarselo da una parte, tornerà utile a breve.

Componente “Duck DNS”

Ora è necessario implementare su Home Assistant un elemento che, a fronte dell’eventuale cambiamento dell’IP Internet sull’interfaccia WAN del proprio modem/router, comunichi tale variazione a Duck DNS, in modo da aggiornare la conseguente 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 dominio definito sul servizio Duck DNS (inteso come terzo livello, quindi nel caso sopra solo “casamia“)
access_token toker fornito da Duck DNS

Una volta inserita questa configurazione e rilanciato Home Assistant, Duck DNS 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.

N.b. Questo paragrafo non va attuato se sulla propria rete c’è già qualche dispositivo che provveda a tale funzione di associazione dell’IP con il proprio FQDN, come per esempio un modem/router FRITZ!Box o altri modelli/marche in grado di effettuare da sé l’operazione. Se e quando un modem è in grado di provvedere a tale funzione, è sempre buona regola lasciare che sia lui ad aggiornare tale associazione, e non il Raspberry o altri host della propria rete.

Port forwarding

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

Recarsi ora presso al blocco “http” del configuration.yaml ed eventualmente (se presente) rimuovere il campo base_url.
Collegarsi subito dopo al frontend web (all’indirizzo in uso precedentemente) e, presso il menu “Impostazioni” > “Generale” impostare alla voce “URL Esterno” (se la voce non appare, attivare la “Modalità avanzata” presso il proprio profilo utente) l’indirizzo appena creato, ovvero:

http://casamia.duckdns.org:8123

ovviamente sostituendo casamia col vostro nome dominio precedentemente definito. Salvare e riavviare Home Assistant.

N.b. Se la porta esterna è stata modificato dalla consigliata porta 8123, l’indirizzo dovrà variare in relazione a tal modifica.

A questo punto (effettuata la configurazione) collegandosi dall’esterno della rete Wi-Fi (tramite browser o tramite l’app mobile Home Assistant Companion per iOS o Android) all’indirizzo appena impostato, inclusivo di porta (8123 o quella che sia).

Dehydrated

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

sudo su -s /bin/bash homeassistant

Una volta collegati via SSH al Raspberry Pi, accedere al percorso 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 inserire il seguente testo:

casamia.duckdns.org

dove “casamia” andrà ovviamente sostituito col proprio nome dominio.
Uscire salvando (CTRL+X / Y / invio).

Ora creare un nuovo file “config“:

nano config

e inserire 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"

Uscire salvando (CTRL+X / Y / invio).

Ora creare il file “hook.sh“:

nano hook.sh

e inserire 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 Duck DNS su Home Assistant (nome dominio personale e token).

Infine, uscire salvando (CTRL+X / Y / invio).

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

chmod +x hook.sh

generare dunque i certificati tramite 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.

Rinnovo automatico dei certificati

Dato che i certificati crittografico hanno una durata limitata (90 giorni), configureremo 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 è necessario attivare i certificati crittografici su Home Assistant: per farlo è sufficiente effettuare una piccola modifica presso il file di configurazione configuration.yaml presente, come sempre, nel percorso “/home/homeassistant/.homeassistant“.

Per farlo è necessario aggiungere un blocco “http: all’interno del file, come segue:

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 voce di menu “Impostazioni” > “Generale“: in basso, alla voce “URL Esterno” (se la voce non appare, attivare la “Modalità avanzata” presso il proprio profilo utente), impostare il proprio URL esterno:

https://casamia.duckdns.org:8123

ovviamente sostituendo casamia col vostro dominio precedentemente definito. Salvare e riavviare 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.

Terminato il riavvio, Home Assistant dovrebbe essere correttamente controllabile da remoto (e in locale) in modo sicuro tramite l’indirizzo appena configurato (quello in verde qui sopra), collegandosi – tramite browser o tramite l’app mobile Home Assistant Companion per iOS o Android – all’indirizzo appena impostato, inclusivo di porta (8123 o quella che sia).

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

Sarà chiaramente necessario personalizzare la stringa “host” col proprio FQDN e “port” con la propria porta.

Questa configurazione genererà un’entità sensore chiamata sensor.cert_expiry_casamia_duckdns_org_8123 (il nome varierà in base alle proprie impostazioni) che riporterà la data di scadenza del certificato. A questo punto definiamo un sensore che riporti il numero di giorni mancanti alla scadenza:

sensor:
  - platform: template
    sensors:      
      certificate_expiry:
        friendly_name: "Scadenza certificato"
        value_template: "{{ (( as_timestamp(states('sensor.cert_expiry_timestamp_casamia_duckdns_org_8123')) | int - as_timestamp(now()) | int ) /60/60/24 ) | int }}"
        unit_of_measurement: "Giorni"
        icon_template: mdi:certificate

La configurazione creerà un sensore chiamato sensor.certificate_expiry che riporterà i giorni mancanti alla scadenza. Ovviamente, lo stato di tale sensore sarà anche visualizzabile presso il frontend web Lovelace UI.

N.b. 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.

Aggiornamento automatico

Può capitare che l’IP della WAN assegnato al router cambi e che l’aggiornamento non venga recepito da Duck DNS, 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 Duck DNS:

Aggiornare automaticamente Duck DNS 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 (indicando sempre https://).

N.b. Tra l’altro la cosa risulta particolarmente utile in caso di problemi col servizio Duck DNS 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 port forwarding 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.