首页 > 解决方案 > Java中的Kerberos kinit缓存与keytab访问安全的HBase

问题描述

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

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

  2. 使用 keytab 文件访问 hbase。

在决定我应该采用哪种方法之前,我想了解这两种选择的优缺点。我做了谷歌,发现这篇文章解释了这两个选项是如何工作的。这篇文章还指出,keytab 中的 TGT 可以通过调用来更新,checkTGTAndReloginFromKeytab但它没有谈到更新 kinit 缓存的 TGT 的更新过程,但我认为可以使用renewTGTjaas 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 的代表,所以请帮助我了解这是否是为长期运行的作业创建连接的权利?

标签: javahbasekerberoskeytab

解决方案


推荐阅读