Introduzione alla crittografia delle connessioni in SQL Server

Datamaze
23.10.24 03:27 PM Comment(s)
Con l’articolo di oggi tentiamo di chiarire i punti cardine per ottenere una connessione e traffico dati criptato verso un’istanza SQL Server. Esistono online già molti articoli Microsoft e diverse trattazioni di esperti: nel nostro caso si vuole fare un’introduzione basilare ma efficace per chi per vuole avvicinarsi alla tematica, fissando cosa è necessario sapere e saper fare fare per iniziare.               
Se vi è capitato di installare o aggiornare ad una versione recente di SQL Server Management Studio (20.x) una delle modifiche più evidenti alla maschera iniziale rispetto alle vecchie versioni è la sezione Connection Security che:               
  • viene mostrata di default senza necessità di espandere la maschera
  • ha la tipologia di Encryption impostata al primo avvio come “Mandatory”. 
Connect to Server

Cliccando “Connect” in un’istanza in cui non è configurata la crittografia delle connessioni otterremo un errore del tutto simile a questo: 

Cannot connect to server
e per potersi collegare è necessario modificare il parametro Encryption a “Optional”. 

Questo esempio sottolinea come la stessa Microsoft incoraggi il potenziamento della sicurezza con connessioni crittografate (Tematica ancora più centrale in Azure e nei servizi in cloud).

Per iniziare: cos'è la Crittografia della Connessione (Connection Encryption)?

La crittografia della connessione in SQL Server protegge i dati in transito tra il client e il server, garantendo che le informazioni scambiate non possano essere intercettate o alterate da attori malintenzionati. Anche qualora questi dati venissero intercettati sarebbero inutilizzabili senza una chiave.               

Una connessione protetta in SQL Server utilizza il protocollo TLS (Transport Layer Security) per criptare i dati in transito. 

Perché è importante?

  • Protezione dei dati sensibili: le informazioni sensibili, come le credenziali degli utenti e i dati aziendali critici, sono protette da intercettazioni durante la trasmissione. 
  • Integrità dei dati: la crittografia garantisce che i dati non vengano alterati durante il trasferimento. 
  • Conformità normativa: molte normative di sicurezza dei dati, come GDPR, HIPAA (Health Insurance Portability and Accountability Act), e PCI-DSS (Payment Card Industry Data Security Standard), richiedono la crittografia dei dati in transito. 

In generale, soprattutto in ambienti critici e con dati sensibili, è vitale scoraggiare i malintenzionati aggiungendo questo strato di protezione. 

Come si implementa Crittografia della Connessione (Connection Ecryption)?

Il passaggio essenziale per configurare una connessione criptata in SQL Server è quello di ottenere un certificato SSL/TLS.  

Ci sono diverse possibilità per ottenere un certificato, tipicamente: 

  • Può essere emesso da un'autorità di certificazione (Certification Authority o brevemente CA) riconosciuta e approvata da Microsoft (tipicamente un servizio a pagamento).

  • Internamente alla propria organizzazione, se si prevendono CA interne al proprio perimetro aziendale.

  •  In proprio tramite la generazione di certificato auto firmato.

 

Il certificato emesso deve avere le seguenti caratteristiche per funzionare correttamente con SQL Server: 

  • Key Usage (KU): Il certificato deve avere l'attributo "Key Usage" che include "Digital Signature" e "Key Encipherment". 

  • Enhanced Key Usage (EKU): Il certificato deve includere l'attributo "Server Authentication" (OID 1.3.6.1.5.5.7.3.1). 

  • Nome Comune (CN) o Subject Alternative Name (SAN): Il nome comune (CN) del certificato deve corrispondere al nome del server SQL o deve essere presente nel campo Subject Alternative Name (SAN). 

  • Algoritmi di Crittografia: SQL Server supporta certificati che utilizzano algoritmi di crittografia come RSA. È importante che la lunghezza della chiave sia adeguata (ad esempio, almeno 2048 bit per RSA). 

 

Attenzione, è buona prassi impostare nel CN l’esatto FQDN (Fully Qualified Domain Name) dell’istanza. In alternativa ma obbligatoriamente va impostato come possibile alternativa (SAN) se vogliamo che client in fase di connessione validi il certificato.


Ho ottenuto il certificato, ora?

