다음을 통해 공유


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을 포함하는 이전의 비보안 프로토콜을 사용 중지하는 방법

요구 사항

SQL Server 2022(16.x)에 TLS 1.3을 지원하려면 다음이 필요합니다.

  • Windows Server 2022
  • SQL Server 2022(16.x) 및 누적 업데이트 1 이상
  • SQL Server 인스턴스에서 TCP/IP를 네트워크 프로토콜로 사용
  • 유효한 X.509 서버 인증서가 프라이빗 키와 함께 설치됨

Important

이 문서에서는 사용자의 요구 사항에 단기적으로는 TLS 1.3 및 TLS 1.2가 모두 포함되고 장기적으로는 TLS 1.3만 포함된다고 가정합니다.

SQL Server 및 TLS

SQL Server에서 TLS 작업 자체를 수행하는 것이 아니라, Windows에서 Schannel SSP를 사용하여 이 작업을 수행합니다. Schannel은 TLS와 같이 Microsoft의 인터넷 표준 보안 프로토콜 구현을 포함하고 노출하는 SSP(Security Support Provider)입니다. Schannel은 Windows를, OpenSSL은 Linux를 지원합니다.

SQL Server용 TLS를 구성하려면 Windows용 TLS를 구성해야 합니다.

Windows Server 2022에서 SQL Server 2022(16.x)를 사용 시, SQL Server는 TLS 1.0, 1.1, 1.2 및 1.3을 지원합니다. 이를 확인하려면 TlsTest의 GitHub에서 사용할 수 있는 .NET 코드를 사용합니다. 이 도구는 다음과 같은 결과를 출력합니다.

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에는 암호화 스위트뿐만 아니라 TLS 프로토콜 버전을 제어하는 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL의 레지스트리 키 집합이 있습니다. 이 시나리오에서는 SQL Server 인스턴스가 서버 역할을 하므로, 서버에 영향을 주는 프로토콜 버전만이 중요합니다.

다음 PowerShell 스크립트는 서버에서 TLS 1.0 및 TLS 1.1이 사용될 경우 이를 사용하거나 사용하지 않도록 레지스트리를 업데이트합니다.

Warning

계속 하기 전에 레지스트리를 백업합니다. 이렇게 하면 필요한 경우 나중에 레지스트리를 복원할 수 있습니다.

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

이 코드는 GitHub에서 사용할 수 있습니다.

이 스크립트를 실행한 후, 새 TLS 설정이 적용되도록 SQL Server 프로세스를 다시 시작합니다. 이제 문서의 시작 부분에 언급된 코드를 실행하면 다음이 반환됩니다.

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(Tabular Data Stream, TDS 8.0 이상)을 사용합니다.

SQL Server 구성 관리자를 사용하여 이 설정을 설정합니다.

  1. SQL Server 네트워크 구성 확장

  2. <instance name>에 대한 프로토콜을 마우스 오른쪽 단추로 클릭한 다음 속성 선택

    기본 인스턴스 이름은 MSSQLSERVER입니다.

  3. 플래그 탭에서 엄격한 암호화 강제 적용로 설정

    SQL Server 구성 관리자의 UI 컨트롤, 프로토콜 구성 대화 상자의 스크린샷입니다.

보안 확인

이 섹션에서는 Wireshark, OpenSSL 및 Nmap을 사용하여 암호화를 확인하는 방법을 설명합니다.

Wireshark

네트워크 스니퍼를 사용하여 TLS 프로토콜 버전 및 합의된 암호화 스위트를 확인할 수 있습니다. 일부 데이터로 인해 혼란스러울 수 있습니다. 아래의 Wireshark 스크린샷은 패킷이 TLS v1.3 레코드 계층이지만 프로토콜 버전은 TLS 1.2이고 핸드셰이크 프로토콜 버전도 TLS 1.2임을 보여 줍니다. 이는 모두 TLS 1.2 사양의 일부로 올바르고 예상되는 사양입니다. 합의된 프로토콜 버전은 확장 섹션에 있으며, 보시는 것처럼 supported_versions는 TLS 1.3입니다.

TLS 확장 섹션의 스크린샷입니다.

OpenSSL

openssl을 사용하여 합의된 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.