我是 Java 用户,在向 Hadoop mapReduce 提交作业时,它使用 Kerberos 对 Hadoop 进行身份验证,成功后会创建委托令牌并将其与作业提交一起传递给 Hadoop,而不是 kerberos 票证(出于安全原因,如上所述由 Hadoop)。现在作业以我的身份运行,但作业本身需要使用 Kerberos 向 Hadoop 之外的其他服务发送请求。现在我在 Hadoop 上没有 kerberos TGT,我无法获得服务票证。
无论如何我可以通过工作通过 Kerberos 票吗?(我知道这可能很危险,因为我们不想传递秘密),JobConf 可以将字符串到字符串对传递给 Hadoop,但是我必须将 TGT 转换为 json 字符串并在作业运行期间将其还原?
或者是否可以使用委托代币改革TGT?
我试着用谷歌搜索,但没有太多信息,有人可以帮忙吗?谢谢你。
**编辑:* *
如果不将 TGT 传递给 Hadoop,似乎没有简单的方法可以做到这一点,所以我将尝试以下方法,通过作业配置映射将 TGT 作为字符串传递给 Hadoop(仅限字符串),并将字符串转换回 TGT 对象当作业在 Hadoop 中运行时。担心的是我将通过网络传递凭据,这不是最佳实践,也是 Hadoop 没有传递 Kerberos 以确保安全的原因之一。如果我可以重新使用经过改造的 TGT 传递给 Hadoop 来获取服务票证,我将尝试尽可能加密 TGT 字符串以避免安全问题。
所以在本地机器上开始工作之前,代码如下:
import sun.security.krb5.Credentials;
Credentials tgt = Credentials.acquireTGTFromCache(null, null); // Make sure kinit is done before this
String tgtStr = tgt.convertToJsonString(); //Need to implement this
Job job = new Job("Test");
JobConf jobConf = job.getJobConf();
jobConf.set("tgtStr", tgtStr);
job.addTask(Test.class, "run", null);
job.submit();
job.waitForCompletion(true);
然后 Hadoop 运行的作业中的函数将如下所示:
Configuration conf = TaskContext.get().getConfiguration();
String tgtStr = conf.get("tgtStr");
Credentials tgt = reformTGTFromString(tgtStr);//Need to implement this
Credentials serviceTicket = Credentials.acquireServiceCreds(servicePrincipal, tgt); //This is to get any service ticket
所以我需要实现两个函数来将 TGT 对象(Credentials.class)流式传输到字符串,然后将其重新转换回对象。
有人知道对此有更好的解决方案吗?谢谢。