Un certificato si presenta come un file o una coppia (certificato e chiave privata), tipicamente i formati più comuni sono i seguenti:  

  • Formato PFX (PKCS #12) (.pfx o .p12): è il formato preferito per importare certificati in SQL Server perché consente di gestire facilmente la chiave privata associata al certificato. Durante l'importazione, SQL Server richiederà la password associata al file PFX per sbloccare la chiave privata. 

  • Formato CER/CRT (X.509) (.cer o .crt): sebbene SQL Server possa utilizzare certificati in questo formato, essi devono essere combinati con la chiave privata corrispondente. Questo formato da solo non è sufficiente per configurare SQL Server per le connessioni SSL/TLS. 

  • Formato PEM (.pem): SQL Server non supporta direttamente l'importazione di file PEM. Tuttavia, è possibile convertire un file PEM in un file PFX, che è supportato, utilizzando strumenti come OpenSSL. 

  • Formato DER (.der): come il formato PEM, SQL Server non supporta direttamente l'importazione di file DER. Tuttavia, questi file possono essere convertiti in un formato PFX utilizzabile. 

  

Qualora avessimo in nostro possesso certificato e chiave private disgiuntamente è necessario accoppiarli con uno strumento apposito, anche in questo caso OpenSSL può essere un candidato. 

 

Il file (certificato) va “agganciato” all’istanza SQL Server attraverso SQL Server Configuration Manager: esiste la scheda “Certificate” dedicata allo scopo.


L’opzione è raggiungibile alla voce da SQL Server Network Configuration - Protocols for MSSQLSERVER - Tasto destro "Properties". 

Properties connection encryption

Il certificato che vogliamo associare all’istanza deve essere una voce disponibile nel menu a tendina Certificate; per comparire deve essere stato correttamente importato. 

 

Se la versione di SQL Server è 2019 o superiore è possibile importarlo direttamente tramite il pulsante dedicato “Import” seguendo la procedura guidata. Per versioni precedenti, ma in generale in ogni caso, è possibile procedere all’importazione attraverso la Windows Management Console. 

Per un ulteriore approfondimento su questa operazione si rimanda alla documentazione ufficiale Microsoft qui.


Se il certificato, una volta importato, rispecchia tutti i requisiti necessari comparirà come voce nel menu tendina. Qualora esistessero più certificati con lo stesso nome è possibile selezionarne uno alla volta e verificarne i dettagli attraverso il tasto “View…” per selezionare quello corretto. 

Certificate on server

Cliccando “Apply” il certificato verrà associato all’istanza, apparirà quindi un messaggio che ci indica che le modifiche saranno effettive solo al primo riavvio del servizio MSSQL. 

Riavvio SQL Server

Nel caso il file venga importato tramite MMC (Windows Management Console) è necessario assicurarsi che l’utenza che esegue il servizio di SQL Server sia in possesso dei permessi sul certificato stesso. Sintomo della mancanza di permessi è il crash dell’istanza in fase di avvio del servizio.

MMC

Ho attivato il certificato e riavviato l’istanza, cosa cambia?

La risposta è: poco o nulla per un client che già prima si collegava correttamente in quanto SQL accetterà connessioni criptate a ma allo stesso tempo anche quelle non criptate.

Per aumentare la sicurezza e far sì che SQL accetti solamente connessioni criptate va impostato il flag “Force Encryption” a “Yes” nella prima scheda Flags. Anche in questo caso, se la modifica viene fatta in tempi diversi all’assegnazione del certificato, è richiesto un nuovo riavvio dell’istanza per avere effetto. 
Protocols for MSSQLServer
Nelle versioni più recenti di SQL Server è possibile, inoltre, abilitare Force Strict Encryption che utilizza il protocollo TDS 8.0 aggiornato agli standard di sicurezza più moderni. Attivando questa modalità si deve essere sicuri che anche i driver client e applicativi supportino il protocollo.               
 

Lato client cosa è necessario fare?

Lato server abbiamo seguito i passi necessari per attivare l’encryption. Una domanda che sovente viene posta è: che impatto ha questo sul client e quali accorgimenti è necessario attuare? 

Questi possono variare dalla tipologia e dalla versione dei driver di connessione utilizzati. 

Genericamente (soprattutto se vogliamo SOLO connessioni criptate) possiamo riassumere i controlli necessari in: 

 

  •  Utilizzo di un Driver di Connessione Compatibile: sembra banale in quanto anche le tecnologie meno recenti supportano largamente l’encryption ma vale la pena sempre fare una verifica con la documentazione ufficiale. In caso di applicativi è necessario determinare quale sia la tipologia e della versione del connettore.
  • Configurazione della Stringa di Connessione:spesso, soprattutto sui driver meno recenti, va specificato che si intende stabilire una connessione criptata. La stringa di connessione va quindi modificata in maniera da esplicitare l’indicazione tipicamente con l’aggiunta di una parola chiave. 
    Es. In Ado.Net (C#) va aggiunta alla stringa di connessione: Encrypt=True; 

    Se si tratta di applicativi di qui non abbiamo controllo diretto va verificato se l’opzione è configurabile in qualche maniera.

    N
    elle versioni più recenti può essere vero anche il contrario: Entity Framework Core 7.0 per esempio se non specificato imposta la connection encryption di default a True obbligando a modificare la stringa esplicitamente a false se la crittografia non è supportata dall’istanza. 
  • Certificato del Server:se l’istanza utilizza un certificato auto firmato o un certificato emesso da una CA interna, il certificato radice (root certificate) deve essere installato nel client. Questo è necessario perché i certificati non riconosciuti da CA pubbliche non saranno considerati attendibili dal client, cosa necessaria per iniziare la catena di validazione prevista dal TLS/SSL. 

Verifica delle connessioni in ingresso a SQL Server

Per verificare lo stato delle connessioni sull’istanza è possibile eseguire la seguente query:

SELECT *
FROM sys.dm_exec_connections
Interrogando la tabella dm_exec_connections si ottengono informazioni sulle connessioni che sono attualmente attive sull’istanza. Il campo di nostro interesse è “encrypt_option”: il valore atteso per una connessione criptata è “true”. Va da sé che, se l’istanza ha attiva l’opzione “Force Encryption” il valore atteso per tutte le righe è ovviamente “TRUE”. 

L’opzione Trust Server Certificate

Facendo i primi passi in questo mondo e magari leggendo qua e là ci si imbatte spesso nella possibilità di abilitare il parametro Trust Server Certificate, spesso indicato come miracolosa  soluzione dei mille e uno problemi di connessione quando l’istanza impone l’encryption. 

Vale la pena fare in minimo di chiarezza: abilitando questa opzione il client dichiara di “fidarsi” a priori di qualsiasi certificato presente sull’istanza. Questo fa sì che la connessione verso il server rimanga criptata ma non venga validato esponendo il client a maggiori rischi. 

La casistica è particolarmente vulnerabile ad attacchi “Man in the Middle”: un attaccante potrebbe intercettare il traffico tra il client e il server e presentare un certificato falso. Poiché il client accetta qualsiasi certificato senza verifica, l'attaccante potrebbe decrittografare, leggere e modificare i dati trasmessi tra il client e il server. 

Trust Server Certificate è comunemente accettato in ambienti di sviluppo/collaudo ma sconsigliato in ambienti ufficiali o di produzione, soprattutto se in qualche modo esposti al di fuori del perimetro interno (es. servizi cloud). 

Anche per  “Trust Server Certificate” è necessario modificare la stringa di connessione lato client e/o avere l’opzione disponibile lato applicativo (come avviene per SQL Management Studio per esempio). In questo caso lato server non sono richieste modifiche. 

Lato client è necessario fare attenzione al nome del server indicato nella stringa di connessione. Nel caso il server accetti solo connessioni criptate e sia attiva la validazione del certificato (Trust Server Certificate non è attivo) il server va indicato esattamente come il CN o uno dei SAN presenti nel certificato.

Vediamo un esempio. Sul server “server01” è presente il un certificato: comunemente nel CN è riportato l’FQDN completo del server ovvero “server01.mydomain.local” e nelle SAN eventuali DNS associati. 

Nella stringa di connessione, anche se la connessione non proviene dallo stesso dominio, non basta specificare server01 ma va impostato per intero. 

Tipicamente l’errore ricevuto è simile a questo.
Connect to server error

Anche una connessione locale all’istanza deve seguire la stessa regola, non funziona nemmeno “localhost”.


I certificati hanno una data di scadenza

È bene ricordarsi che un certificato ha una data di fine validità, alla scadenza quindi la validazione dello stesso fallirà bloccando le connessioni in ingresso. È buona norma attrezzarsi in tal senso ed essere avvisati per evitare disservizi. 


In conclusione

L’articolo non ha la pretesa di analizzare in modo esaustivo ogni aspetto tecnico e normativo ma è tentativo di fissare alcuni punti chiave per il lettore che si approccia per le prime volte all’argomento. 

Non nascondo che anche chi vi scrive all’inizio del percorso si è trovato sommerso da una certa mole di informazioni e situazioni, tra cui è necessario destreggiarsi. Le casistiche proposte rappresentano un caso abbastanza classico, rimandiamo a futuri approfondimenti l’analisi di scenari più complessi. 

di Riccardo Trattenero, pubblicato il 23 ottobre 2024

Riferimenti: