如何获得的Kerberos,而不是委托令牌在Hadoop中的MapReduce?(How to ge

2019-07-30 15:04发布

我是一个Java用户,提交作业的Hadoop MapReduce的时候,它使用Kerberos的Hadoop进行身份验证,并在成功的陈述有创建,并通过与作业提交的Hadoop代替(出于安全原因,Kerberos票据的委托令牌通过Hadoop的)。 现在这项工作正在作为我,但这份工作本身需要使用Kerberos请求发送到其他服务的Hadoop之外。 现在我没有的Kerberos TGT对Hadoop和我无法得到服务票据。

有反正我可以通过Kerberos票据与工作? (我知道这可能是危险的,因为我们不希望通过周围的秘密),JobConf可以通过串来串对,以Hadoop的,但我要的TGT转换成JSON字符串,并在工作运行恢复呢?

或者是有可能使用委托令牌改革TGT?

我试图谷歌,但没有太多的信息,任何人都可以帮忙吗? 谢谢。

** Editted:* *

貌似有这样做,而没有经过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)为字符串,然后改回对象。

任何人都知道这更好的解决办法? 谢谢。

Answer 1:

请参阅设计在http://carfield.com.hk:8080/document/distributed/hadoop-security-design.pdf ,如果你还没有这样做。

或者是有可能使用委托令牌改革TGT? 不,代表团令牌是由Hadoop的名称节点发出的,虽然它是基于Kerberos身份验证,它是独立的,你不能从它派生的Kerberos TGT。

在最初的设计中,我们考虑过使用Kerberos的单独(无任何附加的标记),将做你的计划很容易,但决定不这样做这些原因:

性能:

  • 数以千计的M / R任务可能需要获得Kerberos票据在同一时间
  • Kerberos凭据需要更新之前期满计划作业,这将是一个问题
  • 委托令牌不依赖于Kerberos和可以与非Kerberos身份验证机制 - (如SSL)被耦合在边缘使用。

你的情况,你可以使用一个专用分布式缓存和发送转发TGT。 我认为这将是确定的,但需要考虑一下多一些。 显然,你需要确保你的代码是安全的,您的机票有最低限度的必要的寿命,IP通道绑定尽可能使用和限制使用的门票仅限于授权过程。



Answer 2:

通过拆开证书字段和使用的Base64编码器将其转换为字符串,形成一个JSON字符串,并使用配置图表或通过RVM建议分布式缓存它传递给Hadoop的,然后改革凭据在Hadoop上运行的作业对象,我能找回在Kerberos TGT并成功地使用它得到任何服务票证。 因此,这种方法可行,这里唯一需要非常谨慎的是,在经过网络的密钥进行加密。



Answer 3:

首先,您的帐户必须有代表团启用。 该服务票证具有请求转发票证。 如果这都是真的,Hadoop的有来检索所授予的凭证GSSContext并构建代表你一个新的。 随着新的TGT它能够执行进一步的步骤。 使用Wireshark检查票的Hadoop。



文章来源: How to get Kerberos instead of delegation token in Hadoop mapReduce?