TLS 1.3 を構成する
適用対象: SQL Server 2022 (16.x) 以降のバージョン
この記事では、以下の方法について説明します。
- トランスポート層セキュリティ (TLS) 1.3 および TLS 1.2 を使用するように SQL Server 2022 (16.x) のインスタンスを構成する
- プロトコルが動作していることを確認する
- 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 サーバー証明書とその秘密キーがインストールされている
重要
このドキュメントでは、要件に短期的には TLS 1.3 と TLS 1.2 の両方が含まれており、長期的には TLS 1.3 のみが含まれているものとします。
SQL Server と TLS
SQL Server では TLS 操作自体は実行されません。この作業は、 Schannel SSP を使用してWindows によって実行されます。 Schannel は、TLS などのインターネット標準セキュリティ プロトコルの Microsoft の実装を含み、公開するセキュリティ サポート プロバイダー (SSP) です。 Schannel は、Linux に対して OpenSSL とは何かを Windows に対して行います。
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 を有効または無効にするために レジストリを更新します 。
警告
続行する前に、 レジストリをバックアップします。 これにより、必要に応じて、将来的にレジストリを復元できます。
# 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 8.0 以降) を使用します。
SQL Server 構成マネージャーを使用してこの設定を設定します。
[SQL Server ネットワークの構成] を展開します。
<instance name>
のプロトコルを右クリックし、[プロパティ] を選択します。デフォルのインスタンス名は MSSQLSERVER です。
[フラグ] タブで、[厳密な暗号化の強制] を [はい] に設定します。
セキュリティを確認する
このセクションでは、Wireshark、OpenSSL、Nmap を使用して暗号化を確認する方法について説明します。
Wireshark
ネットワーク スニファを使用して、TLS プロトコルのバージョンと合意された暗号スイートを決定できます。 データがわかりにくい場合があります。 Wireshark の下のスクリーン ショットを見ると、パケットが TLS v1.3 レコード レイヤーであることが示されていますが、プロトコル バージョンは TLS 1.2 で、ハンドシェイク プロトコルのバージョンも TLS 1.2 です。 これはすべて TLS 1.2 仕様の一部であり、正しく想定されています。 合意されたプロトコルバージョンは拡張機能セクションにあり、ご覧のとおり、 supported_versions は TLS 1.3 です。
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
=