Skip to content

GLog — Specificație Tehnică Completă

Serviciul de Audit și Jurnalizare GovStack (Building Block PaaS) · succesorul MLog · cod arhitectură JLS Document unic, coerent: scop → actori → cazuri de utilizare → sistemul ca acțiuni → colectarea datelor → API → afișarea/consumul datelor → interfața utilizator → model de date → cerințe (tabelar, trasabile la ADR).

Public țintă dublu: (1) echipa de dezvoltare GLog — urmărirea cerințelor în implementare; (2) echipele altor sisteme — cunoașterea capacităților GLog pentru a-și planifica integrarea.

CâmpValoare
DocumentSpecificație Tehnică Completă
SistemGLog — Serviciul de Audit și Jurnalizare
Versiune0.1 (draft, în lucru)
AutorEsempla Systems · GovStack
Data2026-06-25
Cod / repogovtech/gstack/glog (GitLab)
ADR-uriGLog-ADR-001 … GLog-ADR-010
Legendă stare✅ implementat & testat · 🟡 de finalizat · ⛔ blocat (dependență externă)

GLog este componenta comună (Building Block) de audit și jurnalizare a platformei GovStack. Orice sistem informațional de stat îi trimite evenimente de audit (cine, ce, când, în ce sistem, asupra cărui obiect), iar GLog le validează, le sigilează tamper-evident, le stochează izolat per sistem (multi-tenant), le redirecționează către sisteme externe (MLog, OpenSearch, SIEM) și le reține conform politicii. GLog este succesorul compatibil al MLog (HG 708/2014).

Astăzi auditul e fie o bibliotecă in-process (blochează tranzacția de business, single-tenant, fără integritate verificabilă), fie un microserviciu izolat fără retenție și fără izolare. GLog îl înlocuiește cu un serviciu PaaS reutilizabil: 1 BB pentru N sisteme, zero duplicare.

1.3 Pentru cine (și cum se citește documentul)

Section titled “1.3 Pentru cine (și cum se citește documentul)”
  • Dezvoltatorii GLog citesc tot, urmăresc §11–§12 (cerințe tabelare + trasabilitate ADR) ca listă de lucru.
  • Sistemele integratoare citesc §3 (capacități), §6 (colectarea datelor), §7 (API), §8 (consumul datelor) — de aici își planifică integrarea înainte ca GLog să intre în producție.

1.4 Capacitatea de planificare pentru alte sisteme

Section titled “1.4 Capacitatea de planificare pentru alte sisteme”

Acest document este contractul de capacitate publicat pe portal. Pe baza lui, un sistem consumator poate decide: ce mod de ingest folosește (REST/AMQP/Kafka/SDK), ce câmpuri trimite, cum citește/verifică auditul, ce SLA-uri să aștepte — fără a aștepta lansarea în producție. Stările (✅/🟡) indică ce e deja disponibil în mediile de test și ce urmează.


ActorTipRol față de GLog
Sistem SaaS consumator (.NET / Java)sistemProduce evenimente de audit; consumă date de audit
Broker de evenimente (RabbitMQ / Kafka)sistemSursă asincronă de evenimente
Operator platformă GovStackumanAdministrează nomenclatoare, retenție, tenanți
Auditor / organ de controlumanVerifică integritatea; consultă evenimentele autorizate
Keycloak (ATS)sistemEmite JWT (scope + claim tenant)
MLog / OpenSearch / SIEMsistemDestinații de forward

Scope-uri (roluri tehnice): audit:write (scriere), audit:read (citire), audit:admin (administrare), audit:admin:cross-tenant (operatori platformă).


3. Capacitățile sistemului (rezumat pentru integratori)

Section titled “3. Capacitățile sistemului (rezumat pentru integratori)”

Ce poate face un sistem consumator cu GLog:

