【问题标题】:How to get Hadoop client to user correct credentials in a secure (Kerberos) clusters如何让 Hadoop 客户端在安全(Kerberos)集群中使用正确的凭据
【发布时间】:2013-01-02 05:12:26
【问题描述】:

我有一个 Hadoop (CDH412) 集群设置,它已启用 Kerberos 进行身份验证和授权。我让一切工作正常(Hdfs、mapred、zookeeper、hbase、hive 等)。但是,我在从 Java 应用程序中访问 hdfs 数据时遇到问题。

我的 Java 应用程序是在后台运行的服务。因此,无法输入密码,我必须使用密钥表文件。应该不是问题。如果我先做一个“kinit”,它会很好用,唉......

kinit -kt /home/fred/kerberostest/krb5.keytab myprinc/myserver.com@MY.REALM

但是,如果我尝试在 java 代码中执行此操作(我已阅读 LoginContext.logon 将执行与 kinit 相同的操作),它会失败。

为了尝试测试这一点,我编写了以下代码 sn-p....

System.setProperty("java.security.krb5.realm", "MY.REALM");
System.setProperty("java.security.kdc", "kdc.server.com");
System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
System.setProperty("java.security.auth.login.config", "/home/fred/kerberostest/jaas.conf");

LoginContext context = new LoginContext("Client");
context.login();

Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);

InputStream in = fs.open(new Path("/mytestfile"));
int b = in.read();
in.close();

我的 jaas.conf 文件看起来像这样.....

Client {
   com.sun.security.auth.module.Krb5LoginModule required
   debug=true
   useKeyTab=true
   keyTab="/home/fred/kerberostest/krb5.keytab"
   principal="myprinc/myserver.com@MY.REALM"
   useTicketCache=false;
}

当我运行上面的 java 代码时,LoginContext.login 似乎工作正常......我得到一个调试语句,上面写着

Login successful for user myprinc/myserver.com@MY.REALM using keytab file /home/fred/kerberostest/krb5.keytab

但是,当代码尝试打开 HDFS 文件 (fs.open) 时,应用程序失败并出现 PriviledgedActionException,说明:

ERROR security.UserGroupInformation: PriviledgedActionException as :fred (auth:KERBEROS) cause:javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]

所以,它试图使用“fred”(我的 linux 登录)来访问这些文件,而不是我从 keytab 文件中获取的主要信息。同样,如果我先执行 kinit,它可以正常工作....但是 LoginContext 不应该做同样的事情吗?

注意:这是 Kerberos 的 ActiveDirectory“版本”。它不使用信任...只是直接到 ActiveDirectory。

【问题讨论】:

    标签: java hadoop active-directory kerberos


    【解决方案1】:

    我将此归咎于我们的 Active Directory 实施。我用 MIT Kerberos 做到了这一点,它运行良好。关闭。

    【讨论】:

    • 属性名不应该是 java.security.krb5.kdc 而不是 java.security.kdc 否则你会得到: Caused by: KrbException: System property java.security.krb5.kdc and java .security.krb5.realm 两者都必须设置或都不设置。
    • 我的测试显示应该还有一个分号';'作为 jaas.conf 文件中的最后一个字符。
    • 您对哪个 Kerberos 实现有问题?
    • 只是为了澄清,我设置的一切都是正确的。活动目录上的人没有正确设置主体。当我创建自己的 MIT Kerberos 时,一切正常,这有助于 AD 人员弄清楚他们需要做什么。
    猜你喜欢
    • 2013-12-24
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多