Vai al contenuto

Registro di audit

Il Registro di audit, in Admin → Impostazioni → Registro di audit (/admin/settings?tab=audit-log), risponde alle due domande che una revisione di sicurezza pone a un'istanza che contiene la mappa dell'intero panorama IT: che cosa vi è cambiato e chi ha effettuato l'accesso, e come. È suddiviso in due sotto-schede:

Sotto-scheda URL Che cosa registra
Modifiche /admin/settings?tab=audit-log Ogni scrittura nel panorama — schede, relazioni, rischi, tag, ruoli di stakeholder, bozze di decisione —, raggruppata in batch di modifiche, con le differenze per evento e un Rollback
Sicurezza e amministrazione /admin/settings?tab=audit-log&view=security Accessi e disconnessioni, tentativi falliti, blocchi, sessioni SSO e proxy, eventi relativi alle password, impersonificazione di ruolo e ogni azione amministrativa

Le due sono separate di proposito. Modifiche è uno strumento di lavoro — serve a vedere e annullare una scrittura errata — e conserva una cronologia breve. Sicurezza e amministrazione è una traccia probatoria: le sue voci non si possono modificare né eliminare, e per impostazione predefinita viene conservata per un anno.

Chi può vederlo

Entrambe le sotto-schede richiedono il permesso admin.events («Visualizzare la traccia di audit e il flusso di eventi»), che per impostazione predefinita possiede solo il ruolo Admin. Per dare accesso in lettura a un responsabile della sicurezza o della conformità senza renderlo amministratore, create un ruolo con admin.events in Utenti e ruoli e assegnateglielo.

Modifiche

La sotto-scheda Modifiche è il registro dei batch di modifiche. Ogni scrittura che modifica i dati vi arriva come batch, insieme a chi l'ha eseguita e da dove proviene:

Origine Significato
Web L'interfaccia web di Turbo EA
API Una chiamata diretta all'API REST (uno script, un'integrazione)
Strumento IA Un assistente IA collegato tramite il server MCP
Estensione Un'estensione installata, registrata come batch ext:<key>

Fate clic su un batch per aprirne il pannello: le differenze per evento mostrano il valore precedente e quello nuovo di ogni campo, e Rollback annulla le scritture su schede, relazioni, rischi, ruoli di stakeholder, tag e bozze di decisione che ha effettuato.