#CapacitateCum o acceseazăStare
C1Trimite evenimente de audit sincronREST POST /api/v1/app/audit-events✅
C2Trimite evenimente în lotREST :batch (max 500)🟡
C3Trimite evenimente asincron, volum mareAMQP (RabbitMQ)✅
C4Trimite evenimente prin streamingKafka consumer🟡
C5Integrează prin pachet, cu buffer localSDK NuGet (.NET) / Nexus (Java)🟡
C6Citește/filtrează auditul propriuREST GET /api/v1/app/audit-events (paginat)✅
C7Vede detaliul unui evenimentREST GET …/audit-events/{id}✅
C8Exportă auditul (CSV/XLSX)REST …/export🟡
C9Verifică integritatea (tamper-evidence)REST GET …/admin/audit-events/integrity✅
C10Primește auditul redirecționat (SIEM/OpenSearch)Webhook / index✅
C11Rămâne compatibil cu MLogForward MLog (JOSE/mTLS)⛔ (schema MLog)

Garanție de izolare: un sistem vede și interoghează doar evenimentele propriului tenant_id.


Fiecare UC: actor · precondiții · flux · postcondiții · reguli · ADR · stare.

UC-01 — Înregistrare eveniment (REST, sincron) ✅

Section titled “UC-01 — Înregistrare eveniment (REST, sincron) ✅”
  • Actor: sistem consumator. Precondiții: token audit:write valid; tenant_id din claim.
  • Flux: 1) trimite POST /api/v1/app/audit-events cu câmpurile universale + details. 2) GLog validează schema. 3) verifică tenant_id (claim == payload). 4) verifică Idempotency-Key. 5) calculează entry_hash. 6) persistă. 7) programează forward conform strategiei.
  • Postcondiții: eveniment persistat, sigilat (hash), răspuns 201 + Location + entry_hash.
  • Reguli: RB-validare, RB-tenant, RB-idempotență. ADR: [GLog-ADR-001], [GLog-ADR-005].

UC-02 — Înregistrare în lot (batch) 🟡

Section titled “UC-02 — Înregistrare în lot (batch) 🟡”
  • Actor: sistem consumator. Flux: POST …:batch cu max 500 evenimente; răspuns 202 + sumar {accepted, rejected[], idempotent_hits}. ADR: [GLog-ADR-005].
  • Actor: sistem/broker. Flux: publică pe exchange audit.events; GLog consumă, sigilează, persistă; mesaj invalid → DLX (fără pierdere). ADR: [GLog-ADR-005].
  • Flux: GLog consumă din topic; commit offset după persistare. ADR: [GLog-ADR-005].

UC-05 — Publicare prin SDK (buffer + retry) 🟡

Section titled “UC-05 — Publicare prin SDK (buffer + retry) 🟡”
  • Flux: client.publish(event); SDK validează local, bufferează, expediază (mod AUTO: REST sincron / AMQP async); la indisponibilitate, persistă local până la confirmare. ADR: [GLog-ADR-008].
  • Actor: sistem/auditor (audit:read). Flux: GET …/audit-events?from&to&object_type&action_type&severity&idnp&q&page&size; răspuns paginat {items, page, size, total}, doar pentru tenant-ul propriu. ADR: [GLog-ADR-009].
  • Flux: GET …/audit-events/{id} → evenimentul + details JSONB. ADR: [GLog-ADR-001].
  • Flux: GET …/export?…&format=csv|xlsx → flux de date coerent cu filtrul.
  • Actor: auditor/operator (audit:admin). Flux: GET …/admin/audit-events/integrity?tenant_id&from&to&object_type; GLog recalculează lanțul → {entriesChecked, chainBreaks[], lastVerifiedAt}. ADR: [GLog-ADR-002].
  • Actor: operator (audit:admin). Flux: CRUD pe audit_object_type și audit_action_type (cu strategy LOCAL/MLOG/ALL/NONE), per tenant, fără re-deploy. ADR: [GLog-ADR-006].

UC-32 — Gestiune politici de retenție 🟡

Section titled “UC-32 — Gestiune politici de retenție 🟡”
  • Flux: CRUD audit_retention_policy (retain_for_days, on_expiry); job nightly aplică politica. ADR: [GLog-ADR-007].

UC-33 — Acces cross-tenant (operator platformă) ✅

Section titled “UC-33 — Acces cross-tenant (operator platformă) ✅”
  • Flux: cu scope audit:admin:cross-tenant, citire/operații peste tenanți; orice acces e jurnalizat. Fără scope → 403. ADR: [GLog-ADR-003].

UC-40/42 — Forward și replay ✅ (MLog ⛔)

