【发布时间】:2018-05-17 09:06:34
【问题描述】:
根据我对 Kerberos 架构的理解,客户端需要从身份验证服务器获取特定的 Ticket-Granting-Ticket (TGT) 才能与服务交互。这些 TGT 包含:
- 客户 ID
- 客户端网络地址
- 机票有效期
- 客户端/TGS 会话密钥。
我从here得到这个
假设我有一个主工作流,其中包含:pig、hive 和 spark 文件,我需要三个不同的 TGT,每个服务一个,才能成功使用它们。
TGT 中的元素之一是票的有效期。让我们假设这设置为 8 小时。
据我了解,如果主工作流需要,比如说,10小时完成,8小时后可能会失败,因为票证的有效期将结束。
因此,据我了解,有必要每 8 小时刷新一次此 TGT 才能与服务通信而不会出现问题。
现在我正在考虑一种可能的方法,让后台进程每 8 小时刷新一次此 TGT,因此客户端对于任何必要的服务始终拥有一个有效的 TGS 会话密钥。
这种方法的一个可能问题是,刷新之间可能存在间隙,甚至是 30 秒的间隙或 1 分钟的任何延迟间隙,这可能会导致客户端使用无效的 TGS 会话密钥。
我的问题:是否可以每 6 小时刷新一次此 TGS 会话密钥,这意味着使用之前的 TGT 获取新的 TGT 仍然有效?如果您在有效请求仍然存在时发出此 TGT 请求会发生什么?旧的是否被替换/删除,都存储在客户端中还是只是忽略了这个新请求?
我对此完全陌生,所以如果有其他方法可以处理此问题,请告诉我。
【问题讨论】:
-
这里有些混乱。 TGT = 身份证明。您需要一个来获得多个服务票。
-
郑重声明,Kerberos 的 Java 实现将票证缓存用于 TGT,但不用于服务票证;这些始终是 JVM 私有的。而 C 实现对两者都使用缓存(例如 Python 可以重用由 curl 创建的服务票证)。此外,Java 实现不会创建可更新的票证,也不能更新缓存中的现有票证。
-
最后,Hadoop 在 Java 之上有自己的实现——参见。 S. Loughran (HortonWorks) 的 GitBook “Hadoop 和 Kerberos,超越大门的疯狂”。
-
非常感谢@samson。在答案中添加这个 cmets,这样我就可以投票了。毕竟它是问题的有价值的补充信息
-
顺便说一句,您可能还对我对stackoverflow.com/questions/33211134/… 的回答和 Chris Nauroth(前 HortonWorks)对stackoverflow.com/questions/34616676/… 的回答感兴趣