如何在Hadoop mapReduce中获取Kerberos而不是委托令牌?

时间:2012-07-25 18:47:46

标签: hadoop kerberos

我是Java用户,在向Hadoop mapReduce提交作业时,它使用Kerberos对Hadoop进行身份验证,一旦成功,就会创建委托令牌并将作业提交传递给Hadoop而不是kerberos票证(为了安全起见) Hadoop所说的理由)。现在作业正在以我的身份运行,但作业本身需要使用Kerberos将请求发送到Hadoop之外的其他服务。现在我在Hadoop上没有kerberos TGT,我无法获得服务票。

无论如何,我可以通过Kerberos票与工作一起通过吗? (我知道它可能很危险,因为我们不想传递秘密),JobConf可以将字符串传递给Hadoop的字符串对,但我必须将TGT转换为json字符串并在作业运行期间还原它? / p>

或者是否可以使用委托令牌改革TGT?

我试图谷歌但没有太多信息,任何人都可以提供帮助?谢谢。

** Editted: * *

看起来没有简单的方法可以在不将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)转换为字符串,然后将其重新转换回对象。

任何人都知道更好的解决方案吗?感谢。

3 个答案:

答案 0 :(得分:2)

如果您还没有这样做,请参阅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通道绑定,并且仅将票证的使用限制为授权进程。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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