Section titled “UC-40/42 — Forward și replay ✅ (MLog ⛔)”
  • Flux: după persistare, conform strategy, GLog trimite la sinkuri (Webhook/SIEM/OpenSearch ✅; MLog JOSE/mTLS ⛔); eșec → outbox + retry; POST …/admin/audit-events/forward/replay reia. ADR: [GLog-ADR-006].

5. Sistemul ca acțiuni (comportamentul intern)

Section titled “5. Sistemul ca acțiuni (comportamentul intern)”

Ce face GLog cu fiecare eveniment, ca secvență de acțiuni:

#Acțiune a sistemuluiDescriereADRStare
A1AutentificăValidează JWT (scope + aud=glog) sau cert/mTLS[GLog-ADR-004]✅
A2Validează schemaCâmpuri universale obligatorii prezente și corecte[GLog-ADR-001]✅
A3Verifică tenantultenant_id din claim == din payload, altfel 403[GLog-ADR-003]✅
A4DeduplicăIdempotency-Key în fereastra de 24h[GLog-ADR-005]✅
A5Sigileazăentry_hash = SHA-256(prev_hash ‖ payload ‖ ts ‖ tenant_id), lanț per (tenant, object_type)[GLog-ADR-002]✅
A6PersistăScrie în PostgreSQL (details JSONB), setează received_at, ingestion_source[GLog-ADR-001]✅
A7RedirecționeazăConform strategy: scrie în outbox, dispatch async la sinkuri[GLog-ADR-006]✅ (MLog ⛔)
A8Reține / expirăJob programat aplică politica de retenție (DELETE/ARCHIVE)[GLog-ADR-007]🟡
A9Verifică integritateaLa cerere, recalculează lanțul și raportează rupturile[GLog-ADR-002]✅
A10Auto-jurnalizeazăAcțiunile de administrare proprii sunt și ele audit[GLog-ADR-001]✅

GLog acceptă același eveniment prin patru căi; alegerea ține de profilul sistemului consumator.

POST /api/v1/app/audit-events — pentru volum mic/mediu și confirmare imediată.

{
"tenant_id": "eintegritate",
"event_timestamp": "2026-06-25T08:30:00Z",
"object_type": "INSPECTOR",
"action_type": "UPDATE_INSPECTOR",
"object_affected": "12345",
"severity": "INFO",
"event_category": "BUSINESS",
"idnp": "2002004012345",
"user_details": "Ion Popescu",
"ip_address": "10.1.2.3",
"correlation_id": "req-abc-123",
"view_link": "/inspectors/12345",
"details": { "event": "EDIT_INSPECTOR", "component": "registry",
"action": "UPDATE", "detail": { "before": {}, "after": {} } }
}

Antete: Authorization: Bearer <JWT>, Idempotency-Key, X-Correlation-Id, Accept-Language: ro|ru. Răspuns: 201 Created + Location: /api/v1/app/audit-events/{id} + corpul cu entry_hash.

POST /api/v1/app/audit-events:batch — listă (max 500), răspuns 202 + sumar.

Exchange audit.events (topic, durabil), routing tenant.{id}.{object_type}.{severity}, coadă audit.ingest + DLX audit.ingest.dlx. Mesaj = același JSON ca la REST. Pentru volum mare, non-blocant.

Consumer pe topic configurat; commit offset după persistare.

Esempla.Audit.Client (NuGet) și md.gov:audit-client (Nexus/Maven): buffer local + retry, mod AUTO (REST sincron pentru acțiuni user, AMQP pentru evenimente de sistem). SDK-ul nu duplică logica; doar formatează, validează local și expediază.


Conform Standardului API GovStack: api/v{N} + zone, erori RFC 7807, endpoint-uri operaționale.

MetodăCaleZonăScopeDescriereStare
POST/api/v1/app/audit-eventsappaudit:writeingest unitar✅
POST/api/v1/app/audit-events:batchappaudit:writeingest în lot🟡
GET/api/v1/app/audit-eventsappaudit:readlistă paginată✅
GET/api/v1/app/audit-events/{id}appaudit:readdetaliu✅
GET/api/v1/app/audit-events/exportappaudit:readexport CSV/XLSX🟡
GET/api/v1/admin/audit-events/integrityadminaudit:adminverificare lanț✅
POST/api/v1/admin/audit-events/forward/replayadminaudit:adminreplay outbox✅
CRUD/api/v1/admin/audit-object-typesadminaudit:adminnomenclatoare obiect✅
CRUD/api/v1/admin/audit-action-typesadminaudit:adminnomenclatoare acțiune + strategy✅
CRUD/api/v1/admin/audit-retention-policiesadminaudit:adminpolitici retenție🟡

