Написать эту статью подоткнул тот факт, что Windows Server 2016, установленный из коробки, почему-то не имеел TLS протокол, включенный как основный по умолчанию, в то время как SSL3.0 был включен. Приводит это к разным последствиям, как для безопасности, так и для функционирования различных сервисов и приложений.

Проблемы версий протоколов SSL и TLS и совместимости приложений

Для начала рассмотрим проблемы связанные с версиями SSL протоколов:

  • SSL v2 небезопасен, устарел и не рекомендуется для использования. См. атаку DROWN по этому протоколу.
  • SSL v3 небезопасен и устаревший инструмент. См. атаку POODLE.
  • TLS v1.0 также является устаревшим протоколом, но на практике он все же оказывается необходим. Его основная слабость (BEAST) была смягчена в современных браузерах.
  • TLS v1.1 и TLS v1.2 оба не имеют известных проблем с безопасностью, но только v1.2 предоставляет современные криптографические алгоритмы.

SSL 2.0, SSL 3.0 и TLS 1.0 настоятельно рекомендуется отключить, так как большинство стандартов безопасности их уже давно не поддерживают (например, PCI DSS 3.1). Рекомендуемые протоколы TLS v1.1 и TLS v1.2 с актуальными алгоритмами шифрование и снятия хэшей.

В более ранних версиях Windows Servers (2008, 2012) SSL v3 все еще включен, т. е. Вам необходимо вручную отключить устаревшие протоколы. Windows Server 2016 и выше уже имеют конфигурацию SSL, которая соответствует действующим регламентам безопасности (например, SSL v2 и SSL v3 отключены).

Но и это оказывается не полной правдой. Дело в том, что использование протоколов зависит не только от системных настроек, но и от того, как написаны приложения. Например, я выяснил, что .NET приложения используют свои собственные настройки безопасности. Также известно, что если включить поддержку TLS 1.2 на SQL Server (например, применив патч https://support.microsoft.com/en-us/help/3135244/tls-1-2-support-for-microsoft-sql-server), установленный на Windows Server 2012, то приложения .NET и JAVA потеряют возможность подключаться к SQL.

Также давно известна проблема с вэб приложениями, написанными на базе интерфейса WinHTTP API. После включения TLS 1.1/1.2 они также перестают подключаться.

Службы IIS и ADFS при этом прекрасно используют новые протоколы, следуя системным настройкам. Более того, к сервисам Azure вы не сможете подключиться через TLS 1.2, но при этом, как выяснилось, Powershell даже в Windows Server 2016 использует SSL3.0 и TLS 1.0, несмотря на то, что согласно системной настройке они отключены.

Как правильно настроить TLS для разного типа приложений?

Начнем с того, что для всего есть свои реестровые ключи, однако нужно точно понимать, какой тип приложения вы хотите настроить, чтобы избежать проблем. Начну с того, что полный список доступных системных ключей в Windows 10/Windows Server 2016/2019 доступен по ссылке https://docs.microsoft.com/ru-ru/windows-server/security/tls/tls-registry-settings. Изменяя их, вы можете настроить IIS, ADFS и прочие службы. Однако, эти ключи не влияют на работу приложений .NET (и в частности, Powershell) и WinHTTP!

В чем же дело? Дело в библиотеках. IIS и ADFS используют Schannel — поставщик поддержки безопасности (SSP), реализующий стандартные протоколы проверки подлинности SSL, TLS и DTLS Internet. Интерфейс поставщика поддержки безопасности (SSPI) является интерфейсом API, используемым системами Windows для выполнения функций, связанных с безопасностью, включая проверку подлинности. В Windows все функции SSPI выполняет библиотека Schannel.dll, в которой реализованы все протоколы и наборы шифрования.

Итак, ветки реестра, которые нас интересуют:

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols — включение и отключение протоколов для Schannel.dll, как клиентских, так и серверных. Для каждого протокола — своя ветка;
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers — здесь можно изменить список и порядок просмотра (это важно!) наборов шифрования;
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp — в параметре DefaultSecureProtocols настраиваются протоколы для приложений на WinHttp API;
  • HKEY_LOCAL_MACHINE\CurrentControlSet\Control\Cryptography\ECCParameters — настройка эллиптических кривых для криптографии;
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5 — отключение MD5 шифрования для маркеров безопасности.
    Внимание! После его отключения перестает корректно работать Shаrepoint 2010! Он использует MD5 для генерации внутренних идентификаторов безопасности, поэтому не найдя её очень страдает.
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA — настройка размера пула потоков для TLS рукопожатий в HTTP.SYS (это веб серверная имплементация на ASP.NET Core, которая является альтернативой популярному веб серверу Kestrel).

Теперь пройдем по конкретным примерам и настройкам.

Отключение SSL и TLS 1.0 протоколов на системном в Schannel подробно описано в документации Microsoft. Отключить небезопасные можно как через реестр, так и с помощью Powershell.

В этой же статье ниже описано, как отключить небезопасные алгоритмы шифрования, такие как RC4.

Отключить небезопасные наборы шифрования (cipher suites) можно через параметр Functions в ключе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002.

Этот параметр является многострочным текстовым значением, который просто содержит построчный список наборов (один на строку). Удалите ненужные строки.

Полный список поддерживаемых наборов представлен на странице https://docs.microsoft.com/en-us/windows/win32/secauthn/cipher-suites-in-schannel
Будьте внимательны, список и порядок следования наборов меняется от версии к версии! Актуальный список для Windows 10 build 1903 доступен по ссылке.
Наборы шифрования

Порядок проверки наборов шифрования также удобно изменять с помощью групповых политик. Это также описано в документации.

Ну и наконец, для управления доступными наборами появились командлеты Powershell. Например, с помощью Disable-TlsCipherSuite вы можете отключить неугодный набор.

Отключение SSL для Powershell и других .NET приложений

Как я уже писал, системные настройки выше не влияют на Powershell сессии. Проверить, какие протоколы сейчас активны в вашей Powershell сессии, можно выполнив команду

[Net.ServicePointManager]::SecurityProtocol

Если в выводе команды увидите ssl30, tls, то их надо отключить.

Для этого в Windows Srver 2012 / Windows 2016 используйте ключ реестра

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 "SchUseStrongCrypto"=dword:00000001

С помощью самого Powershell это можно изменить одной командой:

New-ItemProperty -path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -name 'SchUseStrongCrypto' -value '1' -PropertyType 'DWord' -Force | Out-Null

Включение TLS 1.2 для WinHTTP

Если коротко, то в ключе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp нужно добавить параметр DefaultSecureProtocols, который в 16-ричном виде будет содержать сумму значений всех протоколов, которые необходимо включить. Например, для включения TLS 1.1 и 1.2 надо добавить значение 0x00000A00, которое будет суммой значений TLS 1.1 (0x00000200) и TLS 1.2 (0x00000800).

Готовый патч от Microsoft для исправления этого также можно скачать по ссылке KB3140245

Настройка с помощью IISCrypto

IISCrypto — это бесплатная утилита, не требующая установки, которая позволяет включить/выключить многие настройки Schannel через графический интерфейс, .NET и WinHTTP она не настраивает.

Скачать её можно с сайта разработчика без регистрации.

[Посещений: 8 125, из них сегодня: 1]

Добавить комментарий