根据我对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请求会发生什么?是旧的替换/去除了,是存储在客户端还是这个新请求被忽略了?
我对此非常陌生,所以如果有其他方法可以解决这个问题,请告诉我。
答案 0 :(得分:2)
是的,您可以更新程序以使用此密钥表,而不是依赖于已存在于缓存中的TGT。这是通过使用Hadoop安全包中的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文件的路径。只要该密钥表有效,我们的程序将对所有操作使用所需的服务主体,无论运行该程序的用户是否已经过身份验证并接收到TGT。