7.2 Endpoint-uri operaționale (publice) ✅

Section titled “7.2 Endpoint-uri operaționale (publice) ✅”

/health/live · /health/ready · /metrics (Prometheus) · /info · /api/v1/openapi.json (OpenAPI 3.1).

  • OAuth2 Resource Server (Keycloak), JWT aud=glog, scope-uri audit:*.
  • mTLS / certificat pentru integratori care cer auth pe bază de certificat (și forward MLog).
  • tenant_id derivat din claim; scriere cu tenant ≠ claim → 403. ADR: [GLog-ADR-004].
  • Erori RFC 7807 (application/problem+json + correlationId).
  • Paginare ?page&size → plic {items, page, size, total}.
  • Idempotență Idempotency-Key; corelare X-Correlation-Id; i18n Accept-Language: ro|ru; date ISO 8601 UTC.
  • Contract OpenAPI 3.1 publicat (generare clienți) + AsyncAPI pentru AMQP/Kafka.

Cum scot datele sistemele consumatoare/auditorii:

MetodăDescriereMecanismStare
Listare/filtraredupă perioadă, tip obiect/acțiune, severitate, IDNP, text liberGET …/audit-events paginat; căutare full-text trigram în Postgres✅
Detaliuun eveniment + payload detailsGET …/audit-events/{id}✅
Exportextras pentru raportare/arhivă`…/export?format=csvxlsx` (streaming)
Verificare integritatedovadă tamper-evidence pe un interval…/admin/audit-events/integrity → chain breaks✅
Forward (push)livrare automată către SIEM/OpenSearch/MLogwebhook / index / MLog✅ (MLog ⛔)
Back-link în UI-ul apelantuluiview_link readuce la obiectul vizat în sistemul-sursăcâmp view_link în eveniment✅

Căutare: implicit Postgres trigram (fără dependență de Elasticsearch); OpenSearch opțional ca sink pentru căutare avansată. ADR: [GLog-ADR-009].


9.1 Principiu (v1 headless → admin portal)

Section titled “9.1 Principiu (v1 headless → admin portal)”

GLog v1 este headless (doar API); UI-urile consumatoare folosesc API-ul. Un portal de administrare comun (Angular, conform GovStack Design System / UDS) se adaugă într-o fază ulterioară. Cerințele UI de mai jos sunt specificate acum ca echipa de dezvoltare să planifice, dar nu sunt livrate în v1. ADR: [GLog-ADR-010].

9.2 Ecrane ale portalului de administrare (planificate)

Section titled “9.2 Ecrane ale portalului de administrare (planificate)”
EcranFuncțieRolStare
Event Browsercăutare/filtrare/detaliu/export evenimenteaudit:read🟡
Integrity Dashboardrulează verificarea integrității, afișează rupturile de lanțaudit:admin🟡
Nomenclatoaregestiune object/action types (cu strategy)audit:admin🟡
Politici de retențieconfigurare retain_for_days / on_expiry per tip obiectaudit:admin🟡
Monitor forward / outboxstare livrări, replay manualaudit:admin🟡
Gestiune tenanțitenanți, sinkuri active (operatori platformă)audit:admin:cross-tenant🟡
IDCerință UINivelStare
UI-01Interfață în RO și RU; fără text hardcodatMUST🟡
UI-02Conformitate WCAG 2.1 AA pe fluxurile principaleSHOULD🟡
UI-03Vizibilitatea acțiunilor/datelor controlată de RBAC (scope-uri)MUST🟡
UI-04Aliniere la GovStack Design System (UDS) — componente comuneSHOULD🟡
UI-05Filtre persistente + paginare + sortare în Event BrowserMUST🟡
UI-06Indicarea vizuală a rupturilor de integritate (roșu)MUST🟡

