使用扩展保护连接到数据库引擎

适用于:SQL Server

扩展保护通过确保客户端知道它连接到的服务来帮助防止身份验证中继攻击。

扩展保护是操作系统实现的网络组件的一项功能。 Windows支持扩展保护。

使用扩展保护建立连接时,SQL Server更安全。

要求清单

若要使扩展保护有效,必须满足以下所有条件:

  1. 使用支持通道绑定的 客户端驱动程序
  2. 在连接上启用 TLS 加密,以便客户端可以生成通道绑定令牌(CBT)。
  3. 使用与SQL Server实例匹配的正确服务主体名称(SPN)进行连接。
  4. 使用 Windows 身份验证(NTLM 或 Kerberos)。 扩展保护不适用于 SQL 身份验证。
  5. 在SQL Server实例上启用扩展保护(设置为“允许”或“必需”)。

Note

有关支持扩展保护的 C# 中的连接字符串示例,请参阅示例连接字符串

扩展保护的描述

扩展保护使用服务绑定和通道绑定来帮助防止身份验证中继攻击。 在身份验证中继攻击中,可以执行 NTLM 身份验证的客户端(例如,Windows Explorer、Outlook、.NET SqlClient 应用程序和其他应用程序)连接到攻击者(例如恶意 CIFS 文件服务器)。 攻击者使用客户端的凭据伪装成客户端,并向服务进行身份验证(例如,数据库引擎的实例)。

存在此攻击的两种变体:

  • 引诱攻击中,客户端自愿连接到攻击者。

  • 欺骗式攻击中,客户端本想连接到合法服务,却不知道 DNS 和 IP 路由中的一个或两个已遭到污染,从而使连接被重定向给攻击者。

SQL Server 支持服务绑定和渠道绑定,以帮助减少在 SQL Server 实例上出现这些攻击。

服务绑定

服务绑定通过要求客户端发送其打算连接的 SQL Server 服务的经过签名的服务主体名称(SPN)来防范诱骗攻击。 作为身份验证响应的一部分,此服务验证在数据包中收到的 SPN 与其自己的 SPN 匹配。 如果客户端被诱导连接到攻击者,则客户端会使用攻击者的已签名 SPN。 攻击者无法将数据包作为客户端中继到真正的 SQL Server 服务进行身份验证,因为它将包含攻击者的 SPN。 服务绑定会产生一次性的可忽略成本,但无法解决欺骗攻击问题。 当客户端应用程序不使用加密连接到SQL Server时,会发生服务绑定。

通道绑定

通道绑定在客户端与SQL Server服务的实例之间建立安全通道(Schannel)。 该服务通过将特定于该通道的客户端通道绑定令牌(CBT)与自己的 CBT 进行比较来验证客户端的真实性。 渠道绑定可同时解决引诱攻击和假冒攻击。 但是,它会产生更大的运行时成本,因为它需要所有会话流量的传输层安全性(TLS)加密。 当客户端应用程序使用加密连接到SQL Server时,无论加密是由客户端还是服务器强制执行加密,都会发生通道绑定。

警告

SQL Server 和 Microsoft 的 SQL Server 数据提供程序支持旧版协议,包括 TLS 1.0 和 SSL 3.0。 如果在操作系统 SChannel 层中进行更改,强制实施其他协议(例如 TLS 1.2 或 TLS 1.3),则与SQL Server的连接可能会失败。 请确保具有最新版本的 SQL Server,以支持 TLS 1.2 或 TLS 1.3。 有关详细信息,请参阅 TLS 1.2TLS 1.3

操作系统支持

以下链接提供了有关如何Windows支持扩展保护的详细信息:

驱动程序支持

支持扩展保护的唯一驱动程序基于Windows:

  • Microsoft ODBC Driver for SQL Server (仅适用于 Windows)
  • 适用于 SQL Server 的 Microsoft OLE DB 驱动程序
  • System.Data.SqlClient (在 Windows 上的 .NET Framework 中)
  • Microsoft.Data.SqlClient (在 Windows 上)

设置

三个SQL Server连接设置会影响服务绑定和通道绑定。 可以使用 SQL Server 配置管理器 或 WMI 配置这些设置。 使用基于策略的管理的服务器 协议设置 方面查看这些设置。

强行加密

可能的值为“是”和“否”。 若要使用通道绑定,请将 强制加密 设置为 “是”,并且所有客户端都必须加密。 如果为 “否”,则仅保证服务绑定。 “强行加密”位于 SQL Server 配置管理器中的“MSSQLSERVER 的协议属性”(“标志”选项卡)上。 从 SQL Server 2022 (16.x) 开始,还可以通过使用 TDS 8.0,将 强制严格加密 设置为 ,以获得更强的保护。 有关详细信息,请参阅 配置 SQL Server 数据库引擎以加密连接

当与扩展保护一起使用时,将强制加密设置为“是”。

扩展保护

