如何在HadoopmapReduce中获取Kerberos而不是委派令牌



我是一名Java用户,在向Hadoop mapReduce提交作业时,它会使用Kerberos对Hadoop进行身份验证,成功后,会创建委派令牌,并随作业提交一起传递给Hadoop,而不是Kerberos票证(如Hadoop所述,出于安全原因)。现在作业以我的身份运行,但作业本身需要使用Kerberos向Hadoop之外的其他服务发送请求。现在我在Hadoop上没有kerberos TGT,我无法获得服务票证。

我是否可以将Kerberos票证与作业一起传递?(我知道这可能很危险,因为我们不想传递秘密),JobConf可以将字符串到字符串对传递给Hadoop,但我必须将TGT转换为json字符串,并在作业运行期间将其还原?

或者可以使用授权令牌改革TGT吗?

我试着用谷歌搜索了一下,但信息不多,有人能帮忙吗?非常感谢。

**编辑:**

如果不将TGT传递给Hadoop,似乎没有简单的方法可以做到这一点,所以我将尝试以下方法,通过作业配置映射将TGT作为字符串传递给Hadoop(仅限字符串),并在作业在Hadoop中运行时将字符串转换回TGT对象。令人担忧的是,我将通过网络传递凭据,这不是最佳做法,也是Hadoop为了安全起见没有传递Kerberos的原因之一。如果我可以重复使用传递给Hadoop的经过修改的TGT来获得服务票证,我将尽可能多地加密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)流式传输到字符串,然后将其修改回对象。

有人知道更好的解决方案吗?谢谢

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

或者可以使用授权令牌改革TGT吗?不,委派令牌是由Hadoop名称节点颁发的,虽然它基于Kerberos身份验证,但它是独立的,您不能从中派生Kerberos TGT。

在最初的设计中,我们考虑只使用Kerberos(没有任何额外的令牌),这会使您的计划变得容易,但由于以下原因决定不使用:

性能:

  • 成千上万的M/R任务可能需要在同一时间
  • Kerberos凭据需要在到期前续订对于计划的作业,这将是一个问题
  • 委派令牌不依赖于Kerberos,可以与边缘使用的非Kerberos身份验证机制(如SSL)耦合

在您的情况下,您可以使用私有分布式缓存并发送可转发的TGT。我认为这是可以的,但需要考虑更多。显然,您需要确保您的实现是安全的,您的票证具有最低限度的必要寿命,如果可能的话,将使用IP通道绑定,并将票证的使用限制为仅限授权进程。

通过使用Base64编码器分解Credentials字段并将其转换为Strings,形成JSON字符串并使用配置映射或RVM建议的分布式缓存将其传递给Hadoop,然后在Hadoop上运行的作业中修改Credentials对象,我可以取回Kerberos TGT并使用它成功获取任何服务票证。因此,这种方法有效,这里唯一需要非常谨慎的是对通过网络传递的密钥进行加密。

首先,您的帐户必须启用委派。服务票证必须请求可转发的票证。如果这都是真的,Hadoop必须从GSSContext中检索委托凭证,并代表您构建一个新凭证。有了这个新的TGT,它将能够执行进一步的步骤。使用Wireshark检查hadoop的票证。

最新更新