次の方法で共有


ネットワーク認証プロセスをデータベース エンジンまでトレースする

この記事では、クライアント アプリケーションと SQL Server データベース エンジン (サーバー) 間の伝送制御プロトコル (TCP) 接続確立プロセス中のさまざまなハンドシェイクと認証シーケンスをキャプチャするネットワーク トレースの例をいくつか示します。

接続を閉じる方法については、「データベース エンジンでネットワーク接続を閉じるシーケンスをトレースする」を参照してください。

認証のタイプ

データベース エンジンに接続するには、Windows 認証 (Kerberos または NTLM 認証を使用)、または SQL 認証を使用します。

この記事では、複数のアクティブな結果セット (MARS) 接続についても説明します。 MARS は、SQL Server 2005 (9.x) で導入された SQL Server の機能です。これにより、2 番目のコマンドを実行する前に、最初のコマンドの結果をクリーンアップしなくても、接続で複数のコマンドを実行できます。 MARS は、セッション 多重化 (SMUX) によって実現されます。

このプロセスでは、SQL 認証を使用した通常のログイン プロセスについて説明し、詳細なネットワーク トレース分析を通じてクライアントとサーバー間の会話の各ステップを示します。 ネットワーク トレースの例では、次の手順が示されています。

  1. TCP 3 方向ハンドシェイク
  2. ドライバーのハンドシェイク
  3. SSL/TLS ハンドシェイク
  4. ログイン パケット交換
  5. ログインの確認
  6. コマンドを実行して応答を読み取る
  7. TCP 4 方向の終了ハンドシェイク

ネットワーク トレースの例

この交換は、接続文字列のLogin Timeout設定に関係なく 1 秒割り当てられます。

  • クライアント IP アドレスは次の値です。 10.10.10.10
  • サーバーの IP アドレスは次の値です。 10.10.10.120

ステップ 1. TCP 3 方向ハンドシェイク

すべての TCP 会話は、クライアントからサーバーに送信される SYN パケット (S フラグセット) で始まります。 フレーム 6127では、クライアントはエフェメラル ポート (オペレーティング システムによって動的に割り当てられます) を使用し、サーバー ポート (この場合はポート 1433) に接続します。 サーバーは、ACK フラグも設定された独自のSYN パケットで応答します。 最後に、クライアントは ACK パケットで応答し、 SYN パケットを受信したことをサーバーに知らせます。

この手順では、 telnet コマンドと同じように、基本的な TCP 接続を確立します。 オペレーティング システムは、会話のこの部分を仲介します。 この時点で、クライアントとサーバーは互いについて何も認識しません。

