Riferimento / Sicurezza e progetto
Architettura
Componenti del collettore, del pannello, del registro, dei worker e di Witness, e modalità di trasferimento dei dati tra di essi.
Un unico processo Python ospita il pannello FastAPI e un numero illimitato di aree di lavoro isolate, ciascuna dotata di un client con account utente Telethon. SQLite contiene un registro degli eventi firmato, in cui è possibile solo l’aggiunta di dati, e impostazioni operative modificabili. Un archivio crittografato contiene le credenziali API, la StringSession e la chiave di firma. Il frontend è costituito da un semplice pacchetto HTML/CSS/JavaScript: non sono necessari build Node, CDN né download del frontend in fase di esecuzione.
| Modulo | Responsabilità |
|---|---|
| collector.py | Autorizzazione, selezione delle finestre di dialogo, aggiornamenti, istantanee, coda dei file multimediali, monitoraggio della connessione |
| interactions.py / telegram_client.py | Azioni esplicite del pannello, ricevute firmate, ID richiesta persistenti e politica di riprova per callback/join a livello di attività |
| message_content.py | Confronto dei messaggi osservabili, esclusi i metadati relativi all’accesso di trasporto |
| workers.py | Attendere il completamento delle operazioni di esportazione dei file prima di procedere alla pulizia post-cancellazione |
| store.py | Transazioni WAL, catena di eventi ordinata, filtri di query, impostazioni operative |
| security.py | Creazione di file privati, archivio crittografato, firma Ed25519, blocco a processo singolo |
| evidence.py | Esportazione completa del registro, derivati, punti di controllo, verifica degli allegati |
| verify.py | Verificatore autonomo e di sola lettura (stdlib + crittografia): archivi, copertura, registri di testimonianza e post dei canali, file di profilo |
| app.py | API autenticata, ciclo di vita, convalida delle richieste, pannello statico |
| profiles.py | Raccoglitori di account multipli, controller di accesso condiviso, ciclo di vita per ogni area di lavoro |
| access.py | Concessioni limitate, controlli delle autorizzazioni, restrizioni IP, limiti di sessione e console di amministrazione |
| proxy_catalog.py | Istantanee dei feed pubblici, controlli sul trasporto, pool di proxy condiviso e selezione basata sullo stato di integrità |
| provenance.py | Identità firmata dell’esecuzione di acquisizione, misurazioni del codice e delle dipendenze |
| network.py | Percorsi convalidati per ogni area di lavoro; stato e prove oscurati; opzioni di trasferimento Telethon |
| sessions.py | Conversione offline in sola lettura degli schemi SQLite di Telethon sottoposti a revisione |
| account_import.py | Rilevamento e normalizzazione in memoria dei file degli account supportati e dei file JSON |
| tdata.py | Lettore ZIP TData moderno e limitato, verifica del checksum e della decrittografia, nessuna estrazione |
| doctor.py | Verifiche di idoneità locali senza raccolta di dati, accesso o installazione di pacchetti |
| download.py | Esportazione in streaming autenticata con lettura limitata e senza sovrascritture |
| monitoring.py | Politica sugli eventi convalidata per ogni area di lavoro e regole relative agli allegati per tipo, condivise tra gli addetti, lo stato e le ricevute firmate |
| scope.py | Ambito di monitoraggio (chat selezionate, cartella Telegram, intero account), tipi di fonti, esclusioni, livelli di ricontrollo |
| dossier.py | Profili degli utenti per ogni chat ricavati dai registri salvati: dati con riferimenti ai registri, SHA-256/pHash degli avatar, estrazione delle menzioni |
| witness_api.py | Token di testimonianza in sola lettura e l’intestazione del registro firmato che essi possono recuperare |
| witness.py | Processo di testimonianza indipendente: chiave e registro propri, controlli di integrità, post del canale firmati, esportazione |
| alerts.py | Notifiche di Apprise e l’elenco delle notifiche del pannello |
| logging_config.py | Registrazione dei log della console e diagnostica a rotazione del server per l’avvio senza interfaccia grafica |
| static/ | Interfaccia reattiva, porta di accesso locale, filtri, dettagli, esportazioni, configurazione dell’account |
| demo.py | Registro sintetico chiaramente identificato come tale, separato dalla raccolta reale |
I gestori di osservazione vengono registrati prima della connessione. La raccolta in tempo reale è regolata dall’ identità del client attivo, dallo stato di esecuzione esplicito, dalle fonti abilitate o dall’ambito di osservazione (le modalità «cartella» o «intero account» aggiungono una nuova chat come fonte al suo primo aggiornamento) e dalla politica relativa agli eventi. I client rifiutati o sostituiti non possono fornire aggiornamenti in tempo reale. Le reazioni grezze e gli aggiornamenti relativi all’appartenenza rispettano i limiti di visibilità. Il contenuto del messaggio in arrivo e il relativo processo multimediale permanente vengono registrati congiuntamente. I processi conservano il descrittore TL originale e associano il suo hash all’ osservazione del messaggio firmata. Le semantiche relative a mittente, modificatore ed eliminatore sono separate.
Ogni area di lavoro accetta un solo account e dispone di una propria directory e di una propria identità di firma. L’area di lavoro principale rimane nella directory radice per motivi di compatibilità; le aree di lavoro aggiuntive risiedono in profiles/<id>/. Un unico token bearer controlla l’intera installazione; le aree di lavoro non costituiscono entità di autorizzazione separate. I blocchi di processo proteggono le directory; i blocchi del database serializzano l’inserimento degli eventi. Ogni aggiunta viene registrata in modo sincrono nel WAL di SQLite con modalità sincrona FULL. I trigger di aggiornamento/cancellazione degli eventi impediscono le normali modifiche da parte delle applicazioni; gli amministratori del filesystem rimangono all’interno del perimetro di fiducia.
L’autorizzazione API avviene tramite un token bearer. Le operazioni di accesso sono serializzate e soggette a limiti temporali. I caricamenti relativi agli account utilizzano un limite dedicato di 12 MiB per il corpo codificato e un limite di 8 MiB per il file decodificato; le normali richieste API mantengono il limite di 16 KiB. La conversione viene eseguita in un thread di lavoro, mantiene i caricamenti in memoria e restituisce l’input normalizzato al browser autenticato. L’accesso tramite QR code prevede un identificatore candidato per ogni area di lavoro, di breve durata, un’attività di attesa e una cancellazione esplicita. Solo l’autorizzazione accettata diventa il client attivo. Telegram FloodWait viene restituito con un valore Retry-After; le credenziali e i messaggi di errore RPC non elaborati non vengono esposti negli errori dell’API. Le esportazioni vengono eseguite al di fuori del ciclo di eventi asincrono e sono serializzate per spazio di lavoro. Trasmettono in streaming un’istantanea di lettura stabile e possono coesistere con le scritture WAL in corso. I collettori dell’area di lavoro condividono il processo/ciclo di eventi.
Le istantanee della cronologia attuale e gli aggiornamenti in tempo reale possono sovrapporsi. Entrambe costituiscono osservazioni distinte, contrassegnate dalla fonte; i duplicati non vengono nascosti automaticamente. Non vengono effettuate inferenze basate su ID mancanti, testo cancellato inventato, enumerazione forzata dei membri o adesione automatica ai gruppi. Non viene implementata alcuna di queste funzionalità.
Per le spiegazioni rivolte agli operatori, si veda come funziona la raccolta nonché gli account e i formati delle sessioni.
La configurazione di rete risiede nel vault crittografato. L’applicazione di un percorso chiude i vecchi client e annulla gli accessi non completati; le connessioni successive utilizzano tale percorso senza alcun fallback diretto. Una nuova installazione con chiave esterna ricava la chiave Fernet di ciascun spazio di lavoro utilizzando HKDF-SHA256 a partire da un file di chiave master e da un salt casuale memorizzato. Ciò protegge le informazioni riservate separatamente dalla directory dei dati, non i contenuti in chiaro del registro o dei file multimediali.
L’accesso alla demo locale utilizza una capacità di processo generata separatamente, mai il token del pannello configurato. L’emissione e l’accettazione richiedono la modalità demo esplicita, una radice sintetica senza spazi di lavoro aggiuntivi o una sessione autorizzata, peer/host in loopback, assenza di intestazioni di inoltro proxy e nessuna richiesta del browser cross-origin. Le API live mantengono l’autenticazione del portatore e rifiutano le modifiche alla raccolta in modalità demo.