L’Invariante
Ogni mutazione è attribuibile e ogni artefatto è verificabile senza fidarsi della piattaforma. L’identità arriva da sessioni autenticate e ruoli dichiarati nel manifest; la catena di audit è hash-linked per tenant; manifest, licenze, batch di ingest e payload di verifica pubblica sono firmati Ed25519 — chiunque abbia la chiave pubblica può controllarli.
Il Contratto
- RBAC engine —
rbac_engine.rolesepermissionsnel manifest mappano ruoli → trigger ammessi. Il diniego è fail-closed (403), applicato dentro la pipeline delle azioni. - Catena di audit — ogni riga di audit porta il
prev_hash;GET /api/v1/audit/verify(edge) e…/tenant/audit/verify,…/admin/audit/verify(Control Plane) ri-validano la catena. - Firme — manifest e licenze di produzione sono firmati con
MANIFEST_PRIVATE_KEY/PLUGIN_PRIVATE_KEY(Ed25519). L’edge verifica controMANIFEST_PUBLIC_KEYS/PLUGIN_PUBLIC_KEYSprima dell’attivazione. Il fallback HMAC esiste solo in sviluppo —NODE_ENV=productionfallisce chiuso senza chiavi Ed25519. - Identità dispositivo — i nodi edge firmano i batch di ingest (
x-edge-signature) con la coppia di chiavi emessa al claim di bootstrap.
Il Flusso
- Un’azione operatore entra in pipeline; l’RBAC confronta i ruoli di sessione con
rbac_engine.permissions. - Al commit la riga di audit viene accodata con l’hash della riga precedente — manomettere un anello invalida la catena.
- Il Control Plane pubblica i manifest dopo aver validato la firma; l’edge verifica prima dello swap
is_active. - I batch di sync arrivano firmati; il Control Plane ri-verifica contro la pubkey registrata del nodo e conserva il batch come evidenza ri-controllabile.
GET /api/v1/public/verify/event/:idpermette a un terzo di verificare un evento committato — senza credenziali tenant.
Esempio di Payload
# Verifica end-to-end della catena di audit tenant (Control Plane)
curl -s https://cp.axiom-trace.eu/api/v1/tenant/audit/verify \
-H "Authorization: Bearer $PORTAL_SESSION"
# → { "ok": true, "checked": 4811, "head": "9f2c…" }
# Oracolo pubblico — verifica la traccia di un singolo evento, senza credenziali
curl -s https://cp.axiom-trace.eu/api/v1/public/verify/event/$EVENT_ID
# → { "valid": true, "chain_depth": 12, … }
I Fallimenti Noti
| Sintomo | Causa |
|---|---|
403 su un operatore legittimo |
Ruolo non presente in permissions per quel trigger — aggiornare il manifest, non il codice |
| Manifest rifiutato al pull | Firma non valida o versione non monotona — ri-firmare con la MANIFEST_PRIVATE_KEY corrente |
verify segnala un anello rotto |
Riga di audit cancellata o riscritta — la catena sta facendo il suo lavoro; investigare il gap |
| L’edge non parte in produzione | Chiavi pubbliche Ed25519 mancanti — il fallback HMAC è solo per sviluppo |