Share via


TLS 1.3 구성

적용 대상: SQL Server 2022(16.x) 이상 버전

이 문서에서는 다음 방법을 설명합니다.

  1. TLS(전송 계층 보안) 1.3 및 TLS 1.2를 사용하도록 SQL Server 2022(16.x) 인스턴스 구성
  2. 프로토콜이 작동하는지 확인
  3. TLS 1.0 및 1.1을 포함하여 이전의 안전하지 않은 프로토콜 사용 안 함

요구 사항

SQL Server 2022(16.x)의 TLS 1.3 지원에는 다음이 필요합니다.

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

Important

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

SQL Server 및 TLS

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

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

TLS 1.2 및 TLS 1.3만 사용하도록 Windows 구성

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

이 코드는 set-reset-tls.ps1의 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인스턴스를 설정하는 것입니다. SQL Force Strict Encryption인스턴스는 지원되는 버전의 테이블 형식 데이터 스트림(TDS 8.0 이상)을 사용합니다.

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

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

  2. 프로토콜을<instance name> 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

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

  3. 플래그 탭에서 강제 엄격한 암호화를 예로 설정합니다.

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

보안 확인

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

Wireshark

네트워크 스니퍼를 사용하여 TLS 프로토콜 버전 및 합의된 암호 그룹을 확인할 수 있습니다. 일부 데이터가 혼동될 수 있습니다. Wireshark에서 아래 스크린샷을 보면 패킷이 TLS v1.3 레코드 계층이지만 프로토콜 버전은 TLS 1.2이고 핸드셰이크 프로토콜 버전도 TLS 1.2임을 보여 줍니다. 이는 모두 TLS 1.2 사양의 일부이며 올바르고 필요합니다. 합의된 프로토콜 버전은 확장 섹션에 있으며, 볼 수 있듯이 supported_versions TLS 1.3입니다.

Screenshot of the TLS extension section.

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.