10.1 Eveniment de audit — câmpuri universale

Section titled “10.1 Eveniment de audit — câmpuri universale”
CâmpTipOblig.Rol
idUUID v7dacheie, sortare naturală
tenant_idvarchar(64)dace sistem
event_timestamp / received_attimestamptzdacând s-a produs / când a fost recepționat
ingestion_sourceenum(REST,AMQP,KAFKA,EMBEDDED)dacalea de intrare
object_type / action_typevarchar(64)dace
object_affectedvarchar(255)nuobiectul vizat
event_category / severityenumnuclasificare
idnp / user_details / ip_addressvarcharcond.cine / de unde
correlation_id / view_linkvarcharnucorelare / back-link
detailsJSONBnupayload abstract specific aplicației
prev_hash / entry_hashchar(64)dalanț de integritate (prev_hash genesis la primul element)
  • audit_object_type (code, tenant_id) — tipuri de obiect per tenant.
  • audit_action_type (code, tenant_id, strategy ∈ {LOCAL,MLOG,ALL,NONE}) — tipuri de acțiune + strategie forward.
  • audit_retention_policy (tenant_id, object_type, retain_for_days, on_expiry, archive_target).
  • audit_forward_outbox (audit_event_id, sink, status ∈ {PENDING,SENT,ERROR}, attempts, next_attempt_at).

ADR: [GLog-ADR-001] (model), [GLog-ADR-006] (strategy), [GLog-ADR-007] (retenție).


11. Cerințe funcționale (tabelar, trasabile la ADR)

Section titled “11. Cerințe funcționale (tabelar, trasabile la ADR)”
IDCerințăNivelUCADRStare
FR-001Ingest REST unitar (201 + entry_hash)MUSTUC-01ADR-001/005✅
FR-002Ingest REST batch (max 500, 202 + sumar)MUSTUC-02ADR-005🟡
FR-003Ingest AMQP (RabbitMQ) + DLXMUSTUC-03ADR-005✅
FR-004Ingest Kafka (consumer)SHOULDUC-04ADR-005🟡
FR-005SDK NuGet/.NET + Nexus/Java (buffer + retry, AUTO)MUSTUC-05ADR-008🟡
FR-006Model eveniment: universal + payload JSONBMUSTUC-01/11ADR-001✅
FR-007Idempotență (Idempotency-Key, 24h)MUSTUC-01ADR-005✅
FR-008Multi-tenancy (claim JWT; izolare scriere+citire)MUSTUC-33ADR-003✅
FR-009Integritate hash chain per (tenant, object_type)MUSTUC-20ADR-002✅
FR-010Endpoint verificare integritateMUSTUC-20ADR-002✅
FR-011Listare/filtrare paginatăMUSTUC-10ADR-009✅
FR-012Detaliu evenimentMUSTUC-11ADR-001✅
FR-013Export CSV/XLSXMUSTUC-12ADR-009🟡
FR-014Forward Webhook (SIEM/OpenSearch) + outbox + replayMUSTUC-40/42ADR-006✅
FR-015Forward MLog (JOSE + mTLS)MUSTUC-40ADR-006⛔
FR-016Retenție configurabilă + jobMUSTUC-32ADR-007🟡
FR-017Nomenclatoare (object/action types + strategy)MUSTUC-30/31ADR-006✅
FR-018Acces cross-tenant (operatori platformă)MUSTUC-33ADR-003✅
FR-019Auth token + Keycloak + cert/mTLSMUSTtoateADR-004✅
FR-020Conformitate Standard API (zone, RFC7807, operațional)MUST§7ADR-004✅
FR-021Portal de administrare (ecrane §9.2)SHOULD§9ADR-010🟡

12. Cerințe non-funcționale (tabelar, trasabile la ADR / CU)

