Configurar o TLS 1.3

Aplica-se a: SQL Server 2022 (16.x) e versões posteriores

Este artigo explica como:

  1. Configurar uma instância do SQL Server 2022 (16.x) para usar o Transport Layer Security (TLS) 1.3 e o TLS 1.2
  2. Verificar se os protocolos estão operacionais
  3. Desative protocolos mais antigos e inseguros, incluindo TLS 1.0 e 1.1

Requerimentos

O suporte a TLS 1.3 no SQL Server 2022 (16.x) requer:

  • Windows Server 2022
  • SQL Server 2022 (16.x) com Atualização Cumulativa 1 ou posterior
  • A instância do SQL Server usa TCP/IP como um protocolo de rede
  • Um certificado de servidor X.509 válido instalado junto com sua chave privada

Importante

Este documento pressupõe que seus requisitos incluem TLS 1.3 e TLS 1.2 a curto prazo e apenas TLS 1.3 a longo prazo.

SQL Server e TLS

O SQL Server não executa operações TLS em si, mas esse trabalho é executado pelo Windows usando SSP Schannel. O Schannel é um SSP (Security Support Provider) que contém e expõe a implementação pela Microsoft de protocolos de segurança padrão da Internet, como TLS. Schannel é para o Windows o que o OpenSSL é para o Linux.

A configuração do TLS para SQL Server requer a configuração do TLS para Windows.

Com o SQL Server 2022 (16.x) no Windows Server 2022, o SQL Server oferece suporte a TLS 1.0, 1.1, 1.2 e 1.3. Para verificar isso, use o código .NET disponível no GitHub em TlsTest. A saída da ferramenta tem esta aparência:

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

Configurar o Windows para usar apenas TLS 1.2 e TLS 1.3

O Windows tem um conjunto de chaves do Registro sob HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL que controlam versões do protocolo TLS, bem como pacotes de codificação. Para esse cenário, somente as versões de protocolo que afetam os servidores são importantes, porque a instância do SQL Server atua como um servidor.

O seguinte script do PowerShell atualiza o Registro para habilitar ou desabilitar o TLS 1.0 e o TLS 1.1 quando usados por servidores:

Advertência

Antes de continuar, faça backup do registro. Isso permitirá que você restaure o registro no futuro, se necessário.

# Learn more at https://learn.microsoft.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."
}

Este código está disponível em GitHub.

Depois de executar esse script, reinicie o processo do SQL Server para que as novas configurações de TLS entrem em vigor. Se você executar agora o código mencionado no início do artigo, ele retornará:

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 e TLS 1.1 não conseguem se conectar, mas TLS 1.2 e TLS 1.3 são bem-sucedidos.

Após a atualização do Registro, o Windows e esta instância do SQL Server só permitem conexões TLS 1.2 e TLS 1.3. Mais tarde, quando mais clientes oferecerem suporte ao TLS 1.3, você também poderá desabilitar o TLS 1.2.

Definir a instância do SQL Server para forçar a criptografia estrita

A etapa final é definir a instância para usar Force Strict Encryption. Com Force Strict Encryption, a instância SQL usa uma versão suportada do fluxo de dados tabulares (TDS 8.0 ou posterior).

Use o Gestor de Configuração do SQL Server para definir essa configuração.

  1. Expanda Configuração de Rede do SQL Server

  2. Clique com o botão direito do mouse em Protocolos de para<instance name>e selecione Propriedades

    Um nome de instância padrão é MSSQLSERVER.

  3. Na guia Indicadores, defina Forçar Criptografia Estrita como Sim

    Captura de ecrã do controlo da interface de utilizador do Gestor de Configuração do SQL Server, caixa de diálogo de configuração de protocolos.

Verificar a segurança

Esta seção demonstra como usar o Wireshark, OpenSSL e Nmap para verificar a criptografia.

Wireshark

Você pode usar sniffers de rede para determinar a versão do protocolo TLS e o conjunto de cifra acordado. Você pode achar alguns dados confusos. Se você olhar para a captura de tela abaixo do Wireshark, ela mostra que o pacote é uma camada de registro TLS v1.3, mas a versão do protocolo é TLS 1.2 e a versão do protocolo Handshake também é TLS 1.2. Tudo isso faz parte da especificação TLS 1.2 e é correto e esperado. A versão do protocolo acordada está na seção Extensões e, como você pode ver, supported_versions é TLS 1.3.

Captura de tela da seção de extensão TLS.

OpenSSL

Você também pode usar o openssl para descobrir as informações TLS acordadas.

Use o seguinte comando:

openssl s_client 127.0.0.1:1433

O comando retorna 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

A versão atual do Nmap, versão 7.94, parece não detetar TLS 1.3 ao usar:

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