Cum construiești un audit trail care rezistă la audit
Tiparele de model de date pentru un audit trail credibil — tabel-umbră, tabele temporale sau event sourcing — și compromisurile fiecăruia.
Tiparele de model de date pentru un audit trail credibil — tabel-umbră, tabele temporale sau event sourcing — și compromisurile fiecăruia.
Acest articol e perspectiva unui inginer care a lucrat sub aceste cerințe, nu consultanță de reglementare. Pentru decizii de conformitate, consultă specialistul vostru de calitate/reglementare.
Într-un articol anterior am descris ce cere reglementarea de la un audit trail. Aici e partea pe care o scrii efectiv: cum arată modelul de date.
Diferența dintre un audit trail care trece un audit și unul care pică nu e volumul de informație. E dacă poți răspunde convingător la o singură întrebare: „de unde știm că înregistrarea asta nu a fost modificată ulterior?“
Minimul util pentru fiecare intrare:
Punctul critic e „valoarea veche“. Un audit trail care spune doar „câmpul X a fost modificat la ora Y“ nu îți permite reconstituirea stării. Iar reconstituirea e exact ce ți se cere.
| Tipar | Cum funcționează | Când merită |
|---|---|---|
| Tabel-umbră | Un tabel _audit paralel, scris prin trigger sau în stratul de acces la date |
Cel mai simplu de adăugat; bun când doar câteva entități sunt reglementate |
| Tabele temporale | Baza de date păstrează automat istoricul rândurilor (system-versioned) | Cost mic, istoricul e ținut de motor — dar nu captează cine și de ce |
| Event sourcing | Starea curentă e derivată dintr-un flux de evenimente imutabile | Cel mai puternic; cost mare de arhitectură — rareori justificat doar pentru audit |
Atenție la rândul din mijloc, pentru că e capcana: tabelele temporale rețin SysStartTime/SysEndTime și nimic despre autor. Ca să satisfaci cerința de „cine“ de mai sus, tot ai nevoie de o coloană de identitate scrisă pe fiecare cale de modificare — exact tiparul fragil despre care avertizez mai jos. În plus, cine are drept de ALTER poate opri versionarea, modifica istoricul și o poate reporni, deci „garantat de motor“ e prea tare spus fără permisiuni strânse.
În practică, pentru sisteme de business, tabelele temporale dau de obicei cel mai bun raport efort/beneficiu — cu condiția să adaugi atribuirea, iar tabelul-umbră rămâne varianta pragmatică atunci când doar o parte din model e reglementată. Event sourcing-ul se alege pentru motive de domeniu, nu ca să bifezi conformitatea.
Un audit trail e credibil dacă e greu de falsificat și se vede că e greu de falsificat.
TRUNCATE, încărcările în bloc și dezactivarea explicită a trigger-ului le ocolesc — iar sub reglementare trigger-ul e el însuși cod care trebuie verificat.app_user, audit trail-ul nu atribuie nimic. Identitatea utilizatorului trebuie transmisă până la nivelul unde se scrie.Opțional, dar valoros: înlănțuire prin hash (fiecare intrare conține hash-ul celei anterioare). Nu previne modificarea, dar o face detectabilă — cu condiția să ancorezi lanțul în afara bazei de date (o amprentă publicată periodic, stocare WORM). Fără ancoră, cine poate rescrie un rând poate recalcula tot lanțul, iar detectabilitatea e zero.
Aici apare tensiunea reală: reglementarea cere păstrare, GDPR cere minimizare și, uneori, ștergere.
Ce funcționează în practică:
Merită știut că GDPR prevede excepții de la ștergere atunci când prelucrarea e necesară pentru respectarea unei obligații legale (art. 17 alin. 3 lit. b) — exact cazul păstrării impuse de reglementare. Nu există un răspuns universal; e o decizie care se ia împreună cu partea juridică. Dar dacă ai scris de la început date sensibile brute în audit trail, opțiunile tale ulterioare sunt foarte limitate.
Un audit trail cam dublează volumul de scrieri, adesea mai mult — un tabel-umbră cu valori vechi și noi, plus indecșii lui, depășește ușor 2×. Ce ajută:
Ultima e subestimată: un audit trail din care nu poți extrage răspunsuri rapid e, practic, inutilizabil la inspecție.
Dacă lucrezi la un sistem unde trebuie să poți dovedi istoria datelor și vrei o a doua opinie pe model, hai să vorbim.
Capgemini — client Waters Corporation
Software Engineer (contract)
iun. 2022 – mai 2023
Cerner Corporation
Software Engineer
oct. 2016 – oct. 2019
Dacă lucrezi la ceva din zona asta, hai să vorbim 30 de minute.
Programează o discuție