SQL 批量插入的 Kerberos 委派(拒绝访问)

SQL 批量插入的 Kerberos 委派(拒绝访问)

在以下情况下尝试批量插入 SQL 时遇到问题:

  • 在工作站 A 上运行管理工作室
  • 在服务器 B 上运行的 SQL
  • 批量上传的文件位于服务器 C

每当我尝试批量上传时都会收到错误

Cannot bulk load because the file <filename> could not be opened. Operating system error code 5(Access is denied.).

现在我知道我们这里有一个双跳问题,需要解决委派问题。已为 SQL 设置了 SPN,如下所示(SQL 在不同的端口上运行)。SQL 以域用户身份运行,并且 SPN 位于该帐户上。

command: setspn -l domain\sqluser

result:
MSSQLSvc/WIN-D04V1IOTESN
MSSQLSvc/WIN-D04V1IOTESN.domain.local
MSSQLSvc/win-d04v1iotesn.domain.local:55037
MSSQLSvc/WIN-D04V1IOTESN:55037

我还设置了从 SQL 用户帐户到 Cifs 和 HOST 文件服务器的委派,但无济于事。

我已启用 Kerberos 日志记录并在事件查看器中看到以下事件:

 A Kerberos Error Message was received:
     on logon session 
     Client Time: 
     Server Time: 14:44:10.0000 8/9/2011 Z
     Error Code: 0xe KDC_ERR_ETYPE_NOTSUPP
     Extended Error: 
     Client Realm: 
     Client Name: 
     Server Realm: domain.LOCAL
     Server Name: krbtgt/domain.LOCAL
     Target Name: krbtgt/[email protected]
     Error Text: 
     File: 9
     Line: efb
     Error Data is in record data.

那么,您对我在这里遗漏了什么有什么想法吗?我以前也曾进行过这种委派工作,但总是在默认端口上使用 SQL,这会产生影响吗?

编辑

我现在除了第一个错误之外还看到了这个 Kerbors 错误:

A Kerberos Error Message was received:
 on logon session 
 Client Time: 
 Server Time: 15:4:10.0000 8/9/2011 Z
 Error Code: 0xe KDC_ERR_ETYPE_NOTSUPP
 Extended Error: 
 Client Realm: 
 Client Name: 
 Server Realm: domain.LOCAL
 Server Name: krbtgt/domain.LOCAL
 Target Name: krbtgt/[email protected]
 Error Text: 
 File: 9
 Line: efb
 Error Data is in record data.

答案1

从评论中可以看出,您使用域登录连接到 SQL,因此 SQL 在连接到文件共享时试图冒充您。如果您没有为您的域帐户设置委派,则它会失败。

当运行作为 SQL 登录连接的存储过程时,SQL 将尝试使用其正在运行的域服务帐户,您说您已经为此设置了委派。

如果您使用域服务帐户连接查询窗口,则 SQL 正在运行,因为它应该可以工作,因为该委派已配置。为您自己的域帐户设置对文件服务器的委派信任,它应该开始工作。

答案2

对于 SQL Server,SPN 看起来是正确的。是否为文件服务器注册了正确的 SPN?

另一个可能使 SQL Server 的 Kerberos 身份验证陷入混乱的因素是 DNS 问题。我读到过,sql 客户端将对服务器地址进行反向 DNS 查找,并使用该名称来形成 SPN。

我知道您已经完成了许多步骤,但这应该是您需要做的所有事情。
确保 DNS 解析对 SQL 服务器和文件服务器都正常工作。
为 SQL 服务器注册 SPN。确保没有重复的 SPN。SQL 2008 中的 setspn 可以为您执行此检查。
为文件服务器注册 SPN。确保没有重复的 SPN。
在 SQL Server 服务帐户上启用“信任委派”。
还要检查您的帐户是否未标记为不可委派。(这是一个词吗?)

如果无法使其工作,则可以设置 SQL Agent 作业来取消批量插入。然后它将在您配置作业以使用的帐户下运行。

答案3

错误消息中缺少客户端时间,这让我很怀疑。如果客户端时间和服务器上的时间相差太大,Kerberos 身份验证就会失败。(我一直不确定“相差太大”到底是什么意思。我知道一分钟就可以了,因为我们昨天在新服务器上又遇到了这个问题。)

当 Kerberos 身份验证失败时,SSMS 可能仍会连接,但它会默默地恢复使用 NTLM 身份验证。

您可以通过调整连接设置和字符串来强制使用 kerberos,这样如果使用 kerberos 身份验证,连接将严重失败,但有一种更简单的方法可以查看您是否使用 kerberos 进行连接。要确保您使用 Kerberos 身份验证进行连接,请通过 SSMS 正常连接并在 SSMS 查询窗口中运行此操作:

从 master.sys.dm_exec_connections 中选择 auth_scheme,其中 session_id=@@spid

您应该会看到“KERBEROS”。如果没有,您可能会看到“NTLM”,然后您就会知道出了问题。

相关内容