SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

TDS 8.0 についての情報を整理しておく (2022/06 版)

leave a comment

SQL Server 2022 の新機能の一つとして、TDS 8.0 のサポートがあります。

先日 Released: Microsoft.Data.SqlClient 5.0 Preview 3 でアナウンスされましたが、Microsoft.Data.SqlClient 5.0 Preview 3 から TDS 8.0 のサポートが追加されています。

以前、書いた SQL Server のデータアクセスコンポーネントの暗号化設定の既定が変更されています でも TDS 8.0 に関係する内容が含まれているのですが、SQL Server 向けの接続コンポーネントも TDS 8.0 のサポートが進められています。

SQL Server を触るに際して、今後 TDS 8.0 の動向についても意識しておく必要がありますので、本投稿で現時点の情報を整理しておきたいと思います。

TDS 8.0 についての情報

最初に TDS 8.0 についての情報を整理しておきたいと思います。

TDS 8.0 について、公開されている情報としては次の内容になるのではないでしょうか。

 

TDS 8.0を使用した場合、暗号化接続の流れが、従来までとは変わるようです。

image

 

TDS 7.4 までは、TCP ハンドシェイク後の接続は、TDS プレログインをクリアテキストの通信で行い、その後に TLS ハンドシェイクとなっていました。

image

TDS 8.0 になると上記の TDS プレログインの操作が暗号化通信の中で実行されるようになるようです。

通信に使用されている TDS のバージョンについては、SQL Server 側で確認することができ、How to tell which version of SQL Server data access driver is used by an application client のような方法を使うことができます。

簡単なクエリとしては次のようなものになるのではないでしょうか。

select 
ec.connect_time,es.last_request_start_time ,es.session_id, 
(CAST(protocol_version AS BINARY(4))),
es.program_name, es.client_version, ec.protocol_type,ec.protocol_version,
es.client_interface_name,ec.encrypt_option
from sys.dm_exec_sessions as es
inner join sys.dm_exec_connections as ec
	on ec.session_id = es.session_id
order by connect_time desc

 

プロトコルバージョンをバイナリに変換し情報の取得を行っており、バイナリの先頭でバージョンを確認することができます。バージョンの情報については、TDS のプロトコルドキュメントの値を活用できるかと。

image

 

TDS 8.0 で接続を行うためには

TDS 8.0 で接続を行うための方法は、厳密な接続暗号化 / 接続文字列の暗号化プロパティに対するその他の変更 の情報から確認することができます。

最新の SQL Server 向けのドライバーでは、接続文字列のオプションで「Encrypt=true」がデフォルトとなるように変更が行われてきていますが、暗号化のオプションとして「Encrypt=strict」を指定することができるようになっているドライバーも提供されています。

「Encrypt=strict」を使用した場合、「TrustServerCertificate=true」による、証明書検証のスキップを使用することはできないため、SQL Server 側でも暗号化接続の設定を適切に実施しておく必要があります。

暗号化接続については データベース エンジンへの暗号化接続の有効化 / SQL Server on Linux への接続の暗号化 で記載されている手順を実施する必要があり、「TrustServerCertificate=true」が使用できませんので、接続のクライアント側でも証明書の検証は通るようにしておく必要があります。

SQL Server の暗号化接続で使用可能な証明書の要件については、証明書の要件 に記載されており、次のような要件を満たした証明書を使用する必要があります。

  • 拡張キー使用法 (extKeyUsage: 2.5.29.37) にサーバー認証 (serverAuth: 1.3.6.1.5.5.7.3.1) を指定
  • KeySpec に KeyExchange を指定
  • Subject にホスト名 / FQDN / IP アドレス等の接続に使用する情報を指定
  • SQL Server のサービスアカウントに秘密キーの読み取りを許可する

New-SelfSignedCertificate」を使用したサンプルについては、sqlservercert.ps1 を参考にすると作成することができるかと。

 

TDS 8.0 については、まだ情報を確認中なのですが、7.x から 8.x はメージャーバージョンが変更となっていますので、どのような対応が行われるかはチェックしたいですね。

Share

Written by Masayuki.Ozawa

6月 19th, 2022 at 7:55 pm

Leave a Reply