Section titled “12. Cerințe non-funcționale (tabelar, trasabile la ADR / CU)”
IDCerințăȚintă / parametruCU / ADRStare
NFR-01Latență ingest REST (p95)< 100 msCU-PERF-001✅
NFR-02Latență procesare AMQP (p95)< 500 msCU-PERF-001✅
NFR-03Debit≥ 5.000 ev/s/instanțăCU-PERF-001🟡
NFR-04Disponibilitate ingest99,9% / lună; ≥ 3 repliciCU-AVAIL-001🟡
NFR-05Securitate transportTLS ≥ 1.2; secrete în VaultCU-SEC-001/002✅
NFR-06Date personale (IDNP)minimizare; cifrare la repaus; acces auditatCU-PD-001/003🟡
NFR-07Observabilitateloguri JSON + correlation-id; /metrics; tracingCU-OBS-001/002/003✅
NFR-08PersistențăPostgres per-serviciu; migrări expand/contractCU-DATA-001✅
NFR-09DeployGitLab CI/CD; rolling/blue-green + rollback; K8sCU-DEPLOY/K8S🟡
NFR-10i18n nomenclatoareRO/RU/ENCU-I18N-001✅

13. Trasabilitate (cerință → ADR → criteriu → test → stare dezvoltare)

Section titled “13. Trasabilitate (cerință → ADR → criteriu → test → stare dezvoltare)”
CerințăADRCriteriu de acceptanță (rezumat)Caz de testStare
FR-001ADR-001/005POST valid → 201 + entry_hash, p95 < 100 msTC-GLOG-01✅
FR-003ADR-005mesaj invalid AMQP → DLX, fără pierdereTC-GLOG-03✅
FR-008ADR-0032 tenanți → niciun query nu vede celălalt tenantTC-GLOG-MT✅
FR-009/010ADR-002UPDATE direct în DB → chain_breaks ≥ 1 în < 1 sTC-GLOG-20✅
FR-014ADR-006sink down → outbox; replay → SENTTC-GLOG-40✅
FR-015ADR-006export către MLog compatibil (zero-diff)TC-GLOG-MIG⛔
FR-016ADR-007retenție aplicată; integritate păstrată după purgeTC-GLOG-32🟡
FR-019ADR-004fără scope → 401/403; cu scope → okTC-GLOG-AUTH✅
FR-020ADR-004endpoint-uri operaționale + RFC7807TC-COM-API-04/05✅

14. Stare de implementare (pentru urmărirea dezvoltării)

Section titled “14. Stare de implementare (pentru urmărirea dezvoltării)”
FazăConținutStare
P1Schelet + model + integritate✅
P2Ingest REST, tenant guard, OAuth2, RFC7807, OpenAPI, operațional✅
P3JPA/Postgres, integrity endpoint, paginare, AMQP+DLX, forward+outbox+replay✅
P3bMLog real (JOSE/mTLS ⛔), Kafka, retenție, SDK-uri, export, batch🟡
P4Conformance kit GovStack🟡
P5Cutover pilot (export verificat, zero-diff)🟡

Stare cod: 46 teste verzi (unit + integrare Testcontainers Postgres + RabbitMQ); mvn clean test → BUILD SUCCESS. Repo: govtech/gstack/glog.


15. Dependențe pentru sistemele integratoare (planificare)

Section titled “15. Dependențe pentru sistemele integratoare (planificare)”

Ce trebuie să pregătească un sistem consumator pentru a integra GLog:

  1. Identitate: client Keycloak cu scope-urile audit:* necesare; (opțional) certificat pentru mTLS.
  2. Decizie de transport: REST (simplu) vs. AMQP/Kafka (volum) vs. SDK (buffer local).
  3. Maparea evenimentelor: definirea object_type / action_type proprii + structura details.
  4. Back-link: convenția view_link către obiectul din sistemul-sursă.
  5. Retenție: stabilirea politicii per tip obiect (cu beneficiarul).

Aceste capacități sunt disponibile în mediile de test pe măsură ce fazele devin ✅. Un sistem consumator poate începe integrarea pe căile ✅ fără a aștepta lansarea în producție; căile 🟡/⛔ se anunță pe portal la trecerea în ✅.


  • Caiet de sarcini (business + tehnic): glog-audit-logging.md
  • ADR-uri: glog/adrs/GLog-ADR-001 … 010
  • Plan de testare: test-plans/glog-audit-logging.md
  • RFB (document de licitație): GLog-RFB-Document-Licitatie.docx
  • Cod & wiki: GitLab govtech/gstack/glog

Esempla Systems · GovStack · GLog — Specificație Tehnică Completă · v0.1 · 2026-06-25