Vai al contenuto

Protezione Dati e GDPR

Classificazione Dati

SGV GE.CO tratta dati soggetti al GDPR (Regolamento UE 2016/679) e alla normativa italiana sulla privacy (D.Lgs. 196/2003 e s.m.i.).

Categorie di Dati Trattati

Categoria Esempi Classificazione Entita JPA
Dati identificativi Nome, cognome, codice fiscale, data nascita Dati personali VvAnagrafica, VvFigura
Dati di residenza Indirizzo, comune, CAP Dati personali VvResidenza, VvAnagrafica
Dati patente Numero patente, categoria, scadenza Dati personali VvFigura, VvPunti
Dati veicolo Targa, telaio, marca, modello Dati personali (collegati al proprietario) VvVeicolo
Dati sanzionatori Verbali, infrazioni, importi Dati amministrativi sensibili VvVerbale, VvInfrazione
Dati di pagamento Importi, IUV PagoPA, rate Dati finanziari VvPagamento, VvRateizzazione
Dati giudiziari Ricorsi, sentenze, esiti Dati particolari (art. 10 GDPR) VvRicorso, VvEsitoRicorso
Dati PND Notifiche digitali, destinatari Dati amministrativi VvDettaglioNotificaPnd
Dati MCTC Punti patente, provvedimenti Dati amministrativi VvPunti, VvIntProvvMctc

Livelli di Sensibilita

graph TD
    A["Molto Alto<br/>Dati giudiziari"] --> B["Alto<br/>Dati personali + finanziari"]
    B --> C["Medio<br/>Dati amministrativi"]
    C --> D["Basso<br/>Configurazione"]
    D --> E["Pubblico<br/>Dati di riferimento"]

    style A fill:#d32f2f,color:#fff
    style B fill:#f44336,color:#fff
    style C fill:#ff9800,color:#fff
    style D fill:#4CAF50,color:#fff
    style E fill:#2196F3,color:#fff

Regole di Logging

MAI Loggare

  • Password e token di autenticazione
  • Codice fiscale completo (al massimo ultimi 4 caratteri: ****XXXX)
  • Numeri di carta di credito / IBAN completi
  • Dati di pagamento dettagliati
  • Contenuto completo dei certificati
  • Chiavi API e credenziali di servizio

SEMPRE Loggare (Audit Trail)

  • Azioni utente su verbali (creazione, modifica, cancellazione)
  • Azioni su ricorsi (inserimento, esito)
  • Operazioni su pagamenti (registrazione, storno)
  • Risultati chiamate API esterne (successo/errore, senza dati personali)
  • Eventi di autenticazione (login, logout, tentativi falliti)
  • Accessi a dati anagrafici (chi ha cercato cosa, quando)

Framework Logging

Il sistema usa MLogger2 come framework di logging.

// Corretto - logga l'azione senza PII
MLogger2.info("Verbale {} modificato da operatore {}", verbaleId, operatoreId);

// ERRATO - logga dati personali
MLogger2.info("Verbale per {} CF:{}", nome, codiceFiscale); // MAI!

Misure di Sicurezza

Crittografia

Componente Tecnologia Uso
BouncyCastle 1.78.1 Operazioni crittografiche generali
JJWT 0.9.1 Token JWT per autenticazione
Mutual TLS Certificati X.509 Integrazioni PA (ANPR, PND, INAD, PagoPA)
Firma digitale BouncyCastle + DocFly Firma documenti

Accesso ai Dati

  • Autenticazione: Obbligatoria per tutti i moduli (vedi Autenticazione)
  • Autorizzazione: Ruoli e permessi per operatore
  • Multi-tenancy: Isolamento dati tra comuni (REST: X-Realm, WildFly: database separati)
  • Audit trail: Tracciamento accessi e modifiche

Trasmissione Dati

  • HTTPS: Obbligatorio per tutte le comunicazioni esterne
  • Mutual TLS: Per integrazioni PA
  • VPN: Per comunicazione MCTC (FTP over VPN)
  • Cifratura at-rest: Database cifrato a livello infrastruttura

File Protetti

I seguenti file contengono o possono contenere dati sensibili e non devono mai essere committati in Git:

Pattern Contenuto
.env Variabili ambiente con credenziali
*.key, *.pem, *.p12 Certificati e chiavi private
keycloak.json Configurazione client Keycloak
credentials* File credenziali
persistence.xml Contiene riferimenti JNDI (protetto da hook)
quartz.properties Configurazione scheduler (protetto da hook)

Diritti dell'Interessato (GDPR)

Il sistema deve supportare i seguenti diritti:

  • Accesso (art. 15): Esportazione dati personali dell'interessato
  • Rettifica (art. 16): Correzione dati anagrafici
  • Cancellazione (art. 17): Con limiti per obblighi di legge (conservazione verbali)
  • Portabilita (art. 20): Esportazione in formato strutturato

