总结:我发现了很多关于 Kerberos 的信息,但不是针对这么复杂的东西 + 我们可能已经过度使用它而被遗忘了。我希望对 Kerberos 了如指掌的人可以使这变得简单。我缺乏认真的网络/托管经验,所以如果我尝试解释的任何内容听起来完全错误/天真,请纠正我。
账户
根据图片,我们使用 2 个帐户:
WorkDomain/UserName,代表我们的普通 Active Directory (AD) 用户。
WorkDomain/ServiceAccount,代表我们用来访问我们不希望用户直接访问的资源的帐户。
服务器
我们也有很多机器:
UserMachine$ 代表普通用户 PC。
WebMachine$ 使用 ApplicationPoolIdentity 在 IIS 中运行我们的 Web 应用程序,我们将称之为 AppPoolAccount。
SQLMachine$ 运行我们的 SQL Server 实例,服务由我们称为 SQLServicesAccount 的帐户运行。
LinkedMachine$ 是我们不拥有的服务器,它还托管一个 SQL Server 实例,在我们的 SQL 实例中用作链接服务器。我将此 SQL 实例运行帐户称为 LinkedSQLAccount,但是,同样,我们对该服务器没有所有权,而且我知道运行它的帐户无关紧要。
DataMachine$ 保存公司文件,这些文件对各种 AD 组具有不同的权限级别。
APIMachine$ 正在 IIS 上运行一个 Web API,其身份我称为 APIPoolAccount。
期待
我们的电话应该如何在我们的脑海中发挥作用...
UserName 在 WebMachine$ 上访问我们的 Web 应用程序,IIS 根据 AD 对它们进行身份验证,以确保它们被允许访问该站点。这是通过在 IIS 中启用 WindowsAuthentication 来完成的。
如果 WebMachine$ 或 APIMachine$ 需要点击 SQLMachine$ 或 DataMachine$,他们使用 ServiceAccount,它已经拥有对所有需要的东西的权限。这是通过在我们的连接字符串中将 AppPoolAccount 和 APIPoolAccount 设置为 ServiceAccount 和“integrated security=sspi”来完成的。
如果 Web 应用程序需要访问 API,我们需要委托凭据,因为我们限制 AD 组对 API 部分的访问。这是通过 Kerberos 黑魔法完成的(见下文)。
如果 SQLMachine$ 需要使用 LinkedMachine$,它应该将 AD 凭据委托给它,不是因为我们关心,而是因为服务器所有者关心并且不希望我们连接到 ServiceAccount(不能责怪他们)。这也是使用 Kerberos 黑魔法完成的(见下文)。
Kerberos 黑魔法
除了前面步骤中列出的内容之外,这是我所知道的我们为使它正常工作所做的最低限度,因此您知道我不只是出于懒惰而问:
禁用 IIS 匿名身份验证。
启用 IIS ASP.NET 模拟。
为 WebMachine$ 标记为“仅信任此计算机以委派指定服务/仅使用 Kerberos”。
链接服务器标记为“使用登录的当前安全上下文创建”。
运行并遵循 Microsoft Kerberos Configuration Manager for SQL Server 的说明。
运行并遵循 IIS Kerberos 配置管理器的说明。
注册了那么多SPN我不知道我们添加了哪些已经存在了,包括...
对于服务帐户
[www/http]/WebMachine.domainSuffix
MSSQLSvc/SQLMachine.domainSuffix[:instanceName/:port]
http/WebApplicationSiteName.domainSuffix
对于网络机器$
[wsman/termsrv/RestrictedKrbHost/HOST]/WebMachine.domainSuffix
[wsman/termsrv/RestrictedKrbHost/HOST]/WebMachine
对于 SQLMachine$
[MSSQLSvc/wsman/termsrv/RestrictedKrbHost/HOST]/SQLMachine.domainSuffix[:port]
[wsman/termsrv/RestrictedKrbHost/HOST]/SQLMachine
具体问题
尽量做到客观,以下是我想知道的:
给定网络地图/目标,我应该拥有哪些 SPN?
是否有可能在使用 AD 访问链接机器的同时使用服务帐户访问我们的 SQL 服务器,或者是否会委托链接机器也委托给我们的主要 SQL Server 登录名?