Facebook Twitter Instagram
    Nicola PreoNicola Preo
    • Home
    • Domotica
    • Informatica
    • Recensioni
    • Tutorial
    • About Nicola
      • Contattami
    Nicola PreoNicola Preo
    Domotica

    Domotica con Raspberry. Home Assistant + HTTPS

    12 commenti9 Mins Read
    domotica con raspberry

    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.

     

    Se volete il Bundle:

     

    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.

    Articoli collegati

    Case domotiche: una Dashboard per gestirle

    Rilevatore GAS metano smart

    Serratura Domotica Smart

    12 commenti

    1. Davide on 5 Maggio 2018 17:03

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

    2. Nik on 29 Aprile 2018 19:08

      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

    3. Nik on 29 Aprile 2018 19:03

      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

    4. Davide on 29 Aprile 2018 17:20

      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

    5. Nik on 16 Aprile 2018 19:07

      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

    6. Tonnio on 15 Aprile 2018 21:20

      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

    7. Nik on 15 Aprile 2018 19:30

      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

    8. Tonnio on 14 Aprile 2018 17:50

      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?

    9. Nik on 4 Aprile 2018 18:41

      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

    10. Flavio on 31 Marzo 2018 18:13

      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.

    11. Nik on 15 Marzo 2018 19:59

      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

    12. Luca on 14 Marzo 2018 22:01

      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

    Leave A Reply

    Homepage | Chi è Nicola Preo | Contatti | Privacy |

    Copyright © Nicola Preo

    Type above and press Enter to search. Press Esc to cancel.