Domotica con Raspberry. Home Assistant + HTTPS
Ecco un altro articolo della serie Domotica con Raspberry. La Domotica e la Sicurezza sono due cose che devono correre su due binari paralleli. Oggi andiamo a vedere come aumentare la sicurezza e crittografare tutte le connessioni che facciamo verso il nostro software di Domotica: Home Assistant.
Premessa
NON dimentichiamoci che con HomeAssistant possiamo controllare tutto. Anche l’apertura delle porte. Dobbiamo essere sicuri di avere tutto quello che concerne la sicurezza al posto giusto.
Hai già dato un occhio all’indice di articoli inerenti la Domotica presenti nel mio sito? Facci un salto: Indice articoli di Domotica
In dettaglio andremo a migliorare:
- La sicurezza e la comunicazione con Home Assistant mediante l’aggiunta del protocollo HTTPS
- Configurare correttamente una connessione che ci permetta di raggiungere Home Assistant anche quando siamo fuori casa.
- Aumentare la sicurezza per quanto riguarda la configurazione di Home Assistant.
- Proteggere il nostro sistema adeguatamente, impostando tutte le password del caso.
Passo 1: Raspberry
- Prima di tutto, cambiamo la password di default della nostra Raspberry mediante il comando guidato: sudo raspi-config
- Cambiamo il nome DNS della nostra Raspberry andando a modificare il file: /etc/hostname.
- Disinstalliamo tutti i programmi inutili che possiamo aver installato.
- Teniamo la nostra Raspberry sempre aggiornata con le ultime patch di sicurezza tramite il comando combinato:
sudo apt-get update && sudo apt-get upgrade -y
Passo 2: DNS Dinamico
A meno che non siate provvisti di una connessione con IP statico o un DNS di proprietà, per connetterci dall’esterno in maniera più dinamica occorre avere un nome DNS. Tramite il servizio offerto gratuitamente da no-ip.com possiamo crearne uno nostro.
Se avete la classica ADSL Telecom, il vostro IP pubblico spesso cambia. Un servizio di DNS dinamico non è altro che una piattaforma che permette di linkare il nome DNS che avete scelto, con l’IP pubblico della vostra ADSL.
Questo vi permette di connettervi da remoto senza bisogno di ricordarvi l’IP.
- Creare un account su www.no-ip.com
- Una volta creato l’account, seguire la procedura guidata per creare un nuovo DNS Dinamico.
- Non è necessario pagare nulla. Il piano offerto gratuitamente soddisfa tutti i requisiti di cui abbiamo bisogno.
Passo 3: Aggiornamento automatico DNS Dinamico
Il DNS Dinamico che abbiamo creato nel passo precedente, non si aggiorna da solo. Il servizio offre dei programmi che si possono installare o configurazioni da importare nel nostro Router per far sì che il DNS sia sempre allineato con il nostro IP pubblico.
Quello che vediamo adesso è come installare un servizio di aggiornamento continuo all’interno della nostra Raspberry.
Connettetevi in SSH alla Raspberry e copiate i seguenti comandi: (lanciare i comandi come utente normale)
mkdir /home/pi/noip
cd /home/pi/noip
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
tar vzxf noip-duc-linux.tar.gz
cd noip-2.1.9-1
sudo make
sudo make install
Eseguito anche l’ultimo comando, vi domanderà le credenziali per connettere il vostro account. Quest’ultime sono quelle che avete creato poco fa.
- Scegliete quale Hostname tenere aggiornato. Consiglio di aggiornarne uno a meno che non abbiate strettamente bisogno di aggiornarli tutti. Della serie, non mescoliamo le cose.
- Scegliete l’intervallo di aggiornamento. Se pensate di riavviare spesso il vostro router, impostate 15, altrimenti 30 minuti andrà benissimo.
Fatto questo, inseriamo il programma in autostart nella Raspberry.
Aggiungiamo questa riga nel file /etc/rc.local prima di “exit 0”
vim /etc/rc.local
/usr/local/bin/noip2
Riavviamo la Raspberry tramite il comando: sudo reboot e verifichiamo che il servizio noip2 sia operativo tramite il comando:
ps -elf | grep noip2
Se nel risultato di questo comando compaiono 2 righe, avete configurato tutto correttamente.
Passo 4: Pre-configurazioni del Modem/Router.
Per attivare il certificato HTTPS su Home Assistant dobbiamo prima fare delle pre-configurazioni al nostro Modem/Router. Essendoci un sacco di modelli, se non sapete come fare, cercate una guida su come fare “Port Forwardning” nel vostro Modem/Router.
In dettaglio:
- Fate un PF (Port Forwarding) dalla porta 80 in ingresso alla porta 80 in uscita, verso l’ip della vostra raspberry
- Fare un altro PF con la porta 443.
Questa configurazione è solo temporanea per validare il certificato.
Passo 5: Let’s Encrypt!
Let’s encrypt è un servizio che ci permette di creare un certificato HTTPS gratuito della durata di 90 giorni. Alla scadenza, basterà eseguire di nuovo i seguenti passi per rinnovarlo.
Torniamo alla nostra console SSH. Sempre come utente normale.
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
Lanciate il seguente comando aggiornandolo con i vostri dati:
./letsencrypt-auto certonly –email [email protected] -d example.com
example.com è il DNS che avete creato su no-ip.
Quando il comando chiede: “How would you like to authenticate with the ACME CA?”, selezionate la seconda opzione: “Spin Up a temporary webserver (standalone)” e premete INVIO.
Accettare i termini.
Rendete le chiavi generate dalla procedura gestibili da Home Assistant:
sudo chmod -R 777 /etc/letsencrypt
- Rimuovete il PF relativo alla porta 80. Non è più necessario.
- Modificate il secondo PF in modo che dalla porta 8123 in ingresso punti alla 8123 in uscita.
Passo 6: Configurazione Home Assistant
Integriamo la configurazione di Home Assistant aggiungendo dentro il file configuration.yaml questo:
http: api_password: !secret api_password ssl_certificate: !secret ssl_certificate ssl_key: !secret ssl_key ip_ban_enabled: True login_attempts_threshold: 2
- api_password va a specificare una password una volta che entrate nell’interfaccia web.
- ssl_certificate specifica il certificato SSL
- ssl_key specifica la chiave SSL
- ip_ban_enable Blocca l’ip che sta tentando di accedere se falliamo il Login.
- login_attempts_treshold indica il numero di fallimenti del login prima di essere bannati.
Questa guida è solo a scopo didattico, se mettete in piedi tutto vi consiglio di cambiare porta utilizzata da Home Assistant per connettervi. Dovrete poi aggiornare anche le regole del vostro Modem/Router
Passo 7: File secrets.yaml
Nello stesso livello dove è presente il file configuration.yaml, creiamo un file chiamato secrets.yaml.
In questo file andiamo a scrivere tutte le nostre password/configurazioni. Questo spiega la sintassi “!secret” nella configurazione di poco fa.
Copiamo dentro il file secrets.yaml questo contenuto.
#Http filter
api_password: VOSTRAPASSWORD
ssl_certificate: ‘/etc/letsencrypt/live/DNS_DINAMICO_CREATO/fullchain.pem’
ssl_key: ‘/etc/letsencrypt/live/DNS_DINAMICO_CREATO/privkey.pem’
Diamo ora i permessi corretti al file appena creato.
sudo chown homeassistant.homeassistant secrets.yaml
Riavviamo Home Assistant
sudo service home-assistant restart
Passo 8: Configurazione DNS Raspberry.
Questo passo serve per configurare un servizio DNS nella vostra Raspberry. In particolare andremo ad installare BIND.
Nel nostro caso il DNS locale ci serve per poter utilizzare il DNS_DINAMICO_CREATO sia da dentro casa che da fuori. Se saremo a casa, il DNS verrà risolto con l’ip privato della nostra Raspberry (es 192.xxx.xxx.xxx) mentre se siamo fuori casa verrà risolto con l’ip pubblico (es: 79.xxx.xxx.xxx)
Connettiamoci in SSH alla nostra Raspberry ed aggiorniamola.
sudo su –
apt-get update && apt-get upgrade -y
Una volta aggiornato tutto, aggiorniamo anche il file /etc/hosts con il nome DNS che abbiamo deciso prima.
vim /etc/hosts
IP_RASPBERRY DNS_DINAMICO_CREATO
Installiamo Bind e predisponiamo l’ambiente:
apt-get install bind9 bind9utils bind9-doc
service bind9 stop
cd /etc/bind
mkdir zones
chown -R bind.bind zones/
Modifichiamo il file apparmor
vim /etc/apparmor.d/usr.sbin.named
Sotto la riga “/etc/bind**r,” aggiungere:
/etc/bind/zones/** rw,
Modifichiamo il file di configurazione “/etc/bind/named.conf.options” sovrascrivendolo con questo contenuto:
options {
directory “/var/cache/bind”;//Se volete essere notificati quando il DNS server fa qualcosa
notify yes;
allow-transfer {none;};//Forward delle query che non conosce a questi IP
forwarders {
8.8.8.8;
8.8.4.4;
};//configurazioni di default
dnssec-validation auto;auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
Modifichiamo il file di configurazione locale. “/etc/bind/named.conf.local” con questo:
zone “ddns.net”{
type master;
file “/etc/bind/zones/ddns.net.dns”;
};
Create ora il file con la vostra zona:
vim /etc/bind/zones/ddns.net.dns
Incollate questo all’interno, modificandolo con il vostro IP
; ; BIND data file for ddns.net ; $TTL 3600 @ IN SOA ns1.ddns.net. root.ddns.net. ( 090401 ; Serial (NOTE: Needs to increment eve$ 3600 ; Refresh [1h] 600 ; Retry [10m] 86400 ; Expire [1d] 600 ) ; Negative Cache TTL [1h] ; @ IN NS ns1.ddns.net. @ IN A INDIRIZZO_IP_RASPBERRY
; ns1 A INDIRIZZO_IP_RASPBERRY RADICE_DOMONIO A INDIRIZZO_IP_RASPBERRY
Per RADICE_DOMINIO si intende quello scritto prima di .ddns.net.
Evitare problemi di spazio e gestire meglio il DNS
Impostiamo un Log Rotate:
vim /etc/bind/named.conf.log
Copiamo dentro il file appena creato questo contenuto:
logging {
channel bind_log {
file “/var/log/bind/bind.log” versions 3 size 5m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default { bind_log; };
category update { bind_log; };
category update-security { bind_log; };
category security { bind_log; };
category queries { bind_log; };
category lame-servers { null; };
};
Modifichiamo il file /etc/bind/named.conf aggiungendo questa riga
include “/etc/bind/named.conf.log”;
Creiamo ora le directory necessarie
mkdir /var/log/bind
Creiamo il file per tenere lo spazio sotto controllo
cd /etc/logrotate.d/
vim bind
Copiamo dentro questo contenuto:
/var/log/bind/bind.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 bind bind
postrotate
/usr/sbin/invoke-rc.d bind9 reload > /dev/null
endscript
}
Settiamo correttamente di nuovo tutti i permessi per i file che abbiamo modificato
chown bind:bind -R /var/log/bind
chown bind:bind -R /etc/bind/
service bind9 start
Verifichiamo che il servizio di BIND stia correttamente girando:
service bind9 status
Se ci compare la scritta “active (running)”, tutto è andato per il verso giusto.
Nella cartella /var/log/bind/ ci saranno i Log di tutte le nostre richieste.
- Nelle impostazioni del DHCP del vostro Modem/Router dovete impostare come DNS primario l’indirizzo IP del vostro Raspberry.
Con questa configurazione, non dovete preoccuparvi di modificare nessun indirizzo/Ip nelle vostre connessioni a Home Assistant.
Passo 9: Riepilogo
Tutti i passi fatti hanno creato questa configurazione:
- Cambiata password di Default di Raspbian.
- Introdotto protocollo HTTPS per le comunicazioni con Home Assistant
- Configurato un sistema per poter accedere ad Home Assistant sia dall’esterno che dall’interno con lo stesso URL.
HTTPS://DNS_DINAMICO_CREATO:8123
Se nella configurazione di Home Assistant, avete modificato la porta di connessione, basta cambiarla
- Aggiunta una password all’apertura della pagina di Home Assistant
- Abilitato un BAN per gli IP che provano a loggarsi nell’interfaccia senza la password corretta.
Nel mio precedente post modificare l’indirizzo IP della Raspberry con https://DNS_DINAMICO_CREATO:8123 per accendere/spegnere le luci di casa con Tasker anche quando siete fuori casa!
Hai già dato un occhio all’indice di articoli inerenti la Domotica presenti nel mio sito? Facci un salto: Indice articoli di Domotica
Avete già iniziato a fare esperimenti con Home Assistant? Fatemelo sapere nei commenti.
12 commenti
Ciao Nik
ho provato ad eseguire quanto mi hai indicato ma il problema si ripresentava.
ho provato ad eseguire la configurazione con ducKdns e ora funziona correttamente
Grazie Mille per l’aiuto!!!!!
Oltre a quanto ti ho già scritto, puoi usare anche il file /etc/pihole/local.list per creare tutti i tuoi record senza crearne uno nuovo
Ciao
Nik
Ciao Davide,
Grazie! Ad occhio sembra un errore dentro il file /etc/bind/named.conf
Ti do un consiglio. Considerando il doppio benefico a seguito dell’avvento di Pi-Hole: Filtro pubblicità e DNS, prova a seguire il mio tutorial per l’installazione di Pi-Hole qui: https://www.nicolapreo.it/elimina-pubblicita-pi-hole/ e questa guida per la configurazione di Pi-Hole come DNS: https://discourse.pi-hole.net/t/howto-using-pi-hole-as-lan-dns-server/533
Se hai problemi scrivimi.
Io da quando uso Pi-Hole mi trovo benissimo
Ciao!
Nik
Ciao Nik
Complimenti per le tue guide!!!!
ho seguito la procedura ma nel momento in cui verifico lo stato del servizio di BIND trovo questo:
● bind9.service – BIND Domain Name Server
Loaded: loaded (/lib/systemd/system/bind9.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2018-04-29 14:43:49 UTC; 3s ago
Docs: man:named(8)
Process: 2772 ExecStop=/usr/sbin/rndc stop (code=exited, status=1/FAILURE)
Process: 2764 ExecStart=/usr/sbin/named -f $OPTIONS (code=exited, status=1/FAILURE)
Main PID: 2764 (code=exited, status=1/FAILURE)
apr 29 14:43:49 raspberrypi named[2764]: adjusted limit on open files from 4096 to 1048576
apr 29 14:43:49 raspberrypi named[2764]: found 4 CPUs, using 4 worker threads
apr 29 14:43:49 raspberrypi named[2764]: using 2 UDP listeners per interface
apr 29 14:43:49 raspberrypi named[2764]: using up to 4096 sockets
apr 29 14:43:49 raspberrypi named[2764]: loading configuration from ‘/etc/bind/named.conf’
apr 29 14:43:49 raspberrypi systemd[1]: bind9.service: Main process exited, code=exited, status=1/FAILURE
apr 29 14:43:49 raspberrypi rndc[2772]: rndc: connect failed: 127.0.0.1#953: connection refused
apr 29 14:43:49 raspberrypi systemd[1]: bind9.service: Control process exited, code=exited status=1
apr 29 14:43:49 raspberrypi systemd[1]: bind9.service: Unit entered failed state.
apr 29 14:43:49 raspberrypi systemd[1]: bind9.service: Failed with result ‘exit-code’.
da cosa può dipendere?
Grazie in anticipo per la risposta
Ciao Tonnio,
Per rispondere alle tue domande:
– nel DHCP puoi configurare sicuramente 2 DNS. Metti 8.8.8.8 come DNS secondario così i dispositivi, se la Raspberry è spenta, possono navigare. (Cosa intendi per far funzionare gli ip interni alla rete?
– Da quello che so, Homeassistant non fa redirect. Devi agire tu sul Webserver. Ti consiglio di modificare tutti gli indirizzi che hai con “HTTPS”
PS. Grazie per il consiglio! lo terrò a mente. Credo comunque sia una formattazione di wordpress. Ottimo come feedback
Ciao
Nik
Grazie per la risposta,
in pratica ho capito che:
– l’indirizzo http://xxxx.ddns.net:8123 non funziona (sia da interno che da esterno)
– l’indirizzo https://xxxx.ddns.net:8123 invece funziona (sia da interno che da esterno)
– l’indirizzo 192.168.178.201:8123 non funziona nemmeno dall’interno (non riesco a capire perché dato che sta nella stessa rete e avendo l’ip il DNS non dovrebbe servire a niente
– l’unica soluzione che ho trovato per farlo funzionare cosi è stata impostare sui dispositivi su cui voglio usare Home Assistant ip e dns manuali (primario 192.168.178.201 secondario 8.8.8.8), mentre sul DHCP del router ho lasciato il DNS 192.168.178.1 perchè sennò quando collegavo i dispositivi con DHCP se in quel momento il raspberry era spento non riuscivano a navigare.
hai suggerimenti per:
– far funzionare gli ip interni alla rete ?
– riuscire a reindirizzare http://xxxx.ddns.net:8123 su https://xxxx.ddns.net:8123 ?
Grazie per la guida e le risposte.
PS un suggerimento per quanto riguarda l’articolo: probabilmente molti non riusciranno a portare a termine la guida perché il copia e incolla per un non esperto porta risultati errati, per esempio il doppio trattino si è trasformato in un trattino lungo, i doppi apici si sono trasformati in doppi apici strani invece di questo “xxx” c’è questo “xxx”. Magari converrebbe mettere il codice su qualche sito specializzato tipo questo: https://pastebin.com/
Grazie ancora per le risposte
Ciao Tonnio,
E’ tutta una questione di che DNS hai settato nel PC. Se hai configurato la Raspberry con Bind devi anche sistemare i vari dispositivi in modo che usino la Raspberry come DNS. Dall’interno raggiunti l’indirizzo xxxx.ddns.net:8123? Considera che da adesso in poi non ti conviene più utilizzare gli IP ma i nomi DNS invece.
Ciao
Nik
Ciao ho seguito la tua guida,
adesso funziona l’indirizzo xxxx.ddns.net:8123 (anche dall’esterno)
ma non funziona più dall’interno il 192.168.178.201:8123
forse può essere utili l’indizio che non funziona nemmeno più l’indirizzo veloce del router fritz: http://fritz.box/
PS ho il router Fritz dove nel dhcp posso assegnare solo un indirizzo DNS (Server DNS locale)
Forse è questo il motivo?
Come posso risolvere?
Ciao Flavio,
Quell’errore sta ad indicare che il file non è nel percorso dove esegui il comando. Se l’hai creato dentro la cartella di homeassistant, assicurati di essere nel percorso giusto quando lo lanci. Puoi usare il comando “pwd” per verificarlo
Ciao
Nik
Ciao Nik ho un piccolo problema ho seguito tutta la procedura ma il comando sudo chmod -R 777 /etc/letsencrypt non è stato ricevuto poi ho riavviato ho inserito il comando.: sudo chown homeassistant.homeassistant secrets.yaml e appare questo messaggio
(chown: cannot access ‘secrets.yaml’: No such file or directory ) cosa devo fare? ho modificato il file configuration e il file secret yaml .
Grazie per la tua risposta e ti auguro buona Pasqua.
Ciao Luca,
Ho appena provato e non ho riscontrato problemi. prova a verificare che il comando sia lanciato dall’utente pi e dentro la cartella di letsencrypt
Il comando è “./letsencrypt-auto certonly –email [email protected] -d dominio.com”
Occhio che “–email” ha 2 trattini e “-d” ne ha uno solo.
In caso, riprova da root
Ciao
Nik
Ciao, ottime guide, avrei un problema con questa però, al passo 5 quando devo inserire
./letsencrypt-auto certonly –email [email protected] -d example.com
mi da
certbot: error: unrecognized arguments: –email [email protected]
da cosa può dipendere?
grazie
Luca