如何解决Kerberos kinit缓存与Java中的keytab一起访问安全的HBase
我正在编写一个Java程序,以访问Kerberos集群上的安全HBase。我的理解是,我可以通过两种方式做到这一点:
-
使用主体名称和密码登录以在缓存中创建TGT,并 用它来访问hbase。
-
使用密钥表文件访问hbase。
在我决定应该采用哪种方法之前,我想了解两种选择的利弊。我在Google上找到了this article,它解释了这两种方法的工作原理。这篇文章还指出,可以通过调用checkTGTAndReloginFromKeytab
来更新keytab中的TGT,但并未讨论用于更新kinit缓存的TGT的更新过程,但我认为可以使用jaas config中的renewTGT
属性来完成(如果我错了,请纠正我)。这篇文章的另一点是,kinit缓存仅适用于运行时间短的应用程序,因为我们无法在7天后续订TGT。
我倾向于使用缓存方法,因为我可以安全地将用户名和密码保留在密钥库中,而不必担心保护密钥表的安全。但是这种方法的局限性如前所述,即TGT的最大长度(7天),我不能将其用于长时间运行的工作,至少这是我的理解(纠正我的意思)。
如果您可以解释两者之间的区别,或者为我提供一篇很好的文章,其中详细介绍了这两种方法,那将非常有帮助。
我写了下面的程序来使用用户名和密码获取TGT。
public static LoginContext kinit() throws LoginException {
return new LoginContext("Client",callbacks -> {
for(Callback c : callbacks){
if(c instanceof NameCallback)
((NameCallback) c).setName(username);
if(c instanceof PasswordCallback)
((PasswordCallback) c).setPassword(password);
}
});
}
public static void connectToKerberizedHBase(Configuration conf) throws LoginException,IOException {
UserGroupInformation.setConfiguration(conf);
LoginContext lc = kinit();
lc.login();
UserGroupInformation.loginUserFromSubject(lc.getSubject());
}
按如下所述使用它
somemethod(){
Configuration config = HBaseConfiguration.create();
loadHBaseConfigsFromProperties(config);//to load zookeeper quorum,port etc...
connectToKerberizedHBase(config);
}
JAAS配置文件:
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=false
renewTGT=true
useTicketCache=true;
};
上面提到的文章还讨论了我不理解的使用keytab的代表,因此请帮助我了解这是否适合为长期运行的工作创建连接?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。