Configurer le protocole TLS 1.3

S’applique à : SQL Server 2022 (16.x) et versions ultérieures

Cet article explique comment :

  1. Configurer une instance de SQL Server 2022 (16.x) pour utiliser le protocole TLS 1.3 et TLS 1.2
  2. Vérifier que les protocoles sont opérationnels
  3. Désactiver les protocoles plus anciens et non sécurisés, notamment TLS 1.0 et 1.1

Spécifications

La prise en charge de TLS 1.3 dans SQL Server 2022 (16.x) nécessite :

  • Windows Server 2022
  • SQL Server 2022 (16.x) avec la mise à jour cumulative 1 ou version ultérieure
  • L’instance SQL Server utilise TCP/IP comme protocole réseau
  • Un certificat de serveur X.509 valide installé avec sa clé privée

Important

Ce document part du principe que vos exigences incluent TLS 1.3 et TLS 1.2 à court terme, et uniquement TLS 1.3 à long terme.

SQL Server et le protocole TLS

SQL Server n’effectue pas d’opérations TLS elle-même, mais ce travail est effectué par Windows à l’aide du fournisseur de services partagés Schannel. Schannel est un fournisseur SSP (Security Support Provider) qui contient et expose l’implémentation par Microsoft des protocoles de sécurité norme Internet tels que TLS. Schannel est pour Windows ce qu’OpenSSL est sur Linux.

La configuration de TLS pour SQL Server nécessite la configuration de TLS pour Windows.

Avec SQL Server 2022 (16.x) sur Windows Server 2022, SQL Server prend en charge TLS 1.0, 1.1, 1.2 et 1.3. Pour vérifier cela, utilisez le code .NET disponible dans GitHub sur TlsTest. La sortie de l'outil ressemble à ceci :

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

Configurer Windows pour utiliser uniquement TLS 1.2 et TLS 1.3

Windows dispose d’un ensemble de clés de Registre sous HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL ce contrôle des versions de protocole TLS, ainsi que des suites de chiffrement. Pour ce scénario, seules les versions de protocole qui affectent les serveurs importent, car l’instance SQL Server agit en tant que serveur.

Le script PowerShell suivant met à jour le Registre pour activer ou désactiver TLS 1.0 et TLS 1.1 lorsqu’il est utilisé par les serveurs :

Avertissement

Avant de continuer, sauvegarder le Registre. Cela vous permettra de restaurer le Registre à l’avenir, si nécessaire.

# Learn more at https://video2.skills-academy.com/en-us/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."
}

Ce code est disponible sur GitHub.

Une fois ce script exécuté, redémarrez le processus serveur SQL pour que les nouveaux paramètres TLS prennent effet. Si vous exécutez maintenant le code mentionné au début de l’article, il retourne :

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

Notez que SSL 2.0, SSL 3.0, TLS 1.0 et TLS 1.1 ne parviennent pas à se connecter, mais tls 1.2 et TLS 1.3 réussissent.

Après la mise à jour du Registre, Windows et cette instance de SQL Server autorisent uniquement les connexions TLS 1.2 et TLS 1.3. Plus tard, lorsque d’autres clients prennent en charge TLS 1.3, vous pouvez également désactiver TLS 1.2.

Définir l’instance SQL Server pour forcer le chiffrement strict

La dernière étape consiste à configurer l'instance pour qu'elle utilise Force Strict Encryption. Avec Force Strict Encryption, l’instance SQL utilise une version prise en charge de tabular data stream (TDS 8.0 ou version ultérieure).

Utilisez Gestionnaire de configuration SQL Server pour définir ce paramètre.

  1. Développez Configuration réseau SQL Server

  2. Faites un clic droit sur Protocoles pour <instance name>, puis sélectionnez Propriétés.

    MSSQLSERVER est le nom de l'instance par défaut.

  3. Sous l’onglet Indicateurs, définissez Forcer le chiffrement strict sur Oui

    Capture d’écran du contrôle de l’interface utilisateur pour le Gestionnaire de configuration SQL Server, dialogue de configuration des protocoles.

Vérifier la sécurité

Cette section montre comment utiliser Wireshark, OpenSSL et Nmap pour vérifier le chiffrement.

Wireshark

Vous pouvez utiliser des niffers réseau pour déterminer la version du protocole TLS et la suite de chiffrement acceptée. Vous pouvez trouver des données déroutantes. Si vous examinez la capture d’écran ci-dessous à partir de Wireshark, il indique que le paquet est une couche d’enregistrements TLS v1.3, mais la version du protocole est TLS 1.2 et la version du protocole de négociation est également TLS 1.2. Cela fait partie de la spécification TLS 1.2 et est correcte et attendue. La version de protocole acceptée se trouve dans la section Extensions et, comme vous pouvez le voir, supported_versions est TLS 1.3.

Capture d’écran de la section extension TLS.

OpenSSL

Vous pouvez également utiliser openssl pour découvrir les informations TLS acceptées.

Utilisez la commande suivante :

openssl s_client 127.0.0.1:1433

La commande retourne des résultats similaires à ce qui suit :

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 version actuelle de Nmap, version 7.94, semble ne pas détecter TLS 1.3 lors de l’utilisation :

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