community italiana di domotica personale
 
Collegarsi da remoto a Home Assistant Core installato su Raspberry Pi OS

Collegarsi da remoto a Home Assistant Core installato su Raspberry Pi OS

SCOPI DELLA GUIDA:
  • Fornire al proprio Home Assistant (installato Core su sistema operativo Raspberry Pi OS) 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:
  • Home Assistant Core configurato e funzionante
  • Raspberry Pi con sistema operativo Raspberry Pi OS
DISPOSITIVI FISICI UTILIZZATI:
GUIDA INDICATA A UTENTI CON ISTALLAZIONE:
Ambiente Home Assistant Core
NOTE E DISCLAIMER
  • qualsiasi eventuale modifica agli impianti domestici dev'essere progettata e realizzata SOLO da personale qualificato;
  • qualsiasi modifica non prevista attuata in proprio è a propria responsabilità personale nonché a proprio rischio e pericolo (i contenuti della presenta pagina hanno infatti puro scopo didattico) e fa decadere garanzia, omologazioni e certificazioni di qualità; dei dispositivi interessati;
  • tutte le tecniche descritte si intendono applicate a software e firmware aggiornati alle ultime versioni disponibili;
  • gli articoli di inDomus sono totalmente indipendenti e non sponsorizzati. Se mai questo cambiasse, verrà segnalato chiaramente sulle pagine oggetto di sponsorizzazione;
  • questa pagina è materialmente scritta e manutenuta da più individui: non ci si aspetti né si pretenda un supporto personale. In caso di difficoltà, chiedere supporto alla community sul nostro forum o sulla nostra chat;
  • se hai bisogno di orientarti, c'è la mappa.
Revisione guida: 5.9
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 proprio 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 (DuckDNS) e di emissione certificati gratuiti (Let’s Encrypt).

N.b. per gli utenti Home Assistant OS: per collegarsi in sicurezza ad Home Assistant in distribuzione HassOS la procedura può essere molto semplice, utilizzando DuckDNS, oppure un po’ più complessa, usando reverse proxy. Abbiamo spiegato tutto qui.

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 Raspberry Pi OS 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 DuckDNS

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.

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 nome dominio che, univocamente, rappresenterà il vostro modem 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 DuckDNS 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.

Aggiornamento di DuckDNS

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 DuckDNS, in modo da aggiornare la conseguente risoluzione dell’FQDN.

Per far questo è sufficiente seguire questa breve guida:

Aggiornare il proprio record su DuckDNS tramite automazione Home Assistant

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

Collegarsi subito dopo al frontend web (all’indirizzo in uso precedentemente) e, presso il menu “Configurazione” > “Sistema” > “Rete” e nel box “URL di Home Assistant” impostare “Internet” (se la voce non appare, attivare la “Modalità avanzata” presso il proprio profilo utente) con 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).

Vetrina - Offerte del giorno

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 DuckDNS 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 Raspberry Pi OS 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 “Configurazione” > “Sistema” > “Rete” e nel box “URL di Home Assistant” > “Internet” (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 l’adozione di una specifica integrazione. Recandosi alla voce “Configurazione” > “Integrazioni” di Home Assistant, oppure direttamente usando il link che segue:

 

è possibile cercare e configurare l’integrazione “Scadenza certificato“. Configurandola:

Home Assistant - Scadenza certificato

sarà sufficiente valorizzare il campo “host” col proprio FQDN e “porta” 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'),0) | int(default=0) - as_timestamp(now()) | int(default=0) ) /60/60/24 ) | int(default=0) }}"
        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 l’interfaccia dell’HUB.

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 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 il proprio record su DuckDNS tramite Raspberry Pi OS

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

⚠️ Se di Home Assistant ne sai poco ma sei interessato a capirne di più, ti suggeriamo di partire da qui.