Contenuti

Installa Openhab in modo sicuro in pochi minuti

Openhab, a differenza di altri strumenti come HomeAssistant, non offre di base molte opzioni o personalizzazioni di sicurezza. Nella documentazione ufficiale indicano la possibilità di configurare l’https, installare un proxy inverso e proteggere tramite credenziali l’accesso, ma il tutto non viene presentato per essere integrato con altri servizi di casa con la minor manutenzione possibile. Proprio per questo, dopo aver sperimentato qualche soluzione, propongo questa alternativa per installare Openhab sul tuo server domestico e raggiungerlo tramite un proxy inverso, con connessioni https, con rinnovo automatico dei certificati e con un sistema per richiedere credenziali aggiuntive in caso di accesso da fuori la rete locale.

1 L’obiettivo

In pochi passi avrai a disposizione un ambiente operativo di Openhab pienamente funzionante a casa tua, con una installazione sicura basata sull’impiego di un proxy inverso affidabile e robusto, un meccanismo automatico di richiesta e rinnovo certificati https e un set di credenziali per poter accedere dall’esterno. Il tutto estensibile anche a tutti gli altri servizi di casa.

2 Prerequisiti

  • Un server locale, come un vecchio pc o uno di quelli a risparmio energetico che sia sempre acceso. Va bene di tutto, dai server da rack agli Intel NUC (personalmente mi trovo bene con il Gigabyte Brix).
    Note
    Nella guida sono descritti i passaggi in caso di utilizzo di architettura intel x64 su sistema operativo basato su Linux. In caso di architettura ARM (ad esempio un Raspberry) o altri sistemi operativi non preoccuparti, con pochi adattamenti riuscirai a raggiungere lo stesso obiettivo.
  • Porta 80 e 443 non devono essere già utilizzate dal server locale.
  • il server locale deve avere un indirizzo statico in LAN (e.g. 192.168.1.X).
  • La rete di casa dovrà essere connessa a internet. In caso non abbia un indirizzo ip statico (in Italia per quello che so vengono concessi prettamente a contratti business) non c’è problema, è richiesta solo la registrazione di dns dinamico.
  • Tramite il router di casa la porta 80 e 443 dell’interfaccia WAN dovranno essere instradate verso il server locale (port forwarding).
  • docker e docker-compose devono essere installati sul server di casa. In caso non li avessi già installati, il sito ufficiale di docker fornisce delle guide semplici e efficaci a riguardo.
  • Un “dynamic DNS name” (come quelli offerti da NoIP e dyn.com) o un nome statico dns nel caso in cui abbia un indirizzo ip statico. In sostanza, per far lavorare i certificati per l’https è necessario in questo caso procurarsi un url simbolico che punti all’indirizzo pubblico di casa, il solo ip non basta. A proposito, nella configurazione del dynamic dns è importante ricordarsi di indirizzare tutti i sottodomini con la wildcard asterisco-punto prima del nome. Nella guida indicherò con “YourPersonalHomeLabSite.dyndns.org” il tuo dynamic dns.
  • Opzionale - Sul tuo server di casa puoi lavorare come preferisci, usando tastiera e mouse, tramite ssh, o kvm. Il mio consiglio è di utilizzare Visual Studio CODE con l’estensione Remote Development, è davvero comodo.

3 Cos’è un proxy inverso e perché ne abbiamo bisogno?

Il prodotto Nginx Proxy Manager è composto dal proxy Nginx (configurato come proxy inverso) e una interfaccia di gestione e configurazione. Il proxy inverso lo possiamo immaginare come un server web che risponde ad ogni pagina richiesta inviando dei contenuti da un altro server. In pratica, quando chiedo qualcosa ad un reverse proxy lui non possiede il contenuto e deve richiederlo al vero server in maniera sincrona alla mia richiesta.

Perché oggi è così impiegato?
Giusto un esempio: poniamo che ho una istanza di Home Assistant pubblicata sul mio server locale sul 192.168.1.4:5000 e una di Owncloud su un altro server con 192.168.1.10:8000. Esporre questi due servizi in https e all’esterno sulla wan potrebbe essere oneroso e richiedere specifiche configurazioni su ognuno dei servizi, oltre all’obbligarmi a ricordare per ogni servizio, l’url e la porta corretti. Se imposto questi due endpoint locali come rotte associati a sottodomini del mio proxy inverso potrei raggiungere homeassistant chiedendo al proxy inverso le pagine riferita a homeassistant.mydomain.org e owncloud chiedendo owncloud.mydomain.org. Il proxy inverso agisce come un collettore di richieste per tutte le risorse interne, mantenendo il vero server che espone il singolo servizio non direttamente coinvolto con l’interazione con i client. Questo porta a dei vantaggi sul fronte della sicurezza, della semplicità di configurazione e gestione, per non parlare della facilità di scalare le risorse in caso si abbiano necessità di maggiori risorse.

