我正在编写一个java程序来访问kerberized集群上的安全HBase。我的理解是我可以通过两种方式做到这一点:
使用主体名称和密码登录以在缓存中创建 TGT 并使用它来访问 hbase。
使用 keytab 文件访问 hbase。
在决定我应该采用哪种方法之前,我想了解这两种选择的优缺点。我做了谷歌,发现这篇文章解释了这两个选项是如何工作的。这篇文章还指出,keytab 中的 TGT 可以通过调用来更新,checkTGTAndReloginFromKeytab
但它没有谈到更新 kinit 缓存的 TGT 的更新过程,但我认为可以使用renewTGT
jaas config 中的属性来完成(如果我错了,请纠正我)。这篇文章的另一点是 kinit 缓存仅适用于短期运行的应用程序,因为我们无法更新超过 7 天的 TGT。
我倾向于缓存方法,因为我可以将用户名和密码安全地保存在 keyvault 中,而不必担心保护 keytab。但是这种方法的限制如前所述,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 的代表,所以请帮助我了解这是否是为长期运行的作业创建连接的权利?