Настройка TLS 1.3

Область применения: SQL Server 2022 (16.x) и более поздних версий

В статье описывается выполнение следующих задач:

  1. Настройка экземпляра SQL Server 2022 (16.x) для использования протокола TLS 1.3 и TLS 1.2
  2. Убедитесь, что протоколы работают
  3. Отключение старых небезопасных протоколов, включая TLS 1.0 и 1.1

Требования

Требуется поддержка TLS 1.3 в SQL Server 2022 (16.x):

  • Windows Server 2022
  • SQL Server 2022 (16.x) с накопительным обновлением 1 или более поздней версии
  • Экземпляр SQL Server использует TCP/IP в качестве сетевого протокола.
  • Допустимый сертификат сервера X.509, установленный вместе с закрытым ключом

Внимание

В этом документе предполагается, что требования включают tls 1.3 и TLS 1.2 в краткосрочной перспективе и только TLS 1.3 в долгосрочной перспективе.

SQL Server и TLS

SQL Server не выполняет сами операции TLS, а эта работа выполняется Windows с помощью Schannel SSP. Schannel — это поставщик поддержки безопасности (SSP), содержащий и предоставляющий корпорацию Майкрософт реализацию стандартных протоколов безопасности Интернета, таких как TLS. Schannel — это Windows, что OpenSSL — это Linux.

Для настройки TLS для SQL Server требуется настройка TLS для Windows.

С SQL Server 2022 (16.x) в Windows Server 2022 SQL Server поддерживает TLS 1.0, 1.1, 1.2 и 1.3. Чтобы проверить это, используйте код .NET, доступный в GitHub в TlsTest. Выходные данные средства выглядят следующим образом:

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

Настройка Windows только для использования TLS 1.2 и TLS 1.3

Windows содержит набор разделов реестра под HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL управлением версий протокола TLS, а также наборов шифров. В этом сценарии только версии протокола, влияющие на серверы, так как экземпляр SQL Server выступает в качестве сервера.

Следующий скрипт PowerShell обновляет реестр, чтобы включить или отключить TLS 1.0 и TLS 1.1 при использовании серверами:

Предупреждение

Прежде чем продолжить, создайте резервную копию реестра. При необходимости вы сможете восстановить реестр.

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

Этот код доступен в GitHub.

После запуска этого скрипта перезапустите процесс SQL Server, чтобы новые параметры TLS вступили в силу. Если вы запускаете код, упомянутый в начале статьи, он возвращает следующее:

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

Обратите внимание, что протокол SSL 2.0, SSL 3.0, TLS 1.0 и TLS 1.1 не удалось подключиться, но как TLS 1.2, так и TLS 1.3 успешно.

После обновления реестра Windows и этого экземпляра SQL Server разрешают подключения TLS 1.2 и TLS 1.3. Позже, когда больше клиентов поддерживают TLS 1.3, можно также отключить TLS 1.2.

Установка экземпляра SQL Server для принудительного строгого шифрования

Последним шагом является установка используемого экземпляра Force Strict Encryption. При использовании Force Strict Encryptionэкземпляра SQL используется поддерживаемая версия табличного потока данных (TDS 8.0 или более поздней версии).

Используйте диспетчер конфигурации SQL Server, чтобы задать этот параметр.

  1. Развертывание конфигурации сети SQL Server

  2. Щелкните правой кнопкой мыши протоколы <instance name>и выберите пункт "Свойства"

    Имя экземпляра по умолчанию — MSSQLSERVER.

  3. На вкладке "Флаги" задайте для принудительного шифрования значение "Да"

    Снимок экрана: элемент управления пользовательского интерфейса для диспетчер конфигурации SQL Server, диалоговое окно настройки протоколов.

Проверка безопасности

В этом разделе показано, как использовать Wireshark, OpenSSL и Nmap для проверки шифрования.

Wireshark

Вы можете использовать сетевые sniffers для определения версии протокола TLS и согласованного набора шифров. Некоторые данные могут быть запутанными. Если вы посмотрите на снимок экрана ниже из Wireshark, он показывает, что пакет является уровнем записи TLS версии 1.3, но версия протокола TLS 1.2, а версия протокола подтверждения также TLS 1.2. Это все часть спецификации TLS 1.2 и является правильной и ожидаемой. Согласованная версия протокола находится в разделе "Расширения", и, как видно, supported_versions — TLS 1.3.

Снимок экрана: раздел расширения TLS.

OpenSSL

Вы также можете использовать opensl для обнаружения согласованных сведений TLS.

Используйте следующую команду:

openssl s_client 127.0.0.1:1433

Результаты выполнения команды выглядят так:

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

Текущая версия Nmap версии 7.94, как представляется, не обнаруживает TLS 1.3 при использовании:

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