3 方向ハンドシェイクの図。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6127  116.5776698 10.10.10.10  10.10.10.120 TCP:Flags=......S., SrcPort=60123, DstPort=1433, PayloadLen=0, Seq=4050702293, Ack=0, Win=8192 ( Ne
6128  116.5776698 10.10.10.120 10.10.10.10  TCP:Flags=...A..S., SrcPort=1433, DstPort=60123, PayloadLen=0, Seq=4095166896, Ack=4050702294, Win=
6129  116.5786458 10.10.10.10  10.10.10.120 TCP:Flags=...A...., SrcPort=60123, DstPort=1433, PayloadLen=0, Seq=4050702294, Ack=4095166897, Win=

この手順では、 [Bad CheckSum] の警告は無害であり、 checksum offload が有効になっていることを示します。 つまり、トレースが取得されるよりも低いレベルでネットワーク スタックに追加されます。 他の情報がない場合、この警告は、ネットワーク トレースがクライアントとサーバーのどちらで取得されたかを示します。 この場合、初期 SYN パケットに表示されるため、トレースはクライアントで取得されました。

ステップ 2. ドライバーのハンドシェイク

クライアント ドライバーと SQL Server の両方が互いについて少し理解している必要があります。 このハンドシェイクでは、ドライバーはサーバーにいくつかの情報と要件を送信します。 この情報には、データ パケットを暗号化するかどうか、複数のアクティブな結果セット (MARS) を使用するかどうか、そのバージョン番号、フェデレーション認証を使用するかどうか、接続 GUID などが含まれます。

サーバーは、認証が必要かどうかなどの情報で応答します。 このシーケンスは、あらゆる種類のセキュリティ ネゴシエーションが実行される前に発生します。

ドライバーのハンドシェイクの図。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6130  116.5786458 10.10.10.10  10.10.10.120 TDS:Prelogin, Version = 7.1 (0x71000001), SPID = 0, PacketID = 0, Flags=...AP..., SrcPort=60123, Ds
6131  116.5805998 10.10.10.120 10.10.10.10  TDS:Response, Version = 7.1 (0x71000001), SPID = 0, PacketID = 1, Flags=...AP..., SrcPort=1433, Dst

手順 3. SSL/TLS ハンドシェイク

SSL/TLS ハンドシェイクは、クライアント Hello パケットとサーバー Hello パケットに加えて、Secure Channel に関連するいくつかの追加パケットで始まります。 この手順では、パケットを暗号化するためにセキュリティ キーがネゴシエートされます。 通常、ログイン パケットだけが暗号化されますが、クライアントまたはサーバーでもデータ パケットを暗号化する必要があります。 TLS のバージョンの選択は、ログインのこの段階で行われます。 TLS バージョンが揃っていない場合、または共通の暗号スイートがない場合、クライアントまたはサーバーは、この段階で接続を閉じることができます。

SSL/TLS ハンドシェイクの図。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6132  116.5835288 10.10.10.10  10.10.10.120 TLS:TLS Rec Layer-1 HandShake: Client Hello. {TLS:328, SSLVersionSelector:327, TDS:326, TCP:325, IP
6133  116.5845058 10.10.10.120 10.10.10.10  TLS:TLS Rec Layer-1 HandShake: Server Hello. Certificate. Server Hello Done. {TLS:328, SSLVersionSe
6134  116.5864588 10.10.10.10  10.10.10.120 TLS:TLS Rec Layer-1 HandShake: Client Key Exchange.; TLS Rec Layer-2 Cipher Change Spec; TLS Rec La
6135  116.5923178 10.10.10.120 10.10.10.10  TLS:TLS Rec Layer-1 Cipher Change Spec; TLS Rec Layer-2 HandShake: Encrypted Handshake Message. {TL

ステップ 4: ログイン パケット

このパケットは暗号化され、ネットワーク パーサーによっては SSL Application Data または TDS:Dataとして表示される場合があります。 この手順の後のすべてのパケットも SSL Application Dataとして表示される場合、接続は暗号化されます。

SQL ログインの図。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6136  116.5932948 10.10.10.10  10.10.10.120 TLS:TLS Rec Layer-1 SSL Application Data {TLS:328, SSLVersionSelector:327, TDS:326, TCP:325, IPv4:3

ステップ 5: ログインの確認

それ以外の場合は、応答パケットが表示されます。これはログインを確認するか (ログイン ACK トークンを持つ)、 Login Failed エラー メッセージをクライアントに返します。

成功したログインのパケット 16 進数データに表示される可能性のある例を次に示します。

.C.h.a.n.g.e.d. .d.a.t.a.b.a.s.e. .c.o.n.t.e.x.t. .t.o. .'.A.d.v.e.n.t.u.r.e.W.o.r.ks'

SQL ログイン確認の図。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6137  116.5962248 10.10.10.120 10.10.10.10  TDS:Response, Version = 7.1 (0x71000001), SPID = 96, PacketID = 1, Flags=...AP..., SrcPort=1433, Ds

ステップ 6. コマンドを実行して応答を読み取る

コマンドは、 TDS:SQLBatch または TDS:RPCRequest パケットとして送信されます。 前者はプレーンな Transact-SQL ステートメントを実行し、後者はストアド プロシージャを実行します。 コマンドが長い場合は TCP 継続パケットが表示される場合や、数行を超える行が返された場合は応答パケットに表示されることがあります。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6138  116.5991538 10.10.10.10  10.10.10.120 TDS:SQLBatch, Version = 7.1 (0x71000001), SPID = 0, PacketID = 1, Flags=...AP..., SrcPort=60123, Ds
6139  116.5991538 10.10.10.120 10.10.10.10  TDS:Response, Version = 7.1 (0x71000001), SPID = 96, PacketID = 1, Flags=...AP..., SrcPort=1433, Ds
6266  116.8032558 10.10.10.10  10.10.10.120 TCP:Flags=...A...., SrcPort=60123, DstPort=1433, PayloadLen=0, Seq=4050702956, Ack=4095168204, Win=

手順 7. TCP 4 方向の終了ハンドシェイク

Microsoft ドライバーは、4 方向ハンドシェイクを使用して接続を閉じます。 多くのサードパーティ製ドライバーは、接続をリセットして接続を閉じるだけで、通常の閉じと異常な近くを区別するのが難しくなります。

4 方向ハンドシェイクは、 FIN パケットをサーバーに送信するクライアントで構成され、サーバーは ACKで応答します。 その後、サーバーは独自の FIN パケットを送信します。このパケットは、クライアントが確認します (ACK)。

サーバーが最初に FIN パケットを送信した場合、クライアントとサーバーがセキュリティで保護されたチャネルをネゴシエートできない場合、SSL/TLS ハンドシェイクで最も一般的に見られる異常な終了です。

4 方向の終了ハンドシェイクの図。

Frame Time Offset Source IP    Dest IP      Description
----- ----------- ------------ ------------ ---------------------------------------------------------------------------------------------------
6362  116.9097008 10.10.10.10  10.10.10.120 TCP:Flags=...A...F, SrcPort=60123, DstPort=1433, PayloadLen=0, Seq=4050702956, Ack=4095168204, Win=
6363  116.9097008 10.10.10.120 10.10.10.10  TCP:Flags=...A...., SrcPort=1433, DstPort=60123, PayloadLen=0, Seq=4095168204, Ack=4050702957, Win=
6364  116.9097008 10.10.10.120 10.10.10.10  TCP:Flags=...A...F, SrcPort=1433, DstPort=60123, PayloadLen=0, Seq=4095168204, Ack=4050702957, Win=
6366  116.9106778 10.10.10.10  10.10.10.120 TCP:Flags=...A...., SrcPort=60123, DstPort=1433, PayloadLen=0, Seq=4050702957, Ack=4095168205, Win=