Collegarsi da remoto a Home Assistant su Raspberry in piena sicurezza

8 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/alto
CONCETTI AFFRONTATI:
  • Installazione e configurazione software
  • Configurazione modem/router
COMPONENTI SOFTWARE UTIlIZZATE:
PREREQUISITI:
  • Home Assistant configurato e funzionante
  • 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.8
ATTENZIONE: questa guida è dedicata agli utenti che abbiano installato Home Assistant come applicativo su Raspberry/Windows/Mac o altre realtà operative. 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.

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

domainnome di dominio definito sul servizio DuckDNS
access_tokentoker 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 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:

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

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

exit

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:

  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

ssl_certificateè il certificato appena creato
ssl_keysono 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
    #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

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.

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:

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.


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