AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 180064
Accepted
BradC
BradC
Asked: 2017-07-18 13:42:01 +0800 CST2017-07-18 13:42:01 +0800 CST 2017-07-18 13:42:01 +0800 CST

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

  • 772

我发现关于如何准确格式化 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 的 NetBIOS 名称或完全限定域名 (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 服务帐户创建它们服务器启动。)

sql-server kerberos
  • 2 2 个回答
  • 19401 Views

2 个回答

  • Voted
  1. Best Answer
    John Eisbrener
    2017-07-19T07:34:27+08:002017-07-19T07:34:27+08:00

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

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

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

    从我关于此事的博客文章中提取,格式应如下所示:

    在此处输入图像描述

    可以在此处找到 MS 的源参考。

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

    您的网络管理员可以在包含所有 SQL Server 服务帐户的域上创建一个 OU,这些服务帐户可以配置为服务帐户可以为自己和自己单独创建 SPN。该方法主要遵循Ryan Reis 的博客,但有一些细微的调整,因此不会执行过度授权。

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

    1. 作为在域上具有提升权限的帐户,打开ADSI Edit(命令提示符下的 adsiedit)
    2. 右键单击 ADSI 编辑 ->连接到...
    3. 连接到默认命名上下文
    4. 导航到/创建包含您希望授予 SPN 权限的服务帐户的 OU 容器
    5. 右键单击OU ->属性
    6. 单击安全选项卡
    7. 单击高级按钮
    8. 突出显示SELF并单击Edit...或者如果SELF特殊用户未显示在组或用户名列表中,请单击Add...并输入SELF作为对象名称
    9. 单击属性选项卡
    10. 从应用到旁边的下拉列表中选择后代用户对象: 注意:这是对 Ryan 博客文章中概述的步骤的轻微调整,原因在此ServerFault/StackExchange文章中更好地概述了。
    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,则不建议将此实例的服务帐户添加到此 OU,根据KB 2443457。

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

    • 8
  2. Bob Klimes
    2017-07-19T06:19:44+08:002017-07-19T06:19:44+08:00

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

    默认实例:

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

    命名实例:

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

    对于您的命名实例,如果手动创建 SPN,您将需要一个静态端口而不是默认的动态端口。

    • 2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve