将网络身份验证过程跟踪到数据库引擎

本文提供了一些网络跟踪示例,这些跟踪在客户端应用程序与 SQL Server 数据库引擎(服务器)之间的传输控制协议(TCP)连接建立过程中捕获各种握手和身份验证序列。

有关关闭连接的信息,请参阅跟踪数据库引擎上的网络连接关闭顺序。

身份验证类型

可以使用 Windows 身份验证(使用 Kerberos 或 NTLM 身份验证)或 SQL 身份验证连接到数据库引擎

本文还介绍了多个活动结果集(MARS)连接。 MARS 是 SQL Server 的一项功能,由 SQL Server 2005 (9.x)引入,它允许在连接上执行多个命令,而无需清理第一个命令的结果,然后再运行第二个命令。 MARS 是通过会话多路复用(SMUX)实现的。

此过程描述使用 SQL 身份验证的正常登录过程,通过详细的网络跟踪分析显示客户端和服务器之间的对话的每个步骤。 示例网络跟踪描述以下步骤:

  1. TCP 三向握手
  2. 驱动程序握手
  3. SSL/TLS 握手
  4. 登录数据包交换
  5. 登录确认
  6. 执行命令并读取响应
  7. TCP 四向关闭握手

网络跟踪示例

无论连接字符串中的设置如何Login Timeout,都会分配此交换 1 秒。

  • 客户端 IP 地址为 10.10.10.10
  • 服务器 IP 地址为 10.10.10.120

步骤 1. TCP 三向握手

所有 TCP 对话都以 SYN 从客户端发送到服务器的数据包(S 标志集)开始。 在 Frame 6127中,客户端使用临时端口(由操作系统动态分配)并连接到服务器端口,在本例中为端口 1433。 服务器使用自己的 SYN 数据包 ACK 进行答复,同时设置了标志。 最后,客户端使用数据包 ACK 进行响应,让服务器知道它收到了其 SYN 数据包。

此步骤建立基本的 TCP 连接,就像命令一样 telnet 。 操作系统会调解会话的这一部分。 此时,客户端和服务器对彼此一无所知。

三向握手示意图。

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],警告是良性的,并且是启用校验和卸载的指示器。 也就是说,它们在网络堆栈中的较低级别添加,而不是获取跟踪。 如果没有其他信息,则此警告指示是在客户端还是服务器上执行网络跟踪。 在本例中,它出现在初始 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 数据包,以及一些与安全通道相关的额外数据包。 此步骤是协商用于加密数据包的安全密钥的位置。 通常,只有登录数据包已加密,但客户端或服务器也可能需要对数据包进行加密。 选择 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 错误消息。

下面是成功登录的数据包十六进制数据中显示的示例:

.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:SQLBatchTDS:RPCRequest发送。 前者执行纯 Transact-SQL 语句,后者执行存储过程。 如果命令较长,则可能会在响应数据包中看到 TCP 延续数据包;如果返回了多行,则会出现 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 四向关闭握手

Microsoft驱动程序使用四向握手关闭连接。 许多第三方驱动程序只是重置连接以将其关闭,因此很难区分正常和异常关闭。

四向握手由向服务器发送 FIN 数据包的客户端组成,服务器使用服务器 ACK响应该数据包。 然后,服务器发送自己的 FIN 数据包,客户端会确认该数据包(ACK)。

如果服务器首先发送数据包 FIN ,则这是异常的关闭,在客户端和服务器无法协商安全通道时,最常出现在 SSL/TLS 握手中。

四向握手示意图。

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=