La conservazione dei dati sanzionatori e soggetta ai termini di legge (art. 209 CdS e normativa archivistica).

Implementazione Crittografica

AES — Cifratura Dati (Cript.java)

La classe Cript in MLib/src/com/mdatasystem/util/crypto/ fornisce cifratura/decifratura AES.

Parametro Valore Note
Algoritmo AES Cipher.getInstance("AES")
Modalita ECB (default Java) Nessun IV, cifratura deterministica
Key size 128 bit SHA-256 troncata ai primi 16 byte
Padding PKCS5 (default)
Key derivation SHA-256(password) troncata Nessun salt, nessuna iterazione
// Cript.java — derivazione chiave
private static SecretKeySpec getSecret(String pwd) {
    byte[] key = Arrays.copyOf(
        Hash.sha256(pwd.getBytes(CHARSET)),
        16  // solo i primi 128 bit di SHA-256
    );
    return new SecretKeySpec(key, "AES");
}

// Cifratura
Cipher cipher = Cipher.getInstance("AES");  // default: AES/ECB/PKCS5Padding
cipher.init(Cipher.ENCRYPT_MODE, getSecret(password));
return Base64.encodeBase64String(cipher.doFinal(input));

Vulnerabilita Note

  • ECB mode: Blocchi di plaintext identici producono ciphertext identici — pattern analysis possibile
  • Nessun IV: La cifratura e deterministica (stesso input = stesso output)
  • Key derivation debole: SHA-256 senza salt ne iterazioni
  • Raccomandazione: Migrare ad AES-GCM con IV random e PBKDF2 per derivazione chiave

JWT / PDND — Autenticazione Servizi PA

Per l'integrazione con PDND (Piattaforma Digitale Nazionale Dati), il sistema usa JWT firmati con RS256.

Classi coinvolte:

Classe Package Ruolo
TokenUtils it.mdatasystem.mlib.rest.pdnd Gestione chiavi RSA (lettura PEM, PKCS8, generazione)
ClientAssertion it.mdatasystem.mlib.rest.pdnd Creazione JWT client assertion

Flusso di autenticazione PDND:

sequenceDiagram
    participant SGV as SGV GE.CO
    participant PDND as PDND Auth Server
    participant PA as Servizio PA

    SGV->>SGV: Carica chiave privata RSA (PKCS8/PEM)
    SGV->>SGV: Crea JWT (ClientAssertion)<br/>RS256, claims: iss, sub, aud, exp, jti, purposeId
    SGV->>PDND: POST /token<br/>client_assertion=JWT
    PDND-->>SGV: access_token (Bearer)
    SGV->>PA: API call<br/>Authorization: Bearer <token>
    PA-->>SGV: Response

Claims JWT:

Claim Tipo Descrizione
iss Standard Identificativo client (client_id PDND)
sub Standard Subject (uguale a issuer)
aud Standard URL del token endpoint PDND
iat Standard Issued-at timestamp
exp Standard Expiration timestamp (iat + ttlMillis)
jti Standard JWT ID univoco (UUID)
kid Custom Key ID della chiave pubblica registrata su PDND
purposeId Custom ID della finalita di accesso registrata su PDND
typ Header Tipo token (JWT)
alg Header Algoritmo firma (RS256)

Chiavi RSA: Conservate nel filesystem del server WildFly (jboss.server.config.dir), formato PKCS8/PEM.

Tabella Riassuntiva Crittografia

Componente Algoritmo Uso Sicurezza
Password hashing SHA-512 (singolo passaggio) Login operatori Debole
Cifratura dati AES-128-ECB Dati sensibili at-rest Debole
Firma JWT PDND RS256 (RSA + SHA-256) Autenticazione servizi PA Adeguata
mTLS X.509 / TLS 1.2+ Integrazioni PA Adeguata
Firma documenti BouncyCastle + DocFly Firma digitale PDF Adeguata
File integrity MD5 Deduplicazione documenti Debole (collision)

Security Headers

Stato Attuale

SGV GE.CO non configura security headers a livello applicativo. La responsabilita e delegata al reverse proxy o alla configurazione WildFly.

Headers raccomandati (da configurare sul reverse proxy):

Header Valore Raccomandato Stato
Strict-Transport-Security max-age=31536000; includeSubDomains Da configurare
X-Content-Type-Options nosniff Da configurare
X-Frame-Options SAMEORIGIN Da configurare
Content-Security-Policy default-src 'self' Da configurare
X-XSS-Protection 1; mode=block Da configurare
Referrer-Policy strict-origin-when-cross-origin Da configurare

Vaadin 7 e CSP

Vaadin 7 utilizza inline JavaScript e CSS che richiedono 'unsafe-inline' e 'unsafe-eval' nella Content-Security-Policy. Una CSP restrittiva e possibile solo dopo la migrazione a Vaadin 24+.