为什么可以使用 setspn 创建无效的服务主体名称 (SPN)

Why an invalid service principal name (SPN) can be created using setspn

今天,我能够使用 setspn 命令创建完全随机且无效的 SPN,但我不明白为什么允许无效 SPN。例如:

setspn -s RandomSvc/randomname.random.random valid_user 在我的域中 valid_user 成功 运行(我在这里替换了实际的用户名,但该用户是域中的有效用户)。

然后如果我setspn -l valid_user,它会列出这个无效条目。

我想没有人能真正连接到这个服务,因为它不存在。但是,如果我尝试添加一个有效的 SPN,但输入错误,我将不会注意到它,直到我的应用程序给我一个错误。那么为什么 setspn 不做任何验证(除了用 -s 检查重复)?

setspn 命令不会阻止您创建无效的 SPN,这是有充分理由的,所以信不信由你,这里没有实际问题。您对有效 SPN 的定义 - 实际服务 运行ning 在具有 DNS 中的主机名的实际机器上的表示,可以通过 TCP/IP 访问,不会由 setspn 强制执行由于我即将描述的原因。根据 KDC,虽然 SPN 表示 一个实际的服务 运行 在一台实际机器上有一个主机名在 DNS 中,可以通过 TCP/IP 访问,它虽然当时实际上并不一定是真实的。这就是为什么。您是否考虑过稍后可能会安装服务,甚至 运行 所在的机器?当您创建 SPN 时,服务甚至 运行 所在的机器,以及该机器的 DNS 条目,都不必在此时此地就位。 Setspn.exe 只是一个基本工具,它允许您创建符合 Kerberos RFC 的 SPN。不过,由您来正确构建它,它不会在此过程中牵着任何人的手。我在一家大公司工作,一直在为服务甚至还不存在的机器创建 SPN。这样,开发人员或系统管理员就不必在事后联系我来创建 SPN。他们正在遵循一个项目计划,精明的经理将拥有 SPN、DNS 整体、机器的 IP 地址,所有这些都在 OS 管理员开始实际启动实时服务器之前提前计划和创建这样的使用。因此,如果 setspn 阻止人们为尚未启动且 运行ning 的服务创建 SPN,将会有一些非常愤怒的系统管理员。这就是为什么在您认为不应该创建 "invalid" SPN 时允许它创建的原因。如果你想要一些东西来做通用 setspn.exe 无法提供的额外验证层,以便在你的应用程序之前发现错误,那么你将不得不自己创建这样的东西。不过问问自己,值得为如此具体的事情花时间吗?我的意思是,您多久创建一次 SPN?现在你应该明白了。我定期 运行 一个 setspn -X 来捕获我域中的重复项。我从来没有时间,但我想我也可以列出域中所有当前的 SPN 并检查它们当前是否有效,如果无效则采取纠正措施。我敢肯定,可能有不止一些不再活跃。我认为这没什么大不了的。