可能的值为 “关闭”“允许”“必需” 。 使用扩展保护变量为每个SQL Server实例设置扩展保护级别。 可以在SQL Server 配置管理器的 MSSQLSERVER 属性(高级选项卡)的协议上找到扩展保护

  • 设置为 “关闭 ”以禁用扩展保护。 SQL Server 实例将接受来自任何客户端的连接,不管该客户端是否受保护。 关闭模式与旧操作系统和未修补的操作系统兼容,但安全性较低。 当客户端作系统不支持扩展保护时,请使用此设置。

  • 设置为 “允许 ”,要求对支持扩展保护的操作系统的连接进行扩展保护。 对于不支持扩展保护的操作系统的连接,将忽略扩展保护。 拒绝来自受保护客户端作系统上运行的未受保护的客户端应用程序的连接。 此设置比 关闭更安全,但它不是最安全的。 在混合环境中使用此设置。 某些操作系统支持扩展保护,而其他操作系统则不支持。

  • 设置为 “必需 ”以仅接受受保护操作系统上受保护应用程序的连接。 此设置是最安全的,但不支持扩展保护的操作系统或应用程序的连接无法连接到SQL Server。

有关建议的设置的详细信息,请参阅 “使用扩展保护启用加密”。

接受的 NTLM SPN

当多个 SPN 知道服务器时,请指定 接受的 NTLM SPN 变量。 当客户端尝试使用服务器不知道的有效 SPN 连接到服务器时,服务绑定会失败。 若要避免此问题,请使用 可接受的 NTLM SPN 指定多个代表该服务器的 SPN。 接受的 NTLM SPN 是由分号分隔的一系列 SPN。 例如,若要允许 SPN MSSQLSvc/ HostName1.Contoso.comMSSQLSvc/ HostName2.Contoso.com,请在“接受的 NTLM SPN” 框中键入 MSSQLSvc/HostName1.Contoso.com;MSSQLSvc/HostName2.Contoso.com 。 变量的最大长度为 2048 个字符。 您可以在 SQL Server 配置管理器 的 MSSQLSERVER 的协议属性(高级选项卡)中找到 接受的 NTLM SPN

为数据库引擎启用扩展保护

若要使用扩展保护,服务器和客户端都必须具有支持扩展保护的操作系统,并且必须在操作系统上启用。 有关如何为操作系统启用扩展保护的详细信息,请参阅 用于身份验证的扩展保护

虽然扩展保护和NTLMv2 在Windows的所有受支持版本中默认启用,但默认情况下不会为 SQL Server 连接启用扩展保护。 必须在SQL Server 配置管理器中手动启用它。

若要为SQL Server连接启用扩展保护,管理员必须在SQL Server 配置管理器中配置设置。 此配置包括用于服务绑定和通道绑定的选项,以缓解各种类型的身份验证中继攻击。 有关详细说明,请参阅有关配置扩展保护的SQL Server文档。

使用扩展保护启用加密

适用范围:SQL Server

若要在使用Windows 身份验证时增强安全性,请将“扩展保护”设置为“必需”,并在SQL Server 配置管理器中将“强制加密”设置为“是”。

这些设置为SQL Server提供最安全的配置。

Note

在 SQL Server 2022(16.x)及更高版本中,使用强制严格加密而不是强制加密,通过 TDS 8.0 启用更强的安全性。

更新 连接字符串 以适应这些更改。

有关详细信息,请参见:

启用扩展保护后

在服务器计算机上启用 扩展保护 后,使用以下步骤启用 扩展保护

  1. 从Windows“开始”菜单转到SQL Server 配置管理器

  2. 展开 SQL Server 网络配置,然后右键单击 <InstanceName> 的协议。 选择 属性

  3. 在“ 高级 ”选项卡上,将 扩展保护 设置为通道绑定和服务绑定的相应设置。

  4. (可选)当多个 SPN 知道服务器时,请在“高级”选项卡上配置“接受的 NTLM SPN”字段,如“设置”部分所述。

  5. 对于通道绑定,在“ 标志 ”选项卡上,将 强制加密 设置为 “是”。 建议使用此设置。

  6. 重启数据库引擎服务。

配置其他 SQL Server 组件

有关如何配置 Reporting Services 的详细信息,请参阅 使用 Reporting Services 进行身份验证的扩展保护

使用 IIS 通过 HTTP 或 HTTPS 连接访问 Analysis Services 数据时,Analysis Services 可以利用 IIS 提供的扩展保护。 有关配置 IIS 使用扩展保护的详细信息,请参阅 Configure Extended Protection in IIS 7.5(在 IIS 7.5 中配置扩展保护)

示例连接字符串

在以下 C# 示例中,连接字符串使用 Windows 身份验证(Integrated Security=true)。 通道绑定令牌通过 TLS 加密启用(Encrypt=true)。 证书验证通过 TrustServerCertificate=false 强制执行。 虽然 HostNameInCertificate 不是必需的,但建议使用,并且本示例中也包含了它。

using (var conn = new SqlConnection(
    "Server=sql01.contoso.com;" +
    "Database=AdventureWorks2025;" +
    "Integrated Security=true;" +        
    "Encrypt=true;" +                   
    "TrustServerCertificate=false;" +    
    "HostNameInCertificate=sql01.contoso.com;")) 
{
    conn.Open();
}