根据我在Kerberos体系结构中的理解,客户端需要从身份验证服务器获取特定的票证-授予票证(TGT),以便能够与服务进行交互。这些TGT包含:

  • 客户端ID
  • 客户端网络地址
  • 票证有效期
  • 客户端/ TGS session 密钥。

  • 我是从here获得的

    假设我有一个包含以下内容的主工作流:Pig,Hive和Spark文件,我将需要三个不同的TGT,每个服务一个,以便成功使用它们。

    TGT中的要素之一是票证有效期。假设将其设置为8小时。

    以我的理解,如果主工作流程需要10个小时才能完成,则可能在第8个小时后失败,因为工单的有效性将结束。

    因此,据我了解,有必要每8小时刷新一次TGT以与服务进行通信而不会出现问题。

    现在,我正在考虑作为一种可能的方法,让后台进程每8小时刷新一次TGT,因此对于任何必要的服务,客户端将始终具有有效的TGS session 密钥。

    这种方法可能存在的问题是,刷新之间可能存在间隙,即使是30秒间隙或1分钟间隙(对于任何延迟),也可能导致客户端使用无效的TGS session 密钥。

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

    我对此是全新的,因此,如果还有其他方法可以解决此问题,请告诉我。

    最佳答案

    是的,您可以更新程序以使用此密钥表,而不是依靠TGT在缓存中已经存在。这是通过使用Hadoop Security软件包中的UserGroupInformation类完成的。

    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
    
        }
      })
    

    在上面,我们指定服务主体的名称以及生成的keytab文件的路径。只要该keytab有效,我们的程序就会对所有操作使用所需的服务主体,而不管运行该程序的用户是否已经通过身份验证并收到了TGT。

    关于hadoop - Kerberos如何在同一节点中为同一服务和同一客户端处理多个TGT请求?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50387508/

    10-11 07:23