4 Avviamo i container

Sul server locale troviamo una cartella per organizzare tutte le configurazioni e i file afferenti ai servizi esposti. Usualmente sono abituato a /opt/homelab o /homelab (puoi scegliere qualsiasi altra cartella, dovrai modificare i path che trovi di seguito nella guida concordemente alla tua scelta). Dentro questa cartella andiamo a creare gli spazi per proxy e Openhab:

  • /opt/homelab/openhab
  • /opt/homelab/nginxproxymanager

Adesso configuriamo il file docker-compose del proxy /opt/homelab/nginxproxymanager/docker-compose.yaml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
version: '3.2'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    deploy:
      mode: global
    restart: always
    network_mode: host # with network_mode: host all ports are potentially exposed. if you want to select only few of them comment this line and uncomments "ports" chapter.
    #ports: 
    #  - target: 80
    #    published: 80 # Public HTTP Port
    #    protocol: tcp
    #    mode: host
    #  - target: 443
    #    published: 443 # Public HTTPS Port
    #    protocol: tcp
    #    mode: host
    #  - '81:81' # Admin Web Port - This port will be exposed only in the LAN
    volumes:
      - /opt/homelab/nginxproxymanager/config.json:/app/config/production.json
      - /opt/homelab/nginxproxymanager/data:/data
      - /opt/homelab/nginxproxymanager/letsencrypt:/etc/letsencrypt
    dns:
      - 8.8.8.8

  dns:
    restart: always
    image: strm/dnsmasq
    volumes:
      - /opt/homelab/nginxproxymanager/dnsmasq.conf:/etc/dnsmasq.conf
    ports:
      - "53:53/udp"
    cap_add:
      - NET_ADMIN

Ok, avviamo il proxy Nginx lanciando dal terminale:

1
2
cd /opt/homelab/nginxproxymanager
sudo docker-compose up -d

Allo stesso modo configuriamo i container per Openhab creando il file /opt/homelab/openhab/docker-compose.yaml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
version: '2.2'

services:
  openhab:
    image: "openhab/openhab"
    restart: always
    network_mode: host # Openhab should need the map of a lot of ports
    volumes:
      - "/opt/homelab/openhab/addons:/openhab/addons"
      - "/opt/homelab/openhab/conf:/openhab/conf"
      - "/opt/homelab/openhab/userdata:/openhab/userdata"
    environment:
      OPENHAB_HTTP_PORT: "8081" # just in LAN
      OPENHAB_HTTPS_PORT: "8444" # just in LAN
      TZ: "Europe/Rome" # put your timezone here
      EXTRA_JAVA_OPTS: "-Duser.timezone=Europe/Rome" # put your timezone here

Ladies and Gentlemen, start your engines:

1
2
cd /opt/homelab/openhab
sudo docker-compose up -d

5 Configurazione del Nginx Reverse Proxy

Da un pc nella rete LAN o dal server stesso navighiamo con un browser verso la pagina di gestione del proxy:

http://IP_OF_THE_HOMELAB_SERVER:81

Note

Il servizio chiederà di cambiare la password dopo il primo accesso. Le credenziali di default sono:

Come prima cosa dobbiamo creare 2 Access List. Iniziamo dalla prima che chiamiamo LAN.

/it/secure-openhab/access_list.png
Access List: LAN
/it/secure-openhab/access_list_subnet.png
Access List: Lan - Subnet

Ora passiamo a creare “LAN or Password”. In questo caso è importante indicare il flag “Pass authentication to host” per passare le credenziali all’applicazione che servirà la richiesta, in questo caso OpenHab.

/it/secure-openhab/access_list_password.png
Access List: LAN or Password
/it/secure-openhab/access_list_password_subnet.png
Access List: Lan or Password - Subnet

/it/secure-openhab/access_list_password_user.png
Dato che il sistema sarà esposto su Internet, è ancora più importante scegliere password robuste.

Adesso possiamo configurare gli host, i puntamenti del nostro proxy inverso. Andiamo su Hosts->Proxy Host->Add Proxy Host. Andiamo a configurare come host proprio Openhab. Nel caso voleessi configurare una homepage (dai un’occhiata alla dashboard che propongo) o altri servizi lo puoi fare allo stesso modo.

/it/secure-openhab/proxy_h9st.png
Con l'access list 'LAN or PASSWORD' il sito verrà esposto su internet ma sarà accessibile solo previa autenticazione con username e password qui indicati. Se non vuoi esporre il servizio su internet in nessun modo basta selezionare l'access list 'LAN'.

