Kerberos kinit缓存与Java中的keytab一起访问安全的HBase

问题描述

我正在编写一个Java程序,以访问Kerberos集群上的安全HBase。我的理解是,我可以通过两种方式做到这一点:

  1. 使用主体名称密码登录以在缓存中创建TGT,并 用它来访问hbase。

  2. 使用密钥表文件访问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 {
    UserGroup@R_587_404[email protected]figuration(conf);

    LoginContext lc = kinit();
    lc.login();
    UserGroup@R_587_404[email protected](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 (将#修改为@)