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+.