我有一个Hadoop (CDH412)集群设置,它已经启用了Kerberos身份验证和授权。我得到了一切工作良好(Hdfs, mapred, zookeeper, hbase, hive等)。我是,然而,有一个问题,从一个java应用程序内访问hdfs的数据。
我的Java应用程序是一个后台运行的服务。由于这个,没有密码可以输入,我必须使用keytab文件。应该没问题。如果我先做一个"kinit",它会工作得很好,嗯…
kinit -kt /home/fred/kerberostest/krb5.keytab myprinc/myserver.com@MY.REALM
但是,如果我尝试在java代码中这样做(我已经阅读了LoginContext. xml)。Logon将做与kinit相同的事情),它失败了。
为了测试这一点,我编写了以下代码片段....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 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应该做同样的事情吗?
注意:这是一个ActiveDirectory版本的Kerberos。它没有使用信托……
我将把这归咎于我们的Active Directory实现。我用MIT Kerberos做了这个,它工作得很好。关闭。