关于jdbc:无法通过安全的kerberos连接到HIVE。我正在使用UserGroupInformation.loginUserFromKeytab()

Cannot connect to HIVE with Secured kerberos. I am using UserGroupInformation.loginUserFromKeytab()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 {
String driverName ="com.cloudera.hive.jdbc4.HS2Driver";
conf.set("hadoop.security.authentication","kerberos");
info("Getting Connection");
UserGroupInformation.setConfiguration(conf);    
info("Getting Connection"); `info("Getting Connection");
UserGroupInformation.setConfiguration(conf);


UserGroupInformation.loginUserFromKeytab("****@***.***.COM","etc/****.keytab");
Class.forName(driverName); info("Getting Connection");
Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000;AuthMech=1;KrbRealm=EXa€?a€?AMPLE.COM;KrbHostFQDN=hs2.example.com;KrbServiceName=hive");
info("Got Connection");
}

{
字符串driverName =" com.cloudera.hive.jdbc4.HS2Driver";
conf.set(" hadoop.security.authentication"," kerberos"); info("获得连接"); UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab(" **** @ .. COM"," etc / ****。keytab");
Class.forName(驱动程序名称); info("获得连接");连接con =
DriverManager.getConnection(" jdbc:hive2:// localhost:10000; AuthMech = 1; KrbRealm = EXa?ample.COM; KrbHostFQDN = hs2.example.com; KrbServiceName = hive"); info(" Got Connection");
}

18:47:51,894错误[1]在未知行运行部分中的错误。脚本中发生意外的异常。脚本部分:运行。原因:发生LoginException。无法获取身份验证的原始名称
java.sql.SQLException:[Simba] HiveJDBCDriver初始化或创建用于身份验证的传输错误:CONN_KERBEROS_AUTHENTICATION_ERROR_GET_TICKETCACHE。
在com.cloudera.hive.hivecommon.api.HiveServer2ClientFactory.createTransport(未知来源)
在com.cloudera.hive.hive.api.ExtendedHS2Factory.createClient(未知来源)
在com.cloudera.hive.hivecommon.core.HiveJDBCConnection.connect(未知来源)
在com.cloudera.hive.jdbc.common.BaseConnectionFactory.doConnect(未知来源)
在com.cloudera.hive.jdbc.common.AbstractDriver.connect(未知来源)
在java.sql.DriverManager.getConnection(DriverManager.java:582)
在java.sql.DriverManager.getConnection(DriverManager.java:207)
在script.run(script.java:85)
在oracle.oats.scripting.modules.basic.api.IteratingVUser.run(IteratingVUser.java:351)
在oracle.oats.scripting.modules.basic.api.internal.IteratingAgent.run(IteratingAgent.java:801)
引起原因:com.cloudera.hive.support.exceptions.GeneralException:[Simba] HiveJDBCDriver初始化或创建身份验证传输错误:CONN_KERBEROS_AUTHENTICATION_ERROR_GET_TICKETCACHE。
...另外10个
引起原因:com.cloudera.hive.support.exceptions.GeneralException:CONN_KERBEROS_AUTHENTICATION_ERROR_GET_TICKETCACHE
...另外10个
由以下原因引起:javax.security.auth.login.LoginException:无法获取用于身份验证的主要名称
在com.sun.security.auth.module.Krb5LoginModule.promptForName(Krb5LoginModule.java:733)
在com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:629)
在com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:542)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在java.lang.reflect.Method.invoke(Method.java:597)
在javax.security.auth.login.LoginContext.invoke(LoginContext.java:769)
在javax.security.auth.login.LoginContext.access $ 000(LoginContext.java:186)
在javax.security.auth.login.LoginContext $ 5.run(LoginContext.java:706)
在java.security.AccessController.doPrivileged(本机方法)
在javax.security.auth.login.LoginContext.invokeCreatorPriv(LoginContext.java:703)
在javax.security.auth.login.LoginContext.login(LoginContext.java:575)
在com.cloudera.hive.jdbc.kerberos.Kerberos.getSubjectViaTicketCache(未知来源)
在com.cloudera.hive.hivecommon.api.HiveServer2ClientFactory.createTransport(未知来源)
在com.cloudera.hive.hive.api.ExtendedHS2Factory.createClient(未知来源)
在com.cloudera.hive.hivecommon.core.HiveJDBCConnection.connect(未知来源)
在com.cloudera.hive.jdbc.common.BaseConnectionFactory.doConnect(未知来源)
在com.cloudera.hive.jdbc.common.AbstractDriver.connect(未知来源)
在java.sql.DriverManager.getConnection(DriverManager.java:582)
在java.sql.DriverManager.getConnection(DriverManager.java:207)
在script.run(script.java:85)
在oracle.oats.scripting.modules.basic.api.IteratingVUser.run(IteratingVUser.java:351)
在oracle.oats.scripting.modules.basic.api.internal.IteratingAgent.run(IteratingAgent.java:801)
在java.lang.Thread.run(Thread.java:619)


Hive JDBC驱动程序不使用Hadoop Auth库,因为它们应该能够从集群外部进行连接,并且对Hadoop库的依赖性最小。
因此,实际上,您的UGI设置将被忽略。

但是Hive JDBC驱动程序使用Thrift客户端库,该库支持Kerberos身份验证的原始JAAS配置。

在命令行上使用系统道具的示例:

1
2
3
java -Djava.security.krb5.conf=/etc/krb5.conf \\
     -Djava.security.auth.login.config=./my_jaas.conf \\
     *****

对" my_jaas.conf"进行示例以使用密钥表文件中提供的密码来获取私有Kerberos票证(不从缓存读取,不写入缓存):

1
2
3
4
5
6
7
8
9
10
com.sun.security.jgss.krb5.initiate {
  com.sun.security.auth.module.Krb5LoginModule
    required
  useTicketCache=false
  doNotPrompt=true
  useKeyTab=true
  keyTab="file:/some/path/to/my_login.keytab"
  principal="[email protected]"
  debug=true;
};

请注意,上述语法适用于Sun / Oracle JDK和OpenJDK,但不适用于使用不同语法的IBM JDK ...它也不适用于DataDirect连接器(与Oracle,IBM,Microstrategy等一起提供)。 ),它在conf中需要一个特定的"主题"。

就是这样。当JDBC驱动程序检测到URL请求Kerberos连接时,它将自动调用JAAS,并且JAAS将处理脏工作。

PS:调试安全性配置问题很麻烦,但是您有几个属性可以启用调试跟踪:

1
2
-Dsun.security.krb5.debug=true
-Djava.security.debug=gssloginconfig,configfile,configparser,logincontext