在域帐户下运行的 SQL Server 无法注册其 SPN

jim*_*gee 6 active-directory kerberos sql-server

我正在尝试将全新安装的 SQL Server 配置为在域帐户下运行。但是,在尝试使用另一个域帐户连接到服务器时,我会遇到间歇性错误,并且The SQL Server Network Interface library could not register the Service Principal Name在搜索 ERRORLOG 文件时仍然会看到。

我已将我的服务帐户(不是托管服务帐户,只是一个普通用户帐户)添加到 AD 组(例如SQL Servers),并且我已将 ACE 添加到我的域Computers容器的 ACL,为此组选择:

  • 适用于:后代计算机对象
  • 验证写入服务主体名称:允许
  • 读取 servicePrincipalName:允许
  • 写入 servicePrincipalName:允许

我已将此复制到所有域控制器,并使用“有效权限”选项卡和 确认了新 ACE 对特定计算机对象的继承dsacls CN=SERVER01,CN=Computers,DC=fabrikam,DC=local,后者现在包括:

Allow FABRIKAM\SQL Servers
                                  SPECIAL ACCESS for Validated write to service principal name   <Inherited from parent>
                                  WRITE SELF
Allow FABRIKAM\SQL Servers
                                  SPECIAL ACCESS for Validated write to service principal name   <Inherited from parent>
                                  WRITE SELF
                                  WRITE PROPERTY
                                  READ PROPERTY
Run Code Online (Sandbox Code Playgroud)

但是,当我重新启动 SQL Server 服务时,我仍然看到该could not register the Service Principal Name消息。我也重新启动了服务器,结果相同。

我使用 Sysinternals Process Explorer 来检查运行情况sqlservr.exe;那里的安全选项卡清楚地显示了正确的服务用户及其SQL Servers组成员身份。

我知道我可以用 手动添加 SPN setspn -A,但这并不是重点。

我还必须做些什么来确保服务帐户(以及我在SQL Servers组中放置的任何未来帐户)可以在无需人工干预的情况下自动注册自己的 SPN?

和/或

我如何进一步诊断这里缺少哪些特权/权限?

jim*_*gee 6

我找到了。

我手动注册SPN的服务帐户,然后检查与ADSIedit中的AD,才发现是手动注册的SPN未存储在servicePrincipalName该领域的计算机帐户,但servicePrincipalName在具体的领域用户帐户。

因此,我没有授予我的SQL Servers组注册他们自己的 SPN 的权限,而是(无意中)授予他们更改由在该计算机上作为本地系统/网络服务帐户运行的服务注册的 SPN 的权利。

我现在已经从Computers容器中删除了新的 ACE ,而是创建了一个新的SQL Servers组织单位。我SELF为此 OU添加了一个 ACE ,并将其限制为适用于后代用户

  • SQL Servers 访问控制列表
    • SELF
      • 适用于:后代用户对象
      • 读取 servicePrincipalName:允许
      • 写入 servicePrincipalName:允许

现在,当我启动我的 SQL Server 实例时,我看到了预期的The SQL Server Network Interface library successfully registered the Service Principal Name,并且 Kerberos 现在正用于我的远程连接。

(现在更新我们的内部流程文档,所以它需要在新的 OU 下创建新的 SQL Server 服务帐户,而不是添加到组中)

编辑:请注意,域管理员还可以使用setspn.exe.

setspn -S MSSQLSvc/myhost.redmond.microsoft.com:1433 DOMAIN\User
setspn -S MSSQLSvc/myhost.redmond.microsoft.com DOMAIN\User
Run Code Online (Sandbox Code Playgroud)

为 Kerberos 连接注册服务主体名称 (TechNet)

编辑 2:如果Read servicePrincipalNameWrite servicePrincipalName属性在 ACE 列表中不可见,请转到Attribute Editor对象的“属性”对话框的选项卡,单击Filter按钮并确保以下内容:

  • 仅显示有值的属性未选中
  • 只显示可写的属性未选中
  • 显示属性:必选选中
  • 显示属性:可选选中
  • 显示只读属性:Constructed选中
  • 显示只读属性:反向链接检查
  • 显示只读属性:系统只检查

(其他组合可能有效,但这对我有用)

  • jimbobmcgee 的回答完美无缺。我想添加到他的“编辑 2”评论中。如果您找不到 ACE 权限,请按照“编辑 2”中的所有步骤操作,但在 ADSI 编辑控制台中执行此操作。它们在 AD 用户和计算机控制台中对我不起作用。 (2认同)