一个服务如何向另一个在 Kerberos 中注册的服务进行身份验证?就我而言,这两个服务由不同的服务帐户拥有,因此它们无法像普通用户那样运行kinit,例如,每 10 小时到期时刷新一次。因此,当一个服务需要另一个服务时,它如何在没有 TGT(票证授予票证)的情况下获得 Kerberos 票证?
更具体地说,我运行一个 Apache Web 服务器来提供对 Subversion 存储库的访问。它的服务帐户和 SPN(服务主体名称)在 Kerberos 中注册。我还运行一个 Jenkins 服务器,有时需要签出这些存储库。普通用户可以向两个服务器进行身份验证:仅在运行kinit后才向 Apache 进行身份验证,以及通过 LDAP 向 Jenkins 进行身份验证。由于 Jenkins 服务帐户无法每 10 小时运行一次kinit ,全天候运行,因此它如何向 Apache 进行身份验证以访问 Subversion 存储库?
这听起来很相似,但没有好的答案。而且 Jenkins的 Kerberos 插件用于向 Jenkins 验证用户身份,而不是向 Apache 验证 Jenkins 身份。还有这个晦涩难懂、已弃用的解决方案,但我不知道它是否还适用。而且这个问题似乎应该独立于任何特定服务器,只是一个服务器试图向另一个使用 Kerberos 的服务器进行身份验证。
可以 - 服务帐户始终可以充当用户帐户(事实上它们首先就是用户帐户:MIT Kerberos 甚至没有区别,而 Active Directory 服务帐户只是分配了附加服务主体名称的用户帐户)。
标准 Kerberos 凭证是对称的,无论是在加密意义上(它们充当 AES/DES/RC4 的“对称加密”密钥),还是在实际意义上(主体使用相同的密钥来获取票证和验证票证)。
(事实上,甚至相反的情况也是可能的——从技术上讲,即使用户帐户没有 SPN,也可以获得该用户帐户的票证——尽管 Active Directory 实现不允许这样做,因为允许这样做存在一定的安全风险。)
因此,无论您的服务主体是使用密码(在 Windows 服务器上)还是使用密钥表(在 Linux 或 Java 服务器上),该密码/密钥表都可以用于这两个目的。我相信,只要 Jenkins 调用 SSPI,Windows 就会自动代表您的第一个服务获取 TGT,而对于 Linux 服务器,您可以将服务密钥表提供给
kinit
(或k5start
或KRB5_CLIENT_KTNAME
甚至gss-proxy
)。这个问题是基于错误的假设。它绝对可以每 10 小时运行一次kinit,全天候运行。
正如前面提到的,在 Linux 上,您通常使用 keytab 将凭据存储在磁盘上
kinit -k -t
(或其他 3 种方法) - 尽管如果您愿意提供密码,它也不会阻止您这样做 - 而在 Windows 上,您会让 LSASS 使用存储的“服务帐户密码”自动执行此操作。