Configuración de TLS 1.3

Se aplica a: SQL Server 2022 (16.x) y versiones posteriores.

En este artículo se explica lo siguiente:

  1. Configuración de una instancia de SQL Server 2022 (16.x) para usar la seguridad de la capa de transporte (TLS) 1.3 y TLS 1.2
  2. Compruebe que los protocolos están operativos
  3. Desactive protocolos antiguos y no seguros, incluyendo TLS 1.0 y 1.1

Requisitos

La compatibilidad de TLS 1.3 en SQL Server 2022 (16.x) requiere:

  • Windows Server 2022
  • SQL Server 2022 (16.x) con actualización acumulativa 1 y posterior
  • La instancia de SQL Server usa TCP/IP como protocolo de red
  • Un certificado de servidor X.509 válido instalado junto con su clave privada

Importante

En este documento se supone que los requisitos incluyen TLS 1.3 y TLS 1.2 a corto plazo, y solo TLS 1.3 a largo plazo.

SQL Server y TLS

SQL Server no realiza operaciones TLS por sí mismo, sino que Windows realiza este trabajo mediante el SSP Schannel. Schannel es un proveedor de soporte técnico de seguridad (SSP) que contiene y expone la implementación de Microsoft de protocolos de seguridad estándar de Internet, como TLS. Schannel es para Windows lo que OpenSSL es para Linux.

La configuración de TLS para SQL Server requiere la configuración de TLS para Windows.

Con SQL Server 2022 (16.x) en Windows Server 2022, SQL Server admite TLS 1.0, 1.1, 1.2 y 1.3. Para comprobarlo, use el código de .NET disponible en GitHub en TlsTest. La salida de esta herramienta tiene un aspecto similar al siguiente:

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

Configuración de Windows para usar solo TLS 1.2 y TLS 1.3

Windows tiene un conjunto de claves del Registro bajo HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL que controlan las versiones del protocolo TLS, así como conjuntos de cifrado. En este escenario, solo importan las versiones del protocolo que afectan a los servidores, ya que la instancia de SQL Server actúa como servidor.

El siguiente script de PowerShell actualiza el registro para habilitar o inhabilitar TLS 1.0 y TLS 1.1 cuando lo usan los servidores:

Advertencia

Antes de continuar, realice una copia de seguridad del registro. Esto le permitirá restaurar el registro en el futuro, si es necesario.

# 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."
}

Este código está disponible en GitHub en set-reset-tls.ps1.

Una vez ejecutado este script, reinicie el proceso de SQL Server para que la nueva configuración de TLS entre en vigor. Si ahora ejecuta el código mencionado al principio del artículo, devuelve:

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

Observe que SSL 2.0, SSL 3.0, TLS 1.0 y TLS 1.1 no se pueden conectar, pero TLS 1.2 y TLS 1.3 sí.

Después de la actualización del Registro, Windows y esta instancia de SQL Server solo permiten conexiones TLS 1.2 y TLS 1.3. Más adelante, cuando más clientes admitan TLS 1.3, también puede inhabilitar TLS 1.2.

Establecer la instancia de SQL Server para forzar el cifrado estricto

El último paso es configurar la instancia para que use Force Strict Encryption. Con Force Strict Encryption, la instancia de SQL usa una versión compatible del flujo de datos tabular (TDS 8.0 o posterior).

Use Administrador de configuración de SQL Server para establecer esta configuración.

  1. Expanda la opción Configuración de red de SQL Server

  2. Haga clic con el botón derecho en Protocolos para<instance name> y seleccione Propiedades

    Un nombre de instancia predeterminado es MSSQLSERVER.

  3. En la pestaña Marcas, en cifrado Force Strict, introduzca el valor Sí.

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

Comprobación de la seguridad

En esta sección se muestra cómo usar Wireshark, OpenSSL y Nmap para comprobar el cifrado.

Wireshark

Puede usar analizadores de protocolos de red para determinar la versión del protocolo TLS y el conjunto de cifrado acordado. Es posible que encuentre algunos datos confusos. En la captura de pantalla siguiente de Wireshark se muestra que el paquete es una capa de registro TLS 1.3, pero la versión del protocolo es TLS 1.2 y la versión del protocolo de enlace también es TLS 1.2. Esto forma parte de la especificación TLS 1.2 y es correcta y esperada. La versión del protocolo acordado está en la sección Extensiones y, como puede ver, en supported_versions aparece TLS 1.3.

Screenshot of the TLS extension section.

OpenSSL

También puede usar openssl para detectar la información del TLS acordado.

Use el comando siguiente:

openssl s_client 127.0.0.1:1433

El comando devuelve resultados como:

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 versión actual de Nmap, versión 7.94, parece no detectar TLS 1.3 al usar:

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