Talos: HA Security
Scanner
Integrazione Home Assistant che mappa da dove arrivano i dati della casa e dove vanno a finire. Incrocia quello che Home Assistant dichiara dei propri dispositivi con quello che il resolver DNS li ha visti fare davvero, e tiene le due cose separate ovunque tranne che in un punto. Risponde anche alla domanda che nessuno fa: cosa smette di funzionare quando cade la linea, e quale marca si porta via il pezzo più grosso di casa.
Cos’è
Talos guarda una casa domotica e risponde a due domande che Home Assistant da solo non sa porsi: da dove arrivano i dati e dove vanno a finire, e cosa continua a funzionare quando cade la linea.
Legge quello che Home Assistant dichiara dei propri dispositivi, lo incrocia con quello che il resolver DNS li ha visti fare davvero, e riporta entrambi i lati con la prova attaccata a ogni riga.
Il motivo, in una frase
L’iot_class nel manifest di un’integrazione dice come Home Assistant parla con un dispositivo, e non dice niente su come quel dispositivo parla con Internet.
Una Shelly su local_push può avere Shelly Cloud attivo in parallelo, e Home Assistant non lo saprà mai: dal suo punto di vista quel dispositivo è locale, perché locale è il modo in cui ci parla lui. Sono due fatti diversi, e Talos li tiene separati ovunque, incrociandoli in un punto solo: la matrice.
Perché il nome Talos
Nella mitologia greca Talos è l’automa di bronzo che girava intorno a Creta tre volte al giorno, guardando chi si avvicinava alla costa e cosa portava con sé. Non attaccava la gente dell’isola e non tirava a indovinare: guardava, e riferiva.
È esattamente quello che fa questa integrazione, ed è anche il motivo per cui si rifiuta di chiamare vulnerabilità un’euristica sui metadati.
Il quadrante che conta
La matrice incrocia i due lati, e uno dei quattro quadranti è l’unica cosa rossa dell’interfaccia: dichiarato locale a Home Assistant, eppure beccato a telefonare fuori.
Non è un allarme generico, è una contraddizione fra due fonti indipendenti: da una parte quello che l’integrazione afferma di sé, dall’altra le query DNS che quel dispositivo ha fatto davvero. Le altre tre caselle sono coerenti e restano grigie.
Cosa c’è nel pannello
| Vista | Cosa risponde |
|---|---|
| Mappa delle connessioni | Un grafo a forze, alla maniera di Obsidian, disegnato senza librerie: ogni dispositivo vicino al suo hub, ogni hub vicino alla sua integrazione. Solo dati dichiarati, quindi funziona anche senza AdGuard configurato |
| Matrice dichiarato/osservato | Il quadrante rosso qui sopra |
| Autonomia offline | Entità e integrazioni che reggono a linea caduta, raggruppate per marca, così il guasto di un singolo fornitore si può quantificare |
| Esposizione esterna | Dispositivi visti uscire, con volume di query, marca, e se AdGuard ne ha filtrata una parte |
| Grafo dei flussi | A colonne, dove il punto del disegno sono gli archi che scavalcano Home Assistant del tutto |
| Rotte | Ogni riga si legge da sinistra a destra: chi parla, le tratte che portano il dato e cosa c’è in fondo. Dove la frase si spezza lo dichiara, invece di lasciare un ramo che finisce sul nulla |
| Controlli di postura | Gravità e rimedio, con quattro esiti possibili: superato, verificato in parte, rilievo, non eseguito |
| Diagnostica | Una misura presa adesso, mai pianificata e tenuta fuori dalla scansione, con add-on e risorse di sistema dove c’è il Supervisor |
Le due onestà del progetto
I controlli che non hanno potuto girare non diventano promossi. Vengono contati a parte e dichiarati, e dalla v1.21 esiste anche un quarto esito, verificato in parte, per il caso in cui un controllo abbia girato ma senza vedere tutto: il verde sosterrebbe che si è visto tutto, il grigio che non si è guardato niente, e nessuna delle due cose è vera. Un parziale non finisce mai fra i promossi, e il totale resta verificabile a mano.
Il controllo zero. Talos elenca gli host che hanno una lease DHCP ma non interrogano mai il resolver. Sono i punti ciechi dello strumento stesso: dispositivi di cui non può dire niente, perché la sua fonte osservata non li vede. Dichiararli è più utile che far finta che il quadro sia completo.
Come funziona una scansione
Cinque passi, per default ogni quindici minuti.
1. Leggere il lato dichiarato. I registri vengono letti in processo. L’unità canonica è il config entry, non il dispositivo: mobile_app, il meteo e il TTS possiedono entità senza possedere nessun dispositivo, e sono fra le cose più legate al cloud di un’installazione tipica.
Dall’entry si leggono due sole cose. La prima è l’indirizzo a cui si connette, che è l’unico modo per distinguere due broker: con EMQX e Mosquitto installati entrambi, il dominio dice mqtt per tutti e due, e solo l’entry dice da quale passano davvero i dispositivi. Niente altro viene letto, perché lo stesso dizionario contiene nomi utente, password e token, e nessuno di quelli deve finire in un documento destinato all’esportazione. La seconda è lo stato dell’entry: uno in setup_retry non sta servendo niente, quindi le sue entità vengono contate come non disponibili invece che come locali. Funzionare offline e non funzionare affatto non sono lo stesso risultato.
2. Interrogare AdGuard Home. Il registro delle query è un buffer circolare, non una cronologia interrogabile: Talos lo percorre dal più recente con il cursore older_than e si ferma dove si era fermato la volta prima. I totali vivono in un SQLite dedicato, mai nel database del recorder, perché la ritenzione di AdGuard ricicla e un dispositivo che la settimana scorsa aveva risolto un dominio quattromila volte altrimenti oggi risulterebbe averlo fatto una manciata di volte.
Anche una radio è un condotto. Una lampada Zigbee scambia dati col coordinatore in continuazione e non tocca mai IP: non ha indirizzo, non compare in nessun registro di query, e prima mancava da ogni vista costruita sui condotti. Il grafo mostrava la parte di casa che parla con Internet e ometteva quella che non lo fa, il che diceva che il ramo non c’era invece che dire che non esce mai dall’hub. Ora ogni dispositivo appeso a un altro porta un condotto dichiarato verso di lui, con il trasporto come protocollo, che finisce su un local_hub e si ferma lì: quello che fa l’hub dopo è il condotto dell’hub.
3. Unire i due lati. Il registro dei dispositivi conosce i MAC, il registro delle query conosce gli IP: qualcosa deve tenere insieme entrambi. Le lease DHCP sono la strada solita, ma ce n’è un’altra già dentro Home Assistant, cioè un device tracker basato sul router (AsusWRT, UniFi, Fritz, OPNsense) che pubblica l’ip.
Cosa non fa, dichiarato
Tutto è in sola lettura. Niente scansione delle porte, niente sonde attive, niente ispezione del traffico, niente confronto con database di CVE.
Non è una rinuncia, è la stessa scelta del nome: uno strumento che guarda e riferisce non deve trasformare un’ipotesi sui metadati in un verdetto di sicurezza.
Le uscite
Nove entità di riepilogo e un binary sensor di problema, non una entità per dispositivo: un’integrazione di analisi che raddoppia il registro delle entità peggiora la casa che sta misurando.
Poi un’esportazione HTML autoconsistente, senza script e senza risorse esterne, che si archivia o si gira a qualcun altro, e una riga di comando separata che esegue la stessa pipeline fuori banda contro un’istanza remota.
L’elenco dei domini e quello dei controlli stanno in file di dati, quindi si estendono senza toccare il codice, e la configurazione iniziale trova da sola l’endpoint di AdGuard Home, dall’integrazione ufficiale o dall’add-on, precompilando il modulo con quello che ha davvero risposto.
Accesso
Il pannello è riservato agli amministratori. Distribuito via HACS, richiede Home Assistant 2024.6 o successivo.
Licenza
MIT.