3

我是 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)流式传输到字符串,然后将其重新转换回对象。

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

4

3 回答 3

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 通道绑定,并将票证的使用仅限于授权流程。

于 2012-07-26T01:39:34.500 回答
2

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

于 2012-07-27T13:16:00.367 回答
1

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

于 2012-07-25T19:31:02.353 回答