Configurare TLS 1.3

Si applica a: SQL Server 2022 (16.x) e versioni successive

Questo articolo spiega come:

  1. Configurare un'istanza di SQL Server 2022 (16.x) per l'uso di Transport Layer Security (TLS) 1.3 e TLS 1.2
  2. Verificare che i protocolli siano operativi
  3. Disabilitare i protocolli meno recenti e non sicuri, tra cui TLS 1.0 e 1.1

Requisiti

Il supporto di TLS 1.3 in SQL Server 2022 (16.x) richiede:

  • Windows Server 2022
  • SQL Server 2022 (16.x) con aggiornamento cumulativo 1 o versione successiva
  • L'istanza di SQL Server usa TCP/IP come protocollo di rete
  • Un certificato server X.509 valido installato insieme alla relativa chiave privata

Importante

Questo documento presuppone che i requisiti includano TLS 1.3 e TLS 1.2 a breve termine e solo TLS 1.3 a lungo termine.

SQL Server e TLS

SQL Server non esegue operazioni TLS, ma questa operazione viene eseguita da Windows tramite SSP Schannel. Schannel è un provider di supporto per la sicurezza (SSP) che contiene ed espone l'implementazione di Microsoft di protocolli di sicurezza standard Internet, ad esempio TLS. Schannel è per Windows che cos'è OpenSSL in Linux.

La configurazione di TLS per SQL Server richiede la configurazione di TLS per Windows.

Con SQL Server 2022 (16.x) in Windows Server 2022, SQL Server supporta TLS 1.0, 1.1, 1.2 e 1.3. Per verificarlo, usare il codice .NET disponibile in GitHub in TlsTest. L'output dello strumento è simile al seguente:

Trying Ssl2
Authentication failed, see inner exception.
Exception: The client and server cannot communicate, because they do not possess a common algorithm.
Trying Ssl3
Authentication failed, see inner exception.
Exception: The client and server cannot communicate, because they do not possess a common algorithm.
Trying Tls
Tls using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
Trying Tls11
Tls11 using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
Trying Tls12
Tls12 using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Trying Tls13
Tls13 using TLS_AES_256_GCM_SHA384

Configurare Windows per l'uso solo di TLS 1.2 e TLS 1.3

Windows dispone di un set di chiavi del Registro di sistema che HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL controllano le versioni del protocollo TLS e le suite di crittografia. Per questo scenario, solo le versioni del protocollo che influiscono sui server sono importanti perché l'istanza di SQL Server funge da server.

Lo script di PowerShell seguente aggiorna il Registro di sistema per abilitare o disabilitare TLS 1.0 e TLS 1.1 quando usato dai server:

Avviso

Prima di procedere, eseguire il backup del Registro di sistema. In questo modo sarà possibile ripristinare il Registro di sistema in futuro, se necessario.

# Learn more at https://learn.microsoft.com/windows-server/security/tls/tls-registry-settings?tabs=diffie-hellman
Set-StrictMode -Version Latest

$base = 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\'
$protocols = [ordered]@{
    "SSL 2.0" = $false
    "SSL 3.0" = $false
    "TLS 1.0" = $false
    "TLS 1.1" = $false
    "TLS 1.2" = $true
    "TLS 1.3" = $true
}

foreach ($version in $protocols.Keys) {

    $enabledValue = $protocols[$version]
    $path = $base + $version + '\Server'

    New-Item $path -Force | Out-Null
    New-ItemProperty -Path $path `
                     -Name 'Enabled' `
                     -Value $enabledValue `
                     -PropertyType 'DWord' `
                     -Force | Out-Null
                     
    Write-Host "$version is $enabledValue."
}

Questo codice è disponibile in GitHub all'indirizzo set-reset-tls.ps1.

Dopo aver eseguito questo script, riavviare il processo di SQL Server per rendere effettive le nuove impostazioni TLS. Se si esegue ora il codice indicato all'inizio dell'articolo, viene restituito quanto riportato di seguito:

Trying Ssl2
Authentication failed, see inner exception.
Exception: The client and server cannot communicate, because they do not possess a common algorithm.
Trying Ssl3
Authentication failed, see inner exception.
Exception: The client and server cannot communicate, because they do not possess a common algorithm.
Trying Tls
Received an unexpected EOF    or 0 bytes from the transport stream.
Exception:
Trying Tls11
Received an unexpected EOF or 0 bytes from the transport stream.
Exception:
Trying Tls12
Tls12 using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Trying Tls13
Tls13 using TLS_AES_256_GCM_SHA384

Si noti che SSL 2.0, SSL 3.0, TLS 1.0 e TLS 1.1 non riescono a connettersi, ma sia TLS 1.2 che TLS 1.3 hanno esito positivo.

Dopo l'aggiornamento del Registro di sistema, Windows e questa istanza di SQL Server consentono solo le connessioni TLS 1.2 e TLS 1.3. Successivamente, quando più client supportano TLS 1.3, è anche possibile disabilitare TLS 1.2.

Impostare l'istanza di SQL Server per forzare la crittografia rigorosa

Il passaggio finale consiste nell'impostare l'istanza per l'uso Force Strict Encryptiondi . Con Force Strict Encryption, l'istanza di SQL usa una versione supportata del flusso di dati tabulari (TDS 8.0 o versione successiva).

Usare Gestione configurazione SQL Server per impostare questa impostazione.

  1. Espandere Configurazione di rete di SQL Server

  2. Fare clic con il pulsante destro del mouse su Protocolli per<instance name> e scegliere Proprietà

    Un nome di istanza predefinito è MSSQL edizione Standard RVER.

  3. Nella scheda Flag impostare Force Strict Encryption su

    Screenshot of the UI control for SQL Server Configuration Manager, configure protocols dialog.

Verificare la sicurezza

Questa sezione illustra come usare Wireshark, OpenSSL e Nmap per verificare la crittografia.

Wireshark

È possibile usare gli sniffer di rete per determinare la versione del protocollo TLS e la suite di crittografia concordata. Si potrebbero trovare alcuni dati confusi. Se si osserva lo screenshot seguente da Wireshark, il pacchetto è un livello di record TLS v1.3, ma la versione del protocollo è TLS 1.2 e la versione del protocollo Handshake Protocol è anche TLS 1.2. Questa è una parte della specifica TLS 1.2 ed è corretta e prevista. La versione del protocollo concordata si trova nella sezione Estensioni e, come si può notare, supported_versions è TLS 1.3.

Screenshot of the TLS extension section.

OpenSSL

È anche possibile usare openssl per individuare le informazioni TLS concordate.

Utilizza il seguente comando:

openssl s_client 127.0.0.1:1433

Il comando restituisce risultati come:

Post-Handshake New Session Ticket arrived:
SSL-Session:
   Protocol   : TLSv1.3
   Cipher     : TLS_AES_256_GCM_SHA384
   Session-ID : 516D56D99088BCDE1 <snip> 098EDB1A
   Session-ID-ctx:
   Resumption PSD: B2B9CB92B59aa1 <snip> BD824CBA
   PSK identity: None

Nmap

La versione corrente di Nmap, versione 7.94, sembra non rilevare TLS 1.3 quando si usa:

nmap -sV --script ssl-enum-ciphers -p 1433 127.0.0.1.