![Proxy Host for Proxy GUI -SSL](proxy_host_ssl.png “Se scegli “Request a new SSL Certificate” Nginx proxy manager si preoccuperà di richiedere, configurare e manutenere il certificato ssl per le connessioni https automaticamente!")

Nel tab “location” aggiungi qualche configurazione specifica di Openhab al path “/":

1
2
3
4
5
6
7
8
9
# Cross-Origin Resource Sharing.
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow_Credentials' 'true' always;
add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range' always;
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH' always;

# openHAB 3 api authentication
add_header Set-Cookie X-OPENHAB-AUTH-HEADER=1;

Salva, aspetta e BOOM, adesso puoi navigare verso https://openhab.YourPersonalHomeLabSite.dyndns.org per accedere alla tua istanza di Openhab, sia dalla tua rete che dall’esterno (ad esempio dal telefono su rete mobile), a patto tu abbia configurato il port forwarding sul router come indicato nei prerequisiti.

6 Setup del server DNS locale

Per usare le access list basate sull’ip del mittente è necessario che le richieste locali vengano gestite all’interno della rete senza passare per la wan. Se stai richiedendo una pagina da internet, ad esempio da una connessione mobile, un dns pubblico ti instraderà verso l’interfaccia pubblica del tuo router di casa che a sua volta ti instraderà verso il tuo server locale. E fin qui tutto fila. Al contrario, se la richiesta proviene dalla lan stessa, magari un pc collegato alla stessa rete, allora dobbiamo far in modo di non essere indirizzati al nostro router, uscendo e rientrando dalla nostra rete, ma dobbiamo andare direttamente verso il server locale e il reverse proxy. Solo in questo modo il nostro ip mittente rientrerà all’interno della sottorete e riusciremo a distinguerlo dal traffico che proviene dall’esterno della rete. Per fare questo configureremo un piccolo server dns interno. Per farlo crea il file /opt/homelab/proxy_dashboard/dns/dnsmasq.conf:

1
2
3
4
5
6
server=1.1.1.1
server=8.8.8.8
#explicitly define host-ip mappings
address=/YourPersonalHomeLabSite.dyndns.org/IP_OF_THE_HOMELAB_SERVER
address=/.YourPersonalHomeLabSite.dyndns.org/IP_OF_THE_HOMELAB_SERVER
address=/#.YourPersonalHomeLabSite.dyndns.org/IP_OF_THE_HOMELAB_SERVER

Una volta configurato il server dns interno dovrai configurarlo nella pagina del dhcp del router e/o direttamente sui device stessi come server dns primario della configurazione ip.

7 Boom, ce l’hai fatta

Adesso non ti rimane altro che configurare Openhab con tutti i dispositivi che hai dentro casa.

8 Ti prudono ancora le mani?

  • Stanco di doverti ricordare dozzine di ip, porte, url per ognuna delle tue applicazioni installate in casa? Dai uno sguardo alla semplice dashboard che è possibile realizzare.
  • Una buona idea quando si espone un servizio web su internet è quella di adottare un Web Application Firewall per controllare e supervisionare il traffico con l’esterno.

9 Avvertenze

Di base stai esponendo il proxy inverso e tutti gli host su internet, a meno delle access list configurate, e questo può costituire un rischio per la privacy e la sicurezza cibernetica. Per tale motivo è necessario avere sempre un occhio di riguardo per i test e per raffinare la configurazione, accertandosi che tutto stia funzionando correttamente e le uniche cose accessibili su internet siano quelle desiderate.

Se navighi dall’esterno verso il tuo ip pubblico noterai una schermata di errore 404, motivata dal fatto che al proxy inverso è richiesta la pagina web associata a quell’indirizzo ip. Il proxy inverso però non sa quale contenuto fornire, in quanto non è configurato alcun host associato ad un indirizzo ip.

Se vuoi limitare al massimo i servizi esposti su internet ti basta impostare tutti gli host, ad eccezione del principale della dashboard, sulla Access list “LAN”.

Un’ultima cosa. Google Chrome, Edge e i dispositivi Google sembra che abbiano iniziato ad utilizzare i propri servizi dns al posto di quelli del sistema operativo. Questo può creare qualche problema al traffico interno, in quanto noteremo che le richieste interne andranno verso la wan e poi torneranno indietro. Per evitare il problema, dalle impostazioni del browser basta impostare su off la configurazione “use secure dns”. In alternativa, se la tua casa è dotata di firewall, puoi bloccare le richieste di dns verso i server autoritativi di Google (magari consentendoli solo al tuo server locale). Ho notato inoltre che è meglio disabilitare il flag #use-dns-https-svcb-alpn in edge://flags/ e chrome://flags/. Ne parlo qui

10 Bisogno di una mano?

Se qualcosa non funziona come dovrebbe non preoccuparti, sei sulla strada giusta. Fai una passata per verificare punto per punto che i prerequisiti siano soddisfatti e assicurati di partire da un ambiente il più possibile pulito. In caso ci siano ancora dei problemi non esitare a lasciare un commento in modo che io o qualcun altro ti possa aiutare.