每个SQL实例的SPN条目应该是什么样的?


8

我在寻找相互矛盾的信息,以了解如何精确格式化SPN(服务主体名称)以获取正确的Kerberos连接,以及每个SQL实例需要多少连接。

该2017 MS文档包含以下内容:

从SQL Server 2008开始,为了支持TCP / IP,命名管道和共享内存上的Kerberos身份验证,更改了SPN格式。命名实例和默认实例支持的SPN格式如下。

  • 命名实例: MSSQLSvc/FQDN:[port|instancename]
  • 默认实例: MSSQLSvc/FQDN:port|MSSQLSvc/FQDN

新的SPN格式不需要端口号。这意味着不使用端口号的多端口服务器或协议可以使用Kerberos身份验证。

我以最后一段表示我只需要一个条目,即以下一项:

  • 命名实例: MSSQLSvc/sqlbox1.mydomain.org/instance2
  • 默认实例: MSSQLSvc/sqlbox1.mydomain.org

这似乎与该较旧的(2011)MS文档矛盾,不仅与端口号有关,而且与使用的名称有关:

若要创建SPN,可以使用SQL Server的Ne​​tBIOS名称或完全限定域名(FQDN)。但是,您必须为NetBIOS名称和FQDN创建一个SPN

当我查看环境中已经存在的SPN时,会看到各种各样的组合,某些服务器最多包含4个条目:

  • MSSQLSvc/sqlbox1
  • MSSQLSvc/sqlbox1:1433
  • MSSQLSvc/sqlbox1.mydomain.org
  • MSSQLSvc/sqlbox1.mydomain.org:1433

甚至MS自己的Kerberos配置管理器似乎都希望生成最后两个版本(具有适当的混淆):

在此处输入图片说明

同样,对于现有的命名实例,我看到了一个奇怪的组合,其中一些几乎肯定是无效的:

  • MSSQLSvc/sqlbox1:1522
  • MSSQLSvc/sqlbox1:instance2
  • MSSQLSvc/sqlbox1.mydomain.org:1522
  • MSSQLSvc/sqlbox1.mydomain.org:instance2
  • MSSQLSvc/sqlbox1.mydomain.org/instance2
  • MSSQLSvc/sqlbox1.mydomain.org:1522:instance2

因此,如果我仅在环境中使用TCP,那么对于默认实例和命名实例,DSN的实际外观如何?

我应该包括端口吗?还是在端口中包含一个,在端口中包含一个?

仅使用FQDN,还是仅需要Netbios名称的条目?还是仅当我们使用命名管道(不是)时?

(对于上下文,我们运行SQL 2005到2014,其中一些是群集的,其他是独立的。连接仅通过TCP,在配置管理器中禁用了命名管道。我们将手动修复/创建这些管道,而不是允许SQL服务帐户在创建时服务器启动。)


1
您想自己管理SPN​​而不是让SQL(及其服务帐户)为您这样做的任何特殊原因?
Nic

1
就SPN而言,如果可行,格式是什么?我第二个@Nic评论
Bob Klimes

@Nic因为这将需要向数十个服务帐户授予新的Active Directory权限,所以我们的Active Directory管理员说,一次性手动添加更易于管理。还发现一些链接说,当在启动/停止/群集故障转移时动态添加/删除SPN时,如果SPN尝试在多个域控制器之间进行同步,则可能会发生有趣的事情。说了这么多,让我问:当你这样做让服务帐户添加到启动时的SPN,是什么样子?带有FQDN和端口的单个条目?还是没有端口?还是两个条目?
BradC

@BobKlimes好吧,其中一些不起作用,这就是问题所在。我想拥有比必要数量更多的条目并没有什么害处,而只是试图了解哪些条目真正可以完成任务。
BradC

1
@BradC我肯定在群集故障转移和多个DC方面遇到了问题。这些是我唯一手动创建的SPN。
鲍勃·克里姆斯

Answers:


5

如果仅使用TCP / IP连接到实例,则仅需要指定的端口。通过命名管道协议连接到SQL实例时,将使用实例名称。遗憾的是,MS文章没有马上说出哪种协议需要哪种格式,但是它源自(我的环境中的许多测试)和以下MS文章的摘要

对于命名管道和共享内存连接,格式为MSSQLSvc / FQDN:instancename的SPN 用于命名实例,而MSSQLSvc / FQDN用作默认实例。

关于FQDN与NETBIOS名称,我将推荐FQDN,因为如果遇到随机DNS服务器问题,它们就不太容易出现问题。

从我对此事的博客文章中删除,格式应如下所示:

在此处输入图片说明

MS的参考资料可以在这里找到。

现在是网络管理员日(例如允许自注册SPN的OU配置)

您的网络管理员可以在包含所有SQL Server服务帐户的域上创建一个OU,该OU的配置方式可以使该服务帐户可以为其自身以及本身创建SPN。该方法主要遵循Ryan Reis的博客,但进行了一些细微调整,以免发生过度拨款。

此过程描述了在域上创建OU的过程,该OU允许其中的帐户自行注册自己的SPN:

  1. 作为在域上具有较高权限的帐户,打开ADSI Edit(命令提示符下的adsiedit)
  2. 右键单击ADSI Edit-> 连接到...
  3. 连接到默认命名上下文
  4. 导航到/创建包含您希望向其授予SPN权限的服务帐户的OU容器
  5. 右键单击 OU-> 属性
  6. 单击安全选项卡
  7. 点击高级按钮
  8. 突出显示SELF,然后单击“ 编辑...”,或者如果SELF特殊用户未出现在“组”或“用户名”列表中,请单击“ 添加...”,然后为对象名输入SELF
  9. 单击属性选项卡
  10. 从“应用于”旁边的下拉列表中选择“ 后代用户对象”:注意:由于该ServerFault / StackExchange帖子概述的原因,这是对Ryan博客帖子中概述的步骤的略微调整。
  11. 选中以下旁边的允许框:
    • 读取servicePrincipalName
    • 写servicePrincipalName
  12. 单击确定(在权限输入窗口上)
  13. 单击确定(在“高级安全设置”窗口上)
  14. 单击确定(在OU属性窗口上)
  15. 将运行SQL Server服务的服务帐户添加到OU
  16. (可选)重新启动在所述帐户下运行的SQL Server服务
  17. 享受美食

完成上述步骤后,现在就可以配置所讨论的OU容器,以便添加到其中的任何帐户都可以注册和删除自身以及自己的SPN。这是完全正确的权限,因为这些帐户将无法破坏其他帐户注册的SPN。

在步骤16中重新启动SQL Server的目的是确保已按预期注册了SPN。SQL将在关闭时尝试删除所有已注册的SPN,并在启动时添加它们,因此,仅当所述SQL Server服务当前不存在SPN时,才真正需要重新启动。

关于此方法的最后说明是,如果您在传统的故障转移群集实例(FCI)配置中运行SQL Server,则不建议按照KB 2443457将此实例的服务帐户添加到此OU中。

我真的需要发布Kerberos系列的第2部分...


它不是后代用户对象,而是后代计算机对象
艾萨克·克莱曼

1

当SQL Server服务创建SPN时,它将为每个实例创建两个。这是它使用的格式。

默认实例:

MSSQLSvc/servername.domain.com
MSSQLSvc/servername.domain.com:1433

命名实例:

MSSQLSvc/servername.domain.com:54321
MSSQLSvc/servername.domain.com:instancename

对于命名实例,如果手动创建SPN,则将需要具有静态端口而不是默认动态端口。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.