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