Kerberos 如何处理同一节点中针对同一服务和同一客户端的多个 TGT 请求?

How does Kerberos handle multiple TGT request in the same node for the same service and for the same client?

根据我对 Kerberos 架构的理解,客户端需要从身份验证服务器获取特定的 Ticket-Granting-Ticket (TGT) 才能与服务交互.这些 TGT 包含:

我从 here

那里得到了这个

假设我有一个主工作流,其中包含:pig、hive 和 spark 文件我将需要三个不同的 TGT,每个服务一个,才能成功使用它们。

TGT 中的一个元素是票的有效期。让我们假设这被设置为 8 小时。

据我了解,如果主工作流需要,比方说,10 小时才能完成,它可能会在第 8 小时后失败,因为票证的有效期将结束。

因此,据我所知,有必要每 8 小时刷新一次此 TGT,以便与服务顺利通信。

现在我正在考虑让后台进程每 8 小时刷新一次此 TGT 的可能方法,这样客户端将始终拥有有效的 TGS 会话密钥以获得任何必要的服务。

这种方法的一个可能问题是,这种刷新之间可能存在间隔,即使是 30 秒间隔或任何延迟的 1 分钟间隔,这都可能导致客户端使用无效的 TGS 会话密钥。

我的问题:是否可以每 6 小时刷新一次此 TGS 会话密钥,这意味着获得一个新的 TGT 与之前的 TGT 仍然有效?如果您在有效请求仍然存在时发出此 TGT 请求,会发生什么情况?是旧的 replaced/descarted,都存储在客户端中还是忽略了这个新请求?

我对此完全陌生,所以如果有其他方法可以解决此问题,请告诉我。

是的,您可以更新您的程序以使用此密钥表,而不是依赖缓存中已存在的 TGT。这是通过使用 Hadoop 安全包中的 UserGroupInformation class 完成的。

val configuration = new Configuration
configuration.addResource("/etc/hadoop/conf/hdfs-site.xml")
UserGroupInformation.setConfiguration(configuration)

UserGroupInformation.getCurrentUser.setAuthenticationMethod(AuthenticationMethod.KERBEROS)
UserGroupInformation.loginUserFromKeytabAndReturnUGI(
  "hadoop.kerberos.principal", " path of hadoop.kerberos.keytab file")
  .doAs(new PrivilegedExceptionAction[Unit]() {
    @Override
    def run(): Unit = {

      // logic

    }
  })

上面我们指定了服务主体的名称和我们生成的密钥表文件的路径。只要该密钥表有效,我们的程序就会对所有操作使用所需的服务主体,无论用户 运行 程序是否已经过身份验证并收到 TGT。