Windows Server 2008 R2。
已安装 SQL Server 2008 R2。
MSSQL 服务作为本地系统运行。
服务器 FQDN 是 SQL01.domain.com。
SQL01 已加入名为 domain.com 的 Active Directory 域。
以下是 setspn 的输出:
C:\> setspn -L sql01
...
MSSQLSvc/SQL01.domain.com:1433
MSSQLSvc/SQL01.domain.com
WSMAN/SQL01.domain.com
WSMAN/SQL01
TERMSRV/SQL01.domain.com
TERMSRV/SQL01
RestrictedKrbHost/SQL01
RestrictedKrbHost/SQL01.domain.com
HOST/SQL01.domain.com
HOST/SQL01
Run Code Online (Sandbox Code Playgroud)
然后我启动 SQL Server Management Studio 并因此连接到 SQL01:

然后我运行以下查询:
SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@spid
Run Code Online (Sandbox Code Playgroud)
结果是 NTLM。为什么结果不是 Kerberos?对于使用本地系统帐户,SPN 似乎是正确的。服务器不在集群中或使用 CNAME。
根据我阅读的一些文档,SQL 服务器的服务帐户将在数据库引擎启动时创建一个 SPN,允许进行 kerberos 身份验证。我找不到任何说明帐户创建 SPN 所需权限的文档。那么,为了创建 SPN,帐户需要具有哪些权限(如果可能,禁止域管理员)?
在 Windown Server 2008 域控制器上,我尝试将服务主体名称 (SPN) 添加到用户帐户“Postmaster”,以便从 Communigate 电子邮件服务器启用 Kerberos 身份验证。我使用的命令行是以下形式:
setspn -a imap/email-domain.com windows-domain\postmaster
Run Code Online (Sandbox Code Playgroud)
当我运行这个命令时,我得到了结果:
Registering ServicePrincipalNames for CN=Postmaster,OU=Users,DC=windows-domain,DC=com
imap/email-domain.com
Failed to assign SPN on account 'CN=Postmaster,OU=Users,DC=windows-domain,DC=com', error 0x2098/8344 ->
Insufficient access rights to perform the operation.
Run Code Online (Sandbox Code Playgroud)
这是最奇怪的,因为我以域管理员组中的用户身份登录。我检查了此帐户的有效权限,我看不到任何未包含的权限。我还尝试了不同的管理员帐户,结果相同。
只是为了排除它,我还将用户 Postmaster 添加到域管理员,但结果没有变化。
我直接在域控制器实例上运行此命令。我可以毫无困难地查询 SPN,只是我似乎无法编写它们。
我还尝试使用 ktpass 间接设置所需用户的 SPN,但收到警告:
WARNING: Unable to set SPN mapping data.
Run Code Online (Sandbox Code Playgroud)
...我认为这是同样访问不足问题的症状。
什么可能导致此错误?
根据Setspn 概述,不鼓励使用Setspn -A添加 SPN 记录,建议改为使用Setspn -S。
据说Setspn -S在添加新的 SPN 之前会检查 SPN 是否已经存在。Setspn –A不执行此检查。
尽管您可以使用 Setspn -A 添加 SPN,但您应该改用 Setspn -S,因为 -S 将验证没有重复的 SPN。
但是,在 Windows Server 2012 上,我看到了这一点Setspn -S并且Setspn -A行为方式相同:如果存在帐户的 SPN 记录,那么我的参数-A和-S参数都会失败。
是否有任何之间真正的区别Setspn -S和Setspn -A?
我正在使用 Python-LDAP over SASL(DIGEST-MD5) 将我们的 AD 与在 Linux 上运行 Python 的 Web 服务集成,以查询 AD 2012 用户属性(部门、部门、电话分机、电子邮件等)。在针对 AD 2003 解决特定于我的服务的问题后,我开始遇到针对我们的新 AD 2012 的 SPN 错误,即摘要 uri 与服务器上的任何 SPN 都不匹配。我已经交叉引用了两台服务器的 SPN 列表,它们包含彼此相同的类似物。
这是通过运行修复的:
setspn -A ldap/<Domain_Name> <Computer_Name>
Run Code Online (Sandbox Code Playgroud)
请注意,即使运行以下命令,创建服务帐户也无法修复我的 SPN 错误:
setspn -A ldap/<Domain_Name> <Domain_Name>/<Service_Account_Name>
Run Code Online (Sandbox Code Playgroud)
仅使用 sasl_interactive_bind_s() 将 SPN 添加到本地机器 SPN 列表才适用于我的 Python-LDAP 服务。我还应该注意,如果我使用 simple_bind_s() 可以跳过 SPN 步骤,但此方法以明文形式发送凭据,这是不可接受的。
但是我注意到该记录只在 SPN 列表上停留了大约一分钟然后消失了?运行 setspn 命令时没有错误,事件日志完全为空,任何地方都没有重复项,在基本 dn 上使用 -F …
我正在尝试为 Java 服务器设置密钥表以支持 Windows 网络上的 Kerberos 身份验证。即使在命令行工具级别,我也很难让它工作,甚至还没有达到服务器设置!我现在的计划是尝试让它在我的开发 PC 上运行,因为我有开发工作和调试要做。所以我的目标是让 Java 服务器在我的 PC 上运行,而客户端在连接到它的同一台机器上运行。
这是我到目前为止所做的,我真的很笨拙,所以我可能会做各种错误的事情!
我让我们的域管理员之一运行此命令:
setspn -A TEST/pc-name.mydomain.com my-user-name
Run Code Online (Sandbox Code Playgroud)
这似乎成功完成,我可以成功列出此 SPN
setspn -L my-user-name
Run Code Online (Sandbox Code Playgroud)
我用这个命令创建了一个密钥表:
ktpass /princ TEST/pc-name.mydomain.com@MYDOMAIN.COM /pass <my-password> /ptype KRB5_NT_SRV_HST /out <keytab-filename>
Run Code Online (Sandbox Code Playgroud)
这似乎成功创建了一个密钥表,尽管它确实警告 ptype 和帐户类型不匹配(但无论我为 ptype 选择什么,我都会收到相同的警告)。如果我运行这个命令:
klist -k file:/<keytab-filename>
Run Code Online (Sandbox Code Playgroud)
然后它列出了我期望的 SPN,即 TEST/pc-name.mydomain.com@MYDOMAIN.COM
现在我想检查密钥表是否适用于此 SPN,所以我正在运行
kinit -t <keytab-filename> TEST/pc-name.mydomain.com@MYDOMAIN.COM
Run Code Online (Sandbox Code Playgroud)
然后我收到错误“krb_error 6 Client not found in Kerberos database”。
我究竟做错了什么?
我正在设置一个过程,该过程将自动为新公开的服务 URL 创建 SPN。我知道如何使用具有正确权限的 setspn -A 命令在 Windows 中创建 SPN。
由于我的构建服务器在 Linux 上运行,我想知道,除了登录到 Windows 服务器并运行 setspn 之外,还有什么方法可以从 Linux 服务器创建 SPN?
我正在尝试设置 SPN 并为 tomcat kerberos spnego 单点登录创建密钥表文件。
运行 tomcat7 的服务器是 ubuntu-ad1.wad.eng.hytrst.com KDC 是 kerberos.wad.eng.hytrust.com 域是 WAD.ENG.HYTRUST.COM 我使用我的广告用户名 aulfeldt@WAD.ENG .HYTRUST.COM 机器的AD账号是ubuntu-ad1@WAD.ENG.HYTRUST.COM
首先,我创建 spn 以与用户名关联(希望解释为什么我需要这样做?):
setspn HTTP/ubuntu-ad.wad.eng.hytrust.com aulfeldt@WAD.ENG.HYTRUST.COM
Run Code Online (Sandbox Code Playgroud)
然后我创建一个密钥表以复制到 Web 服务器:
ktpass /out tomcat.keytab /mapuser aulfeldt@WAD.ENG.HYTRUST.COM /crypto ALL /pass * /ptype KRB5_NT_PRINCIPAL
Run Code Online (Sandbox Code Playgroud)
然后我将其复制到 Web 服务器并用于ktutil将其与 /etc/krb5.keytab 合并。
当我尝试用 kinit 测试它时,我无法从密钥表中成功读取它:
hytrust@ubuntu-ad1:/usr/share/tomcat7/conf$ sudo kinit -k -t /home/hytrust/tomcat.keytab http/ubuntu-ad1.wad.eng.hytrust.com@WAD.ENG.HYTRUST.COM
kinit: Client not found in Kerberos database while getting initial credentials
hytrust@ubuntu-ad1:/usr/share/tomcat7/conf$ sudo kinit -k -t /home/hytrust/tomcat.keytab HTTP/ubuntu-ad1.wad.eng.hytrust.com@WAD.ENG.HYTRUST.COM
kinit: Client not found in …Run Code Online (Sandbox Code Playgroud) 我们目前正在建立一个 SQL 2012 环境,它将用于存储将由 SSRS 在共享点集成模式下访问的数据。我们将使用 Kerberos 进行身份验证。
我们希望能够做的是为 sql 服务器使用 cnames。我们使用的是默认实例,每台服务器只需要一个实例。
我担心的是 kerberos、IE/.NET 和 CNAME 的已知问题。我想知道只要我确保为 SQL 服务器的 CNAME 和 A 记录正确设置了 SPN,此配置是否有效?
我有一个使用 Win 2008 R2 机器的小型 2 DC 域。最近,不得不使用备份执行系统恢复来恢复。
现在两者都无法复制。我在两者上都运行了 DCDIAG(见下文),发现有几件事因目标主体名称不正确而失败。在检查 DNS 以及要检查的 SETSPN 命令后,两个 DC 似乎都有彼此的条目,所以我不确定我做错了什么或接下来的步骤是什么。
任何帮助将不胜感激!
域控制器:
spn ×10
kerberos ×7
permissions ×2
sql-server ×2
cname-record ×1
ldap ×1
python ×1
replication ×1
windows ×1