GSSO — Cerințe funcționale și nefuncționale
Acest conținut nu este încă disponibil în limba selectată.
| Cod document | SPEC-GSSO-2026 / Raportul 02 |
| Versiune | 0.1-draft (sursa EN, text care prevalează) |
| Data | 2026-10-05 |
| Statut | Proiect |
| Rapoarte însoțitoare | 00 Caiet de sarcini · 01 ADR · 03 Consumatori și contract · 04 Documentație tehnică · 05 Foaie de parcurs |
Prezentul raport este sursa unică de adevăr pentru cerințele GSSO. Raportul 00 doar le rezumă.
Istoricul reviziilor
Section titled “Istoricul reviziilor”| Versiune | Data | Modificări |
|---|---|---|
| 0.1-draft | 2026-10-05 | Matricea inițială: GSSO-FR-001..116, 44 GSSO-NFR-, trasabilitate către CAP-GSSO-01..07, CU-, NFRQ |
Coloane
Section titled “Coloane”- Pri:
[M]: obligatoriu pentru MVP sau GA.[REC]: recomandat; nu blochează niciodată o poartă.[OPT]: opțional sau ulterior.
- Sursă:
CAP-GSSO-nn: capabilitate solicitată de un consumator (raportul CRM 03 §4.1 și pachetele gDocFlow, gTenders, gFlow și gInsight).CU-*: cerință universală gStack.NFRQnn: cod din caietul de sarcini.DES: cerută de designulGSSO.dc.html.NEW: identificată în cursul analizei platformei.- O etichetă de consumator (
crm,interdictii,glog…) marchează o necesitate derivată din aplicația respectivă (raportul 03).
- Componentă:
kc: extensii Keycloak, teme, configurații de bază ale realm-urilor.server: microserviciulgsso.gateway:gsso-gateway.web:gsso-web.starter:gsso-spring-boot-starter.ng:@gstack/gsso-angular.ops: compose, Helm, runbook-uri.
- Fază (raportul 05):
S0: Fundație.S1: MVP consolă și catalog.S2: Guvernanță (atribuiri, evenimente, politici).S3: Kit de integrare și pilot.S4: Migrarea aplicațiilor existente.S5: Extensii.
| Grup | ID-uri | [M] | [REC] | [OPT] |
|---|---|---|---|---|
| FR-RLM Realm-uri și tenanți | 001..010 | 7 | 2 | 1 |
| FR-CAT Catalogul de servicii | 011..022 | 10 | 2 | 0 |
| FR-USR Utilizatori și sesiuni | 023..036 | 11 | 3 | 0 |
| FR-GRT Roluri și atribuiri | 037..052 | 13 | 2 | 1 |
| FR-ORG Unități organizaționale | 053..056 | 3 | 1 | 0 |
| FR-AUT Autentificare și federare | 057..070 | 9 | 3 | 2 |
| FR-SYN Reconciliere | 071..080 | 9 | 1 | 0 |
| FR-EVT Evenimente și audit | 081..090 | 9 | 1 | 0 |
| FR-RPT Tablou de bord și rapoarte | 091..096 | 4 | 2 | 0 |
| FR-API API pentru aplicații și kit de integrare | 097..108 | 10 | 2 | 0 |
| FR-UI Consola | 109..116 | 8 | 0 | 0 |
| Total funcționale | 116 | 93 | 19 | 4 |
| NFR (PERF 5, CAP 4, AVL 6, SEC 10, TEN 3, OBS 4, OPS 5, CMP 4, DATA 3) | 44 |
I. Cerințe funcționale
Section titled “I. Cerințe funcționale”1. Realm-uri și tenanți — FR-RLM
Section titled “1. Realm-uri și tenanți — FR-RLM”| ID | Cerință | Pri | Sursă | Componentă | Fază |
|---|---|---|---|---|---|
| GSSO-FR-001 | Registrul realm-urilor: un GSSO_ADMIN înregistrează un realm cu nume, nume afișat, tip (STAFF, CETATEAN, TENANT, SERVICE), proprietar, politică de drift și statut; realm-ul este creat în Keycloak de către reconciliator | [M] | DES, CAP-GSSO-01 | server, web | S1 |
| GSSO-FR-002 | Crearea unui realm dintr-un șablon versionat (tenant-template), care aplică fluxurile de bază, client scopes, mappers, politica de parole, temele și event listener-ul gsso-kafka | [M] | NEW | kc, server | S1 |
| GSSO-FR-003 | Activarea/dezactivarea unui realm; un realm dezactivat refuză autentificările; acțiunea necesită confirmare și este auditată | [M] | DES | server, web | S1 |
| GSSO-FR-004 | Lista realm-urilor afișează numele afișat, numele, numărul de utilizatori, numărul de clienți, federarea (broker) și statutul, ca în ecranul de design „Realms” | [M] | DES | web | S1 |
| GSSO-FR-005 | Selectorul de realm din bara laterală limitează toate ecranele la realm-ul selectat; alegerea se păstrează pentru fiecare administrator | [M] | DES | web | S1 |
| GSSO-FR-006 | Administrare limitată la realm: GSSO_REALM_ADMIN cu atributul gsso.realm=<name> vede și modifică doar acel realm | [M] | NEW | server, gateway | S1 |
| GSSO-FR-007 | Preluarea unui realm: importul unui realm existent (de ex. interdictii) în catalog în regim doar-citire, cu politica de drift IGNORE până când proprietarul o schimbă | [M] | NEW, interdictii | server, web | S1 |
| GSSO-FR-008 | Identitatea vizuală a realm-ului: nume afișat, logo, culoare de accent și limba implicită aplicate temei de autentificare GDS prin atributele realm-ului | [REC] | NEW | kc, web | S2 |
| GSSO-FR-009 | Exportul realm-ului (configurație, fără secrete, fără utilizatori) în format JSON pentru backup și revizuire | [REC] | NEW | server, web | S2 |
| GSSO-FR-010 | Suport pentru Keycloak Organizations în cadrul unui realm, ca alternativă la atributele de unitate organizațională | [OPT] | NEW | server | S5 |
2. Catalogul de servicii — FR-CAT
Section titled “2. Catalogul de servicii — FR-CAT”| ID | Cerință | Pri | Sursă | Componentă | Fază |
|---|---|---|---|---|---|
| GSSO-FR-011 | Registrul platformelor (Platforma): cod (litere mici, unic), nume, tip (SAAS, PAAS), descriere RO/RU/EN, proprietar(i), URL de bază, accent, statut, realm(-uri) | [M] | CAP-GSSO-06 | server, web | S1 |
| GSSO-FR-012 | Clienți per platformă (ClientAplicatie): clientId, protocol (OIDC, SAML), tip de acces (PUBLIC_PKCE, CONFIDENTIAL, BEARER_ONLY, SERVICE_ACCOUNT), redirect URI-uri, web origins, URI-uri post-logout, URL de back-channel logout, audiență, statut | [M] | DES, CAP-GSSO-01 | server, web | S1 |
| GSSO-FR-013 | Șabloanele de client per tip de acces aplică valori implicite sigure: PKCE S256 pentru clienții publici, fără implicit flow, fără direct access grants, redirect URI-uri exacte, consimțământ dezactivat pentru aplicațiile interne | [M] | NFRQ56, NEW | server | S1 |
| GSSO-FR-014 | Rotirea secretului pentru clienții confidențiali: generare, afișare o singură dată, păstrarea valabilității secretului anterior pe o perioadă de grație (politica Keycloak de rotire a secretelor client) | [M] | NFRQ60 | server, web | S2 |
| GSSO-FR-015 | Clienții de tip service account primesc roluri de client sau scopes (de ex. audit:write, storage:read) declarate pe client, nu prin atribuiri | [M] | glog, gstorage | server, web | S1 |
| GSSO-FR-016 | Roluri de platformă (RolPlatforma): cod prefixat automat cu <PLATFORMA>_, descrieri RO/RU/EN, compozit (cu roluri-copil ale aceleiași platforme), indicator de rol sensibil, valabilitate implicită | [M] | DES, GSSO-ADR-005 | server, web | S1 |
| GSSO-FR-017 | Pachete de roluri (grupuri): seturi denumite de roluri de platformă (de ex. „Operator Cancelaria”) care pot fi atribuite printr-o singură solicitare | [M] | NEW, cancelarie | server, web | S2 |
| GSSO-FR-018 | Audience mapper per platformă: token-urile fiecărui client poartă audiența platformei sale; serverele de resurse o validează | [M] | CAP-GSSO-01, gregistry | kc, server | S1 |
| GSSO-FR-019 | Permisiuni de token exchange per client: lista audiențelor țintă pentru care un client poate face schimbul (GSSO-ADR-012) | [M] | CAP-GSSO-07 | server, web | S3 |
| GSSO-FR-020 | Câte un client de serviciu pentru fiecare microserviciu al unei platforme (de ex. crm-core, crm-clienti…), care poate fi creat în masă dintr-o listă | [M] | CAP-GSSO-01 | server, web | S1 |
| GSSO-FR-021 | Dezactivarea platformei: dezactivează toți clienții săi și suspendă atribuirile active (fără ștergere), reversibil | [REC] | NEW | server | S2 |
| GSSO-FR-022 | Fișa platformei afișează clienții, rolurile, numărul de atribuiri, proprietarii, starea sincronizării și progresul listei de verificare pentru conectare | [REC] | NEW | web | S2 |
3. Utilizatori și sesiuni — FR-USR
Section titled “3. Utilizatori și sesiuni — FR-USR”| ID | Cerință | Pri | Sursă | Componentă | Fază |
|---|---|---|---|---|---|
| GSSO-FR-023 | Lista utilizatorilor per realm, cu căutare după nume, username, e-mail, IDNP (doar pentru rolurile autorizate), filtre după statut, MFA, rol de platformă, unitate organizațională; coloane ca în design (utilizator, e-mail, 2FA, statut, ultima autentificare) | [M] | DES | server, web | S1 |
| GSSO-FR-024 | Crearea utilizatorului: username, prenume/nume, e-mail, IDNP, unitate organizațională, limbă; trimiterea unui e-mail de invitație cu acțiuni obligatorii (verificarea e-mailului, setarea parolei, configurarea OTP dacă se atribuie un rol sensibil) | [M] | DES, CAP-GSSO-01 | server, web | S1 |
| GSSO-FR-025 | Editarea atributelor utilizatorului; activarea/dezactivarea utilizatorului (dezactivarea închide sesiunile) | [M] | DES | server, web | S1 |
| GSSO-FR-026 | Panoul lateral al utilizatorului cu filele Detalii, Credențiale, Roluri, Sesiuni, ca în design | [M] | DES | web | S1 |
| GSSO-FR-027 | Fila Credențiale: parolă setată/data ultimei schimbări, dispozitive OTP, chei WebAuthn; acțiuni: resetarea parolei (prin e-mail), eliminarea unei credențiale OTP/WebAuthn, impunerea acțiunilor obligatorii | [M] | DES | server, web | S1 |
| GSSO-FR-028 | Fila Roluri: rolurile de platformă efective cu sursa lor (id-ul atribuirii, pachet, compozit) și valabilitatea atribuirii | [M] | DES | server, web | S2 |
| GSSO-FR-029 | Fila Sesiuni: sesiunile active cu client, IP, dispozitiv (user agent), început și ultimul acces; închiderea uneia sau a tuturor | [M] | DES, CAP-GSSO-03 | server, web | S1 |
| GSSO-FR-030 | Deblocarea unui utilizator blocat temporar de protecția brute-force | [M] | NEW | server, web | S1 |
| GSSO-FR-031 | Proiecția utilizatorilor (ProiectieUtilizator) reîmprospătată prin evenimente, prin sincronizare completă nocturnă și la deschidere; afișează „reîmprospătat la” | [M] | GSSO-ADR-008 | server | S1 |
| GSSO-FR-032 | sub este un UUID stabil; schimbarea username-ului sau a e-mailului nu modifică niciodată sub | [M] | CAP-GSSO-01 | kc | S0 |
| GSSO-FR-033 | Atributul utilizatorului locale (ro, ru, en) editabil de utilizator și de administrator; emis în token | [M] | CAP-GSSO-01 | kc, server | S1 |
| GSSO-FR-034 | Importul în masă al utilizatorilor din CSV (validat, mai întâi un raport de tip dry-run) | [REC] | cancelarie | server, web | S2 |
| GSSO-FR-035 | Autoservire prin consola de cont Keycloak în tema GDS: profil, parolă, MFA, sesiuni, conturi asociate | [REC] | NEW | kc | S2 |
| GSSO-FR-036 | Ultima autentificare și ultimul eșec afișate pentru fiecare utilizator, din fluxul de evenimente | [REC] | DES, CRM REQ-PLT | server, web | S2 |
4. Roluri și atribuiri — FR-GRT
Section titled “4. Roluri și atribuiri — FR-GRT”| ID | Cerință | Pri | Sursă | Componentă | Fază |
|---|---|---|---|---|---|
| GSSO-FR-037 | Ecranul rolurilor de realm și al rolurilor de client, ca în design: rol, descriere, compozit/simplu, membri; rolurile de client grupate pe client | [M] | DES | web | S1 |
| GSSO-FR-038 | Solicitarea de atribuire (AtribuireAcces): utilizator, rol de platformă sau pachet, unitate organizațională opțională, validDe, validPana, motiv obligatoriu; solicitantul este înregistrat | [M] | NEW, NFRQ56 | server, web | S2 |
| GSSO-FR-039 | Ciclul de viață al atribuirii SOLICITATA → APROBATA → ACTIVA → REVOCATA/EXPIRATA, SOLICITATA → RESPINSA, impus în stratul de servicii; tranzițiile nepermise sunt respinse cu RFC 7807 invalid-transition | [M] | GSSO-ADR-006 | server | S2 |
| GSSO-FR-040 | Aprobare de către un proprietar de platformă sau un administrator de realm; pentru rolurile sensibile, un al doilea aprobator distinct cu GSSO_APPROVER | [M] | NFRQ56, GSSO-ADR-006 | server, web | S2 |
| GSSO-FR-041 | Nimeni nu aprobă o solicitare creată de el însuși sau o atribuire pentru sine | [M] | NFRQ56 | server | S2 |
| GSSO-FR-042 | ACTIVA doar după ce reconciliatorul confirmă maparea rolului în Keycloak; un eșec lasă APROBATA, cu eroarea de sincronizare afișată | [M] | GSSO-ADR-004 | server | S2 |
| GSSO-FR-043 | Revocarea, cu motiv obligatoriu, elimină maparea și declanșează închiderea sesiunilor și gsso.access-revoked.v1 | [M] | CAP-GSSO-04 | server | S2 |
| GSSO-FR-044 | Planificatorul de expirare (orar) expiră atribuirile care au depășit validPana și elimină mapările | [M] | NEW | server | S2 |
| GSSO-FR-045 | Avertizări de expirare către utilizator și proprietarul platformei cu 14 zile și cu 1 zi înainte, prin GNotify | [M] | NEW | server | S2 |
| GSSO-FR-046 | Atribuire directă de către un administrator pentru rolurile nesensibile (solicitare + aprobare într-un singur pas), auditată ca ACORDARE_DIRECTA | [M] | NEW | server, web | S2 |
| GSSO-FR-047 | Inbox de atribuiri pentru fiecare aprobator: solicitări în așteptare cu solicitant, utilizator, rol, motiv, vechime; aprobare/respingere în masă | [M] | NEW | web | S2 |
| GSSO-FR-048 | Istoricul atribuirilor per utilizator și per rol, filtrabil, exportabil (CSV) | [M] | NFRQ65 | server, web | S2 |
| GSSO-FR-049 | Mapările de roluri create direct în Keycloak (nu printr-o atribuire) sunt raportate ca drift (MAPARE_NEGUVERNATA) | [M] | GSSO-ADR-004 | server | S2 |
| GSSO-FR-050 | Campanie de revizuire a accesului: per platformă, proprietarii confirmă sau revocă fiecare atribuire activă înainte de un termen; atribuirile neconfirmate sunt semnalate | [REC] | NFRQ56 | server, web | S5 |
| GSSO-FR-051 | Solicitare de atribuire de către o aplicație în numele unui utilizator prin api/v1/app (de ex. la înrolarea în cancelarie) | [REC] | cancelarie, crm | server | S3 |
| GSSO-FR-052 | Reguli de separare a atribuțiilor: perechi de roluri care nu pot fi deținute simultan (de ex. INTERDICTII_EMITENT + INTERDICTII_APROBATOR); solicitările conflictuale sunt respinse sau semnalate | [OPT] | NEW | server | S5 |
5. Unități organizaționale — FR-ORG
Section titled “5. Unități organizaționale — FR-ORG”| ID | Cerință | Pri | Sursă | Componentă | Fază |
|---|---|---|---|---|---|
| GSSO-FR-053 | Arborele unităților organizaționale per realm (UnitateOrganizationala): cod, nume RO/RU/EN, părinte, conducător(i) | [M] | CAP-GSSO-04 | server, web | S2 |
| GSSO-FR-054 | Atributul utilizatorului org_unit (cod) și claim-ul org_unit; claim opțional org_unit_path (codurile de la rădăcină) | [M] | CAP-GSSO-04, ginsight | kc, server | S2 |
| GSSO-FR-055 | Atribuirile pot fi limitate la o unitate organizațională; limitarea este emisă, când există, în claim-ul roles_scoped {"<ROLE>": ["<ou>"…]} | [M] | NEW | kc, server | S2 |
| GSSO-FR-056 | Importul unităților organizaționale din CSV/JSON | [REC] | NEW | server | S2 |
6. Autentificare și federare — FR-AUT
Section titled “6. Autentificare și federare — FR-AUT”| ID | Cerință | Pri | Sursă | Componentă | Fază |
|---|---|---|---|---|---|
| GSSO-FR-057 | Politica de autentificare per realm (PoliticaAutentificare): comutatoare pentru metodele parolă, OTP, WebAuthn, QR, client credentials, broker, magic link, ca în ecranul de design „Authentication” | [M] | DES | server, web | S2 |
| GSSO-FR-058 | Fluxul de browser afișat ca pași ordonați (cookie, broker, username+parolă, al doilea factor condiționat), cu cerința aferentă (alternativ/obligatoriu/condiționat) | [M] | DES | server, web | S2 |
| GSSO-FR-059 | MFA condiționat: OTP sau WebAuthn obligatoriu când utilizatorul deține orice rol sensibil (authenticator condiționat personalizat sau „condition – user role” pe un compozit GSSO_MFA_REQUIRED) | [M] | CAP-GSSO-02, NFRQ58 | kc, server | S2 |
| GSSO-FR-060 | Politica de parole per realm: lungime ≥ 12, complexitate, istoric 5, diferită de username/e-mail, vârstă maximă opțională | [M] | NFRQ58 | kc, server | S0 |
| GSSO-FR-061 | Protecția brute-force activată (blocare după 5 eșecuri, așteptare incrementală) | [M] | NFRQ58 | kc | S0 |
| GSSO-FR-062 | Durata sesiunilor per realm și per client: SSO inactivitate 30 min / maximum 10 h pentru personal; clientul consolei de administrare 15 min de inactivitate | [M] | NFRQ60 | kc, server | S0 |
| GSSO-FR-063 | Furnizor de identitate MPass/eID (SAML) în realm-ul cetatean; first-broker-login asociază sau creează utilizatorul după IDNP; IdP simulat (mock) pentru teste | [M] | NEW, drumuri | kc, server | S2 |
| GSSO-FR-064 | Federarea utilizatorilor AD/LDAP per realm (implicit doar-citire), cu mappers de atribute și de grupuri | [M] | CAP-GSSO-02 | kc, server, web | S2 |
| GSSO-FR-065 | WebAuthn / passkeys (politici two-factor și passwordless) | [M] | DES | kc | S2 |
| GSSO-FR-066 | Teme GDS pentru autentificare, cont și e-mail în RO/RU/EN; IBM Plex; accentul realm-ului | [REC] | NFRQ38/40 | kc | S0 |
| GSSO-FR-067 | Autentificare prin magic link (e-mail) doar pentru clienții cu nivel scăzut de asigurare | [OPT] | DES | kc | S5 |
| GSSO-FR-068 | Autentificare QR între dispozitive cu aplicația gsso_mob, ca authenticator Keycloak (înlocuiește endpoint-ul de aprobare specific fiecărui site) | [OPT] | gsso_mob, Q-GSSO-9 | kc | S5 |
| GSSO-FR-069 | Acțiuni obligatorii configurabile per realm: verificarea e-mailului, actualizarea parolei, configurarea OTP, termeni și condiții | [REC] | NEW | kc, server | S2 |
| GSSO-FR-070 | Claim-ul de nivel de asigurare acr (1 parolă, 2 MFA, 3 MPass înalt) și step-up prin acr_values pentru operațiunile sensibile | [REC] | NEW | kc | S3 |
7. Reconciliere — FR-SYN
Section titled “7. Reconciliere — FR-SYN”| ID | Cerință | Pri | Sursă | Componentă | Fază |
|---|---|---|---|---|---|
| GSSO-FR-071 | Orice modificare de catalog, utilizator sau atribuire creează un JobSincronizare în aceeași tranzacție (outbox) | [M] | GSSO-ADR-004 | server | S1 |
| GSSO-FR-072 | Worker-ul reconciliatorului aplică job-urile în mod idempotent prin Keycloak Admin REST API, cu service account-ul gsso-reconciler | [M] | GSSO-ADR-004 | server | S1 |
| GSSO-FR-073 | Reîncercare cu backoff exponențial (1 s → 5 min, 10 încercări), apoi FAILED cu alertă GNotify | [M] | NEW | server | S1 |
| GSSO-FR-074 | Reconciliere completă per realm la fiecare 15 min (configurabil) și la cerere; diff pe tipurile de obiecte gestionate | [M] | GSSO-ADR-004 | server | S1 |
| GSSO-FR-075 | Constatările de drift stocate cu un diff JSON; politică per realm REPORT, ENFORCE, IGNORE | [M] | NEW | server | S1 |
| GSSO-FR-076 | Obiectele gestionate poartă gsso.managed=true; obiectele negestionate nu sunt niciodată șterse, ci doar raportate | [M] | NEW | server | S1 |
| GSSO-FR-077 | Ecranul de sincronizare: job-uri (în așteptare, în execuție, OK, eșuate, drift) cu filtre, reîncercare și „acceptă drift-ul” (preluarea valorii din Keycloak) | [M] | NEW | web | S1 |
| GSSO-FR-078 | Fiecare obiect din catalog își afișează în liste stareSync (sincronizat, în așteptare, eșuat, drift) | [M] | NEW | web | S1 |
| GSSO-FR-079 | O singură instanță a reconciliatorului aplică job-uri pentru un realm la un moment dat (advisory lock), astfel încât ordinea per realm este păstrată | [M] | NEW | server | S1 |
| GSSO-FR-080 | Mod dry-run pentru reconciliere și preluare, care produce un raport fără scrieri | [REC] | NEW | server, web | S1 |
8. Evenimente și audit — FR-EVT
Section titled “8. Evenimente și audit — FR-EVT”| ID | Cerință | Pri | Sursă | Componentă | Fază |
|---|---|---|---|---|---|
| GSSO-FR-081 | Event listener-ul Keycloak gsso-kafka publică evenimentele de utilizator și de administrare în gsso.kc-events.v1 (CloudEvents, asincron, neblocant) | [M] | GSSO-ADR-007 | kc | S2 |
| GSSO-FR-082 | Consumatorul idempotent stochează evenimentele în EvenimentGsso și actualizează proiecția și agregatele | [M] | GSSO-ADR-007 | server | S2 |
| GSSO-FR-083 | Evenimentele proprii GSSO (catalog, atribuire, sincronizare, acțiuni în consola de administrare) sunt scrise în aceeași tranzacție cu modificarea | [M] | CU-AUDIT | server | S1 |
| GSSO-FR-084 | EvenimentGsso este append-only: fără update/delete în repository; un trigger în baza de date respinge UPDATE/DELETE | [M] | CU-AUDIT, NFRQ65 | server | S1 |
| GSSO-FR-085 | Lanț de hash-uri per realm (hashPrecedent, hash SHA-256) și un endpoint de verificare | [M] | NEW | server | S2 |
| GSSO-FR-086 | Redirecționarea fiecărui eveniment către GLog, cu reîncercare și id de confirmare | [M] | CU-AUDIT | server | S2 |
| GSSO-FR-087 | Completare retroactivă (back-fill) din API-ul de evenimente Keycloak atunci când fluxul a avut o întrerupere | [M] | NEW | server | S2 |
| GSSO-FR-088 | Lista evenimentelor cu filtre (tip, actor, realm, client, IP, interval de timp) și vizualizare detaliată | [M] | DES | web | S2 |
| GSSO-FR-089 | Publicarea gsso.access-revoked.v1 și gsso.user-changed.v1 pentru consumatori | [M] | CAP-GSSO-04 | server | S2 |
| GSSO-FR-090 | Alerte de securitate prin GNotify: blocarea brute-force a unui administrator, autentificare dintr-o țară nouă pentru administratori, atribuirea unui rol GSSO_*, eșecul reconciliatorului | [REC] | NFRQ65 | server | S2 |
9. Tablou de bord și rapoarte — FR-RPT
Section titled “9. Tablou de bord și rapoarte — FR-RPT”| ID | Cerință | Pri | Sursă | Componentă | Fază |
|---|---|---|---|---|---|
| GSSO-FR-091 | Indicatori KPI în tabloul de bord: realm-uri, clienți (OIDC/SAML), utilizatori (variația de azi), sesiuni active | [M] | DES | server, web | S2 |
| GSSO-FR-092 | Autentificările din ultimele 24 h în intervale de 2 ore, reușite vs eșuate | [M] | DES | server, web | S2 |
| GSSO-FR-093 | Evenimente de securitate recente (ultimele 20) cu actor, text, realm, IP, oră | [M] | DES | web | S2 |
| GSSO-FR-094 | Distribuția metodelor de autentificare în ultimele 24 h (parolă, OTP, WebAuthn, MPass/eID, aplicație-la-aplicație) | [M] | DES | server, web | S2 |
| GSSO-FR-095 | Raportul de acces: cine deține ce rol pe ce platformă (filtru după platformă, unitate organizațională), CSV/PDF | [REC] | NFRQ56 | server, web | S2 |
| GSSO-FR-096 | Raportul conturilor inactive: utilizatori fără autentificare în ultimele N zile care dețin roluri | [REC] | NEW | server, web | S5 |
10. API pentru aplicații și kit de integrare — FR-API
Section titled “10. API pentru aplicații și kit de integrare — FR-API”| ID | Cerință | Pri | Sursă | Componentă | Fază |
|---|---|---|---|---|---|
| GSSO-FR-097 | API în zona admin care acoperă toate funcțiile consolei; OpenAPI publicat | [M] | CU-API-003 | server | S1 |
| GSSO-FR-098 | API în zona app cu client credentials și scope-ul gsso:app; fiecare aplicație vede doar propria platformă | [M] | CAP-GSSO-06 | server | S3 |
| GSSO-FR-099 | Autoînregistrarea aplicației: crearea/actualizarea propriei platforme, a clienților și a rolurilor (când clientul aplicației este marcat în acest sens) | [M] | CAP-GSSO-06 | server | S3 |
| GSSO-FR-100 | Căutarea utilizatorului după sub, username, e-mail sau IDNP (IDNP doar pentru clienții permiși de DPO) | [M] | CAP-GSSO-03, crm | server | S3 |
| GSSO-FR-101 | Interogarea statutului utilizatorului și a rolurilor de platformă (GET /api/v1/app/utilizatori/{sub}/roluri) | [M] | CAP-GSSO-03 | server | S3 |
| GSSO-FR-102 | Închiderea sesiunilor unui utilizator (DELETE /api/v1/app/utilizatori/{sub}/sesiuni) | [M] | CAP-GSSO-03 | server | S3 |
| GSSO-FR-103 | Utilizatorii care dețin un rol (GET /api/v1/app/roluri/{cod}/utilizatori), paginat; folosit de ex. de gFlow la rezolvarea candidaților | [M] | gflow | server | S3 |
| GSSO-FR-104 | gsso-spring-boot-starter: validare de resource server (issuer, JWKS, audiență), roles → authorities cu hartă de alias-uri, GssoPrincipal, clienți pentru client credentials și token exchange, deny-list de revocare, indicator de sănătate Keycloak, helper Testcontainers | [M] | GSSO-ADR-009 | starter | S3 |
| GSSO-FR-105 | @gstack/gsso-angular: mod PKCE sau BFF, guard și directivă de rol, silent refresh, single logout, sincronizarea limbii | [M] | GSSO-ADR-009 | ng | S3 |
| GSSO-FR-106 | Runbook și listă de verificare pentru conectare (raportul 03 §8) și o aplicație exemplu | [M] | NEW | ops | S3 |
| GSSO-FR-107 | Helper de configurare Kafka SASL OAUTHBEARER pentru clienții de serviciu | [REC] | CAP-GSSO-01 | starter | S3 |
| GSSO-FR-108 | Terraform/OpenTofu sau CLI (gsso-cli) pentru conectarea platformelor din CI | [REC] | CAP-GSSO-06 | ops | S5 |
11. Consola (UI) — FR-UI
Section titled “11. Consola (UI) — FR-UI”| ID | Cerință | Pri | Sursă | Componentă | Fază |
|---|---|---|---|---|---|
| GSSO-FR-109 | Layout GDS ca în design: bară laterală cu secțiunile Identitate (Tablou de bord, Realm-uri, Aplicații) și Acces (Utilizatori, Roluri, Autentificare), plus Guvernanță (Platforme, Atribuiri, Sincronizare, Evenimente) | [M] | DES | web | S1 |
| GSSO-FR-110 | Comutator de limbă RO/RU/EN în antet; toate etichetele traduse; termenii de domeniu în limba română | [M] | NFRQ38 | web | S1 |
| GSSO-FR-111 | Acțiune „Creează” dependentă de context pe fiecare ecran (realm, client, utilizator, rol, atribuire), care deschide un panou lateral cu formular | [M] | DES | web | S1 |
| GSSO-FR-112 | Layout responsiv până la 360 px, cu bară laterală pliabilă (ca punctele de întrerupere din design, 880/480 px) | [M] | DES, NFRQ39 | web | S1 |
| GSSO-FR-113 | Tabele cu filtrare, sortare, paginare și stări goale; acțiunile distructive necesită confirmare cu numele obiectului | [M] | NEW | web | S1 |
| GSSO-FR-114 | Ecranele și acțiunile sunt ascunse sau dezactivate în funcție de rolul GSSO al administratorului și de realm-ul la care are acces; backend-ul impune aceleași reguli | [M] | NFRQ56 | web, server | S1 |
| GSSO-FR-115 | Notificări toast și insigne de stare a sincronizării după fiecare modificare (în așteptare → sincronizat) | [M] | DES | web | S1 |
| GSSO-FR-116 | Accesibilitate WCAG 2.1 AA (tastatură, focus, contrast, etichete) | [M] | NFRQ39 | web | S1 |
II. Cerințe nefuncționale
Section titled “II. Cerințe nefuncționale”12. Performanță — NFR-PERF
Section titled “12. Performanță — NFR-PERF”| ID | Cerință | Țintă | Verificare |
|---|---|---|---|
| GSSO-NFR-PERF-001 | Autentificare (parolă, utilizator existent) cap-coadă la Keycloak | p95 < 500 ms la 50 autentificări/s | test de încărcare |
| GSSO-NFR-PERF-002 | Endpoint-urile de listă ale consolei (utilizatori, atribuiri, evenimente; 50 de rânduri) | p95 < 800 ms cu 100 000 de utilizatori, 1 M de evenimente | test de încărcare (NFRQ20) |
| GSSO-NFR-PERF-003 | Modificare de catalog → în Keycloak | p95 < 2 s, p99 < 10 s | măsurare de timp în IT |
| GSSO-NFR-PERF-004 | Eveniment Kafka → vizibil în consolă | p95 < 5 s | măsurare de timp în IT |
| GSSO-NFR-PERF-005 | Costul suplimentar al validării token-ului în starter (JWKS în cache) | < 2 ms per cerere | microbenchmark |
13. Capacitate — NFR-CAP
Section titled “13. Capacitate — NFR-CAP”| ID | Cerință | Țintă |
|---|---|---|
| GSSO-NFR-CAP-001 | Utilizatori din rândul personalului în gstack | 20 000 |
| GSSO-NFR-CAP-002 | Utilizatori cetățeni în cetatean | 1 000 000 |
| GSSO-NFR-CAP-003 | Sesiuni SSO concurente | 10 000 |
| GSSO-NFR-CAP-004 | Platforme / clienți / roluri / atribuiri active | 100 / 1 000 / 2 000 / 200 000 |
14. Disponibilitate și continuitate — NFR-AVL
Section titled “14. Disponibilitate și continuitate — NFR-AVL”| ID | Cerință | Țintă |
|---|---|---|
| GSSO-NFR-AVL-001 | Disponibilitatea Keycloak (autentificare, token, JWKS) | 99,9 % lunar (disponibilitate NFRQ) |
| GSSO-NFR-AVL-002 | Disponibilitatea consolei și a API-ului GSSO | 99,5 % lunar |
| GSSO-NFR-AVL-003 | Autentificările și emiterea token-urilor nu depind de funcționarea gsso, Kafka sau GLog | verificat prin test de haos |
| GSSO-NFR-AVL-004 | RPO / RTO pentru baza de date Keycloak | 15 min / 1 h |
| GSSO-NFR-AVL-005 | RPO / RTO pentru baza de date GSSO | 1 h / 4 h; catalogul poate fi reconstruit prin preluare |
| GSSO-NFR-AVL-006 | Expirarea certificatelor TLS monitorizată, cu alertă cu 21 de zile înainte | test de alertă |
15. Securitate — NFR-SEC
Section titled “15. Securitate — NFR-SEC”| ID | Cerință |
|---|---|
| GSSO-NFR-SEC-001 | OWASP ASVS L2 pentru consolă, gateway și API; OWASP Top 10 (NFRQ56/57) |
| GSSO-NFR-SEC-002 | Token-uri semnate RS256 (sau ES256); rotirea cheilor la fiecare 90 de zile, cu suprapunere; HS* nu este permis |
| GSSO-NFR-SEC-003 | SPA-ul nu deține niciodată token-uri (BFF); cookie de sesiune HttpOnly, Secure, SameSite=Lax; protecție CSRF |
| GSSO-NFR-SEC-004 | Credențialele gsso-reconciler doar în depozitul de secrete; permisiunile sale limitate la manage-realm, manage-users, manage-clients, view-events ale realm-urilor gestionate (fără administrator master) |
| GSSO-NFR-SEC-005 | Niciun secret în git; secretele clienților afișate o singură dată; secretele criptate la stocare în baza de date GSSO, dacă sunt stocate (de preferat să nu fie stocate) |
| GSSO-NFR-SEC-006 | IDNP criptat la stocare în proiecție, mascat în UI, cu excepția rolului GSSO_IDNP_VIEW |
| GSSO-NFR-SEC-007 | Antete de securitate (CSP, HSTS, X-Frame-Options, Referrer-Policy) pe gateway și pe temele Keycloak (NFRQ56) |
| GSSO-NFR-SEC-008 | Clientul consolei de administrare: MFA obligatoriu, inactivitate a sesiunii 15 min |
| GSSO-NFR-SEC-009 | SAST, SCA, scanarea secretelor și SBOM în CI (/gsast), DAST de bază (/gtest) — NFRQ90/91 |
| GSSO-NFR-SEC-010 | Limitarea ratei pe API-ul app (per client) și pe endpoint-urile de autentificare, la nivel de ingress |
16. Izolarea tenanților — NFR-TEN
Section titled “16. Izolarea tenanților — NFR-TEN”| ID | Cerință |
|---|---|
| GSSO-NFR-TEN-001 | Fiecare rând din tabelele GSSO poartă realm; fiecare interogare a unui administrator limitat la un realm este filtrată pe server |
| GSSO-NFR-TEN-002 | Clientul gsso:app al unei aplicații poate citi și modifica doar obiectele propriei platforme |
| GSSO-NFR-TEN-003 | Testele demonstrează că niciun endpoint nu expune datele altui realm sau ale altei platforme (probă cu matricea de autorizare) |
17. Observabilitate — NFR-OBS
Section titled “17. Observabilitate — NFR-OBS”| ID | Cerință |
|---|---|
| GSSO-NFR-OBS-001 | /health/live, /health/ready (DB, Kafka, Keycloak), /metrics (Prometheus), /info pe gsso și gsso-gateway; /health și /metrics activate în Keycloak |
| GSSO-NFR-OBS-002 | Metrici: job-uri de sincronizare pe stări, durata reconcilierii, numărul de drift-uri, întârzierea evenimentelor, întârzierea redirecționării către GLog, autentificări/eșecuri per realm |
| GSSO-NFR-OBS-003 | Log-uri JSON structurate cu trace id; fără token-uri, secrete sau IDNP în log-uri (NFRQ35/50) |
| GSSO-NFR-OBS-004 | Alerte: reconciliator eșuat, întârzierea evenimentelor > 5 min, Keycloak indisponibil, expirarea certificatelor, rata erorilor |
18. Operabilitate — NFR-OPS
Section titled “18. Operabilitate — NFR-OPS”| ID | Cerință |
|---|---|
| GSSO-NFR-OPS-001 | Stivă locală pornită cu o singură comandă (docker compose up) și instalare documentată pe gazda demo |
| GSSO-NFR-OPS-002 | Chart Helm pentru ținta Kubernetes |
| GSSO-NFR-OPS-003 | Backup zilnic al bazei de date Keycloak + înainte de fiecare actualizare; restaurarea testată trimestrial |
| GSSO-NFR-OPS-004 | Actualizarea Keycloak condiționată de trecerea suitei de teste de integrare pentru configurația de bază a realm-urilor + reconciliator pe noua versiune |
| GSSO-NFR-OPS-005 | Runbook-uri: preluare, actualizare, rotirea cheilor, reînnoirea certificatelor, break-glass, restaurare |
19. Compatibilitate și standarde — NFR-CMP
Section titled “19. Compatibilitate și standarde — NFR-CMP”| ID | Cerință |
|---|---|
| GSSO-NFR-CMP-001 | OpenID Connect Core 1.0, practicile OAuth 2.1 (PKCE, fără implicit), RFC 8693, RFC 7807, SAML 2.0 |
| GSSO-NFR-CMP-002 | Standardul API GovStack: zone api/v1, endpoint-uri de sănătate, OpenAPI, Idempotency-Key pe POST (verificat de api_audit.py) |
| GSSO-NFR-CMP-003 | Stiva DEV-PLAYBOOK §2, versiunile fiind cele generate de JHipster 9.1.0 |
| GSSO-NFR-CMP-004 | Keycloak 26.6.x; extensiile construite pe aceeași versiune SPI |
20. Protecția și păstrarea datelor — NFR-DATA
Section titled “20. Protecția și păstrarea datelor — NFR-DATA”| ID | Cerință |
|---|---|
| GSSO-NFR-DATA-001 | Date cu caracter personal minimizate la: username, nume, e-mail, IDNP (opțional), unitate organizațională, limbă |
| GSSO-NFR-DATA-002 | Evenimentele sunt păstrate 90 de zile în GSSO, apoi eliminate (drop de partiție); GLog păstrează urma conform propriei politici |
| GSSO-NFR-DATA-003 | Ștergerea utilizatorului se propagă: proiecția este eliminată, referințele la actor sunt înlocuite cu sub |
III. Trasabilitate
Section titled “III. Trasabilitate”21. Solicitările de capabilități ale consumatorilor → cerințe
Section titled “21. Solicitările de capabilități ale consumatorilor → cerințe”| CAP | Solicitare | Cerințe GSSO | Fază |
|---|---|---|---|
| CAP-GSSO-01 | Realm corporativ; client confidențial crm-gateway; câte un client de serviciu pentru fiecare microserviciu; Kafka OAUTHBEARER; clienți GDocs/GLog; locale; sub UUID | FR-001, 012, 018, 020, 032, 033, 107 | S1–S3 |
| CAP-GSSO-02 | Federare AD/LDAP, MFA TOTP în funcție de rol | FR-059, 064 | S2 |
| CAP-GSSO-03 | Lista sesiunilor și închiderea forțată prin API-ul de administrare; statutul și rolurile utilizatorului | FR-029, 100, 101, 102 | S1, S3 |
| CAP-GSSO-04 | Revocare ≤ 60 s; claim-uri de unitate organizațională | FR-043, 053..055, 089; GSSO-ADR-013 | S2 |
| CAP-GSSO-06 | Provizionarea automatizabilă a clienților | FR-011, 098, 099, 108 | S3, S5 |
| CAP-GSSO-07 | Token exchange RFC 8693 | FR-019; GSSO-ADR-012 | S3 |
22. Cerințe universale (CU-*) → cerințe
Section titled “22. Cerințe universale (CU-*) → cerințe”| CU | Statut pentru GSSO | Cerințe |
|---|---|---|
| CU-AUTH-001 (autentificare) | Furnizată de GSSO tuturor aplicațiilor; consola o folosește | FR-057..070; NFR-SEC-002, 003, 008 |
| CU-AUTH-002 (semnătură) | N/A — MSign / gsso_mob | — |
| CU-AUTH-003 (sesiuni) | Aplicabilă | FR-029, 062, 102; GSSO-ADR-013 |
| CU-RBAC-001..003 | Aplicabilă — GSSO este sursa RBAC pentru toate aplicațiile | FR-016, 037..052, 114 |
| CU-AUDIT-001..003 | Aplicabilă, prin GLog | FR-081..090 |
| CU-OBS-001..004 | Aplicabilă | NFR-OBS-001..004 |
| CU-API-003..006 | Aplicabilă — obligatorie | FR-097, 098; NFR-CMP-002 |
| CU-MSG-001 | Aplicabilă (Kafka, consumatori idempotenți) | FR-081, 082, 089 |
| CU-DATA-001..003 | Aplicabilă | NFR-DATA-001..003, NFR-AVL-004/005 |
| CU-DEPLOY | Aplicabilă | NFR-OPS-001..005 |
23. NFRQ (caiet de sarcini) → cerințe
Section titled “23. NFRQ (caiet de sarcini) → cerințe”| NFRQ | GSSO |
|---|---|
| NFRQ20–22 performanță | NFR-PERF-001..005 |
| NFRQ35/50/51 jurnalizare | FR-081..090, NFR-OBS-003 |
| NFRQ38 multilingvism | FR-066, 110 |
| NFRQ39 accesibilitate | FR-112, 116 |
| NFRQ40 design unificat (GDS) | FR-066, 109 |
| NFRQ56–66 securitate | FR-013, 014, 040, 041, 059..062, NFR-SEC-* |
| NFRQ90–93 testare și acceptanță | NFR-SEC-009, raportul 04 §12, test-scenarios.md |