I batch vengono conservati per MUTATION_BATCH_RETENTION_DAYS giorni (una variabile d'ambiente, predefinita 15) e poi eliminati automaticamente. Gli eventi stessi restano nella scheda Cronologia di ogni scheda anche dopo che il batch è stato eliminato.

Sicurezza e amministrazione

Registro di sicurezza e amministrazione

La sotto-scheda Sicurezza e amministrazione elenca una voce per ogni azione rilevante per la sicurezza, le più recenti per prime:

  • accessi e disconnessioni, con password, SSO o tramite un reverse proxy attendibile;
  • tentativi di accesso falliti, ciascuno con un codice di motivo che indica perché è fallito;
  • blocchi dell'account dopo errori ripetuti;
  • registrazioni, e password impostate, reimpostate o cambiate;
  • assunzione di ruolo — un amministratore che avvia e interrompe Visualizza come ruolo…;
  • le azioni amministrative — modifiche a utenti, ruoli, impostazioni, metamodello, tag, calcoli, estensioni, importazioni, integrazioni, portali pubblici e diagrammi pubblicati, sondaggi e accesso dell'operatore (vedi Azioni amministrative);
  • le esportazioni di questo stesso registro.

Nella prossima versione

Le esportazioni di dati (esportazioni CSV/JSON dell'inventario, esportazioni del workspace e della migrazione) saranno registrate in questo stesso registro nella prossima versione.

Colonne

Colonna Descrizione
Quando Data e ora dell'azione
Categoria auth (autenticazione), admin (azioni amministrative) o access (esportazioni e altri accessi ai dati)
Azione Che cosa è successo, ad esempio auth.login.failed — vedere il catalogo delle azioni
Esito Riuscito o Non riuscito
Attore L'utente connesso che ha eseguito l'azione. Vuoto quando nessuno era connesso — ad esempio in un accesso fallito
Soggetto L'account a cui si riferiva l'azione — l'indirizzo email digitato in un accesso fallito, o l'utente la cui password è stata reimpostata
Destinazione L'oggetto su cui si è agito, se presente — ad esempio il ruolo scelto all'avvio di un'assunzione di ruolo
IP L'indirizzo IP del client (vedere Indirizzo IP del client)
Origine Da dove proveniva la richiesta: web, API, strumento IA, estensione, ops o sistema
Ruolo assunto Quando un amministratore stava visualizzando l'app come un altro ruolo, quel ruolo. L'attore resta l'amministratore reale

Le colonne si possono mostrare, nascondere, riordinare e bloccare come in qualsiasi altra tabella di dati; Quando e Azione sono sempre visibili.

Filtri

La barra dei filtri a sinistra restringe l'elenco per categoria, esito, azione, attore, indirizzo IP e intervallo di date. Ogni intestazione di sezione indica quanti valori sono selezionati, e la barra compressa mostra il numero di filtri attivi. La scheda Colonne della stessa barra mostra, nasconde e blocca le colonne. I filtri e la disposizione delle colonne vengono ricordati in questo browser.

Una ricerca per indirizzo email trova corrispondenze nell'attore, nel soggetto e nella destinazione, così un solo indirizzo trova sia ciò che quella persona ha fatto sia ciò che è stato tentato contro il suo account.

Dettagli di una voce

Fate clic su una riga per aprire il pannello della voce. Mostra ogni campo, compreso lo user agent del browser e i dettagli registrati con la voce — il codice di motivo di un accesso fallito, l'ora in cui termina un blocco, il provider di identità di un accesso SSO. Quando una voce registra una modifica, i dettagli appaiono come tabella dei valori precedenti e nuovi. I segreti non vengono mai memorizzati: una password, un token o un client secret viene sostituito con *** prima che la voce venga scritta.

Le informazioni che inquadrano una modifica senza farne parte — l'indirizzo attuale di un portale e se è pubblicato, se le credenziali di una connessione sono state sostituite, i tipi coperti da una mappatura di migrazione — sono elencate in Contesto, sotto la tabella.

Il pannello non offre azioni. Le voci non si possono modificare né eliminare.

Esporta CSV

Esporta CSV, nella barra degli strumenti, scarica le voci che corrispondono ai filtri attuali come file CSV, fino a 50 000 righe. L'esportazione stessa viene registrata, come access.audit_log.exported, così un'esportazione del registro di sicurezza lascia sempre una traccia al suo interno.

Catalogo delle azioni

Azione Registrata quando
auth.login.succeeded un utente accede con email e password
auth.login.failed un accesso con password viene rifiutato. Il codice di motivo indica perché (vedere sotto)
auth.login.locked il quinto tentativo fallito consecutivo blocca l'account per 15 minuti. I dettagli riportano l'ora in cui termina il blocco
auth.logout un utente connesso si disconnette. Una disconnessione senza una sessione valida non registra nulla
auth.sso.succeeded un utente accede tramite un provider SSO. I dettagli riportano il provider, il subject del provider di identità e se l'account è stato creato da questo accesso
auth.sso.failed un accesso SSO viene rifiutato — un dominio non consentito, un indirizzo email mancante, un account locale con la stessa email, un account inattivo. I dettagli riportano il provider e il motivo
auth.proxy_session.succeeded un utente accede tramite un reverse proxy attendibile
auth.proxy_session.failed un accesso tramite il reverse proxy viene rifiutato
auth.register un utente crea un account tramite l'auto-registrazione
auth.password.set un utente invitato imposta la sua prima password
auth.password.reset_requested Qualcuno richiede un'e-mail di reimpostazione della password. Registrato sempre come successo con l'indirizzo digitato, così la risposta non rivela nulla; i dettagli indicano se un account corrispondeva e se è stata inviata un'e-mail
auth.password.reset una password viene cambiata tramite un link di reimpostazione
auth.password.changed un utente connesso cambia la propria password
auth.impersonation.started un amministratore avvia Visualizza come ruolo…. La destinazione è il ruolo scelto
auth.impersonation.stopped l'amministratore torna al proprio ruolo
access.audit_log.exported qualcuno esporta il registro di sicurezza in CSV

Codici di motivo di auth.login.failed:

Motivo Significato
unknown_user Nessun account ha quell'indirizzo email
sso_account L'account accede tramite SSO e non ha password
no_password L'account non ha ancora una password — un invito mai accettato
locked L'account è bloccato dopo errori ripetuti
bad_password La password è errata
inactive L'account è disattivato

Codici di motivo di auth.sso.failed, auth.proxy_session.failed, auth.password.set e auth.password.reset:

Motivo Significato
expired L'accesso a tempo limitato dell'account è terminato
hd_mismatch L'account Google appartiene a un dominio non consentito
no_email Il provider di identità non ha restituito alcun indirizzo e-mail
no_subject Il provider di identità non ha restituito alcun identificativo del soggetto
local_account Un account locale con password usa già quell'e-mail
no_account Non esiste alcun account e gli account non vengono creati automaticamente
exchange_failed Il provider di identità non ha completato l'accesso
unauthenticated Il proxy inverso non ha autenticato la richiesta
identity_rejected L'identità inoltrata è stata rifiutata (dominio o e-mail non verificata)
invalid_token Il collegamento di invito o di reimpostazione non era valido o è scaduto

Una raffica di errori unknown_user da un unico indirizzo IP è l'aspetto di un attacco di password spraying; una serie di bad_password contro un account seguita da auth.login.locked è un tentativo di indovinare la password di quell'account.

Azioni amministrative

Ogni modifica che un amministratore apporta alla configurazione dell'istanza viene registrata nella categoria admin. L'attore è l'amministratore, il destinatario è l'oggetto modificato — un utente, un ruolo, un'impostazione, un tipo di scheda — con il nome che aveva in quel momento, e i dettagli indicano cosa è cambiato come valori vecchi e nuovi, limitati ai campi effettivamente modificati. Per ogni voce valgono due regole:

  • I segreti sono mascherati. Una password SMTP, un client secret SSO, una chiave del fornitore di IA, una credenziale ServiceNow o qualsiasi altro valore segreto viene scritto come ***: la voce mostra che è cambiato, mai cosa era o cosa è diventato.
  • Non vengono mai memorizzati il testo di una licenza né una credenziale. Una licenza di estensione viene identificata, non copiata, e una password che un amministratore imposta per un utente viene registrata come modificata, mai con il suo valore.

Un salvataggio che non cambia nulla non viene registrato, né lo è un utente che modifica il proprio nome o la propria lingua nel profilo. La configurazione voluminosa — i campi, le traduzioni o il layout di un tipo di scheda, i filtri di un portale — viene riassunta dalla sua dimensione anziché copiata; quando la dimensione non è cambiata, si aggiunge una breve impronta del contenuto, così la voce mostra comunque che qualcosa è cambiato. Le sostituzioni dei permessi per ruolo di un tipo di scheda fanno eccezione: ogni cella modificata è elencata con il valore vecchio e quello nuovo, dove un valore vuoto indica che vale il permesso del ruolo stesso.

Area Azioni Cosa viene registrato
Utenti e ruoli admin.user.created, .updated, .deleted, .bulk_updated, .bulk_deleted, .unlocked; admin.user.invitation.resent, .deleted; admin.role.created, .updated, .archived, .restored; admin.stakeholder_role.created, .updated, .deleted, .archived, .restored Account creati, modificati, attivati o disattivati, eliminati (singolarmente o in blocco) e sbloccati, con i campi modificati — ruolo, e-mail, nome, stato attivo; inviti inviati di nuovo o revocati; ruoli applicativi e ruoli stakeholder per tipo, con i permessi concessi o revocati
Impostazioni admin.settings.updated Una voce per ogni impostazione salvata — e-mail, autenticazione e SSO, registrazione, IA, MCP, lingue, attivazione dei moduli, branding, logo e favicon, periodi di conservazione. Il destinatario è l'impostazione; i dettagli sono il suo valore vecchio e nuovo, con i segreti mascherati
Metamodello admin.metamodel.type.* (including .references_generated), admin.metamodel.relation_type.*, admin.metamodel.resource_type.*, admin.principle.* (including .imported), admin.regulation.* Tipi di scheda, tipi di relazione e tipi di risorsa creati, modificati, eliminati o ripristinati, con le proprietà modificate; riferimenti delle schede generati per un tipo; principi EA, compresi quelli importati dal catalogo; normative di conformità
Tag e calcoli admin.tag_group.*, admin.tag.*, admin.calculation.* Gruppi di tag e tag; campi calcolati creati, modificati, eliminati, attivati o disattivati, con la formula vecchia e quella nuova, e l'esecuzione di un calcolo su tutte le schede (.recalculated)
Estensioni admin.extension.install.uploaded, .applied, .discarded; admin.extension.store.claimed, .refreshed, .installed; admin.extension.enabled, .disabled, .uninstalled; admin.extension.license.updated, .removed Pacchetti caricati, installati o scartati; licenze e download dallo store delle estensioni; estensioni abilitate, disabilitate e disinstallate; la licenza sostituita o rimossa — con l'estensione e la sua versione, mai il testo della licenza
Trasferimento workspace e migrazione admin.workspace.import.uploaded, .applied, .completed, .discarded; admin.migration.uploaded, .field_mappings.updated, .applied, .deleted Un pacchetto workspace caricato, la sua importazione avviata, completata o scartata; una migrazione di piattaforma caricata, le sue mappature dei campi modificate, applicata o eliminata
Integrazioni admin.servicenow.connection.*, admin.servicenow.mapping.*, admin.servicenow.sync.pulled, .pushed, .applied Connessioni ServiceNow, con le credenziali mascherate, e mappature; ogni pull, push e applicazione dei record in staging
Esposizione pubblica admin.web_portal.created, .updated, .deleted; admin.diagram.published, .unpublished Portali web e diagrammi pubblicati — tutto ciò che rende i dati raggiungibili senza un account
Sondaggi admin.survey.sent, admin.survey.closed Un sondaggio inviato ai destinatari, o chiuso
Accesso dell'operatore admin.ops.rescue_access.granted, .revoked Accesso di emergenza concesso o revocato tramite l'API operativa, registrato accanto agli eventi ops.* esistenti

Che cosa non viene registrato

  • Il rinnovo del token. L'app web rinnova la sessione a intervalli regolari, quindi ogni scheda aperta aggiungerebbe voci e nessuna avrebbe significato.
  • Le richieste rifiutate per un token di sessione scaduto o non valido. Si verificano ogni volta che una sessione termina normalmente.
  • Le letture dei feed OData. Excel e Power BI interrogano il feed OData di una vista salvata secondo una pianificazione, quindi ogni aggiornamento aggiungerebbe una voce.
  • Il semplice accesso in lettura — aprire una scheda, eseguire un report, cercare nell'inventario.

Conservazione

Le voci vengono conservate per 365 giorni per impostazione predefinita. Modificate il valore in Admin → Impostazioni → Generale → Gestione dei dati → Conservazione del registro di sicurezza: qualsiasi numero di giorni fino a 3650, oppure 0 per conservare le voci per sempre. Un processo elimina ogni notte le voci più vecchie del periodo e rilegge l'impostazione a ogni esecuzione, quindi una modifica ha effetto senza riavvio.

Quel processo di conservazione è l'unica cosa che elimini mai una voce. Non esiste alcuna azione di modifica o eliminazione nell'interfaccia o nell'API, per nessun ruolo.

Il registro non fa parte, di proposito, del Trasferimento del workspace: è la cronologia di sicurezza di questa istanza, non contenuto del workspace, e clonare un'istanza non lo copia.

Il flusso di audit JSON

Il backend scrive inoltre ogni voce come una riga JSON sul logger turbo_ea.audit, nello stesso momento in cui la memorizza. Il backend registra sullo standard output, quindi il flusso raggiunge qualunque sistema raccolga già i log dei container — docker compose logs backend, la raccolta dei log di Kubernetes o qualsiasi agente di invio verso un SIEM —, senza alcuna configurazione in Turbo EA:

docker compose logs -f backend | grep turbo_ea.audit

La riga viene scritta nel momento in cui la voce è registrata. Se la transazione della richiesta fallisce in seguito, la riga esiste senza record: la tabella è il registro, il flusso è il feed in tempo reale.

Ogni riga riporta gli stessi campi della voce:

Campo Contenuto
audit_id, created_at L'identificativo della voce e il momento in cui è stata scritta
category, action, outcome Che cosa è successo e se è riuscito
actor_user_id, actor_email Chi l'ha fatto
subject_email L'account interessato
target_type, target_id, target_label Su che cosa ha agito
ip, user_agent Il client
origin web, api, mcp, ext, ops o system
impersonator_user_id, impersonated_role Valorizzati mentre un amministratore visualizza l'app come un altro ruolo
details Codici di motivo e valori precedenti/nuovi, con i segreti già mascherati

Inviare il flusso a un archivio centrale dei log ne conserva una copia fuori dall'istanza, lontano dalla portata di chiunque possa amministrarla — ciò di cui ha bisogno una revisione delle minacce interne. Vedere Log e flusso di audit per raccoglierlo.

Indirizzo IP del client

La colonna IP registra l'indirizzo del client, non quello del proxy davanti al backend. L'nginx di frontiera incluso imposta l'intestazione X-Real-IP sull'indirizzo da cui ha ricevuto la connessione, e il backend legge quell'intestazione perché l'immagine backend pubblicata imposta TRUST_PROXY_HEADERS=true. Un valore che non è un indirizzo IP valido viene scartato anziché registrato.

  • Lasciate TRUST_PROXY_HEADERS attivo finché ogni richiesta raggiunge il backend attraverso l'nginx incluso — lo stack predefinito, il chart Helm e i modelli per container gestiti funzionano tutti così.
  • Disattivatelo (TRUST_PROXY_HEADERS=false) se esponete direttamente il container del backend, senza l'nginx incluso davanti: un client potrebbe allora inviare il proprio X-Real-IP e scegliere l'indirizzo registrato.
  • Dietro un altro bilanciatore di carico, l'nginx incluso vede l'indirizzo di quel bilanciatore, e ogni voce registra quello. Un'impostazione che permetta a nginx di fidarsi dell'indirizzo del client inoltrato dal vostro bilanciatore di carico (NGINX_TRUSTED_PROXIES) è prevista in una versione successiva.