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

时间:2016-08-04 13:26:04

标签: jdbc hive kerberos

 {
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=EX‌​AMPLE.COM;KrbHostFQDN=hs2.example.com;KrbServiceName=hive");
info("Got Connection");
}

{ String driverName =" com.cloudera.hive.jdbc4.HS2Driver&#34 ;;
conf.set(" hadoop.security.authentication"," kerberos"); info(" Getting Connection"); UserGroupInformation.setConfiguration(CONF);
UserGroupInformation.loginUserFromKeytab(" **** @的 .COM""等等/ ****密钥表"。) ;
的Class.forName(DRIVERNAME); info(" Getting Connection");连接con =
的DriverManager.getConnection(" JDBC:hive2://本地主机:10000; AuthMech = 1; KrbRealm = EX AMPLE.COM; KrbHostFQDN = hs2.example.com; KrbServiceName =蜂巢&#34); info(" Got Connection"); }

18:47:51,894 ERROR [1]在未知行中运行时出错。脚本中发生意外异常。脚本部分:运行。引起:LoginException发生。无法获取Princpal名称进行身份验证 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)     at oracle.oats.scripting.modules.basic.api.IteratingVUser.run(IteratingVUser.java:351)     at 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:无法获取Princpal名称进行身份验证     at com.sun.security.auth.module.Krb5LoginModule.promptForName(Krb5LoginModule.java:733)     at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:629)     在com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:542)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)     at 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)     at java.security.AccessController.doPrivileged(Native Method)     在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)     at oracle.oats.scripting.modules.basic.api.IteratingVUser.run(IteratingVUser.java:351)     at oracle.oats.scripting.modules.basic.api.internal.IteratingAgent.run(IteratingAgent.java:801)     在java.lang.Thread.run(Thread.java:619)

1 个答案:

答案 0 :(得分:1)

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

但是Hive JDBC驱动程序使用Thrift客户端库,它支持Kerberos auth的原始JAAS配置

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

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

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

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="my_login@MY.REALM"
  debug=true;
};

请注意the syntax above适用于Sun / Oracle JDK和OpenJDK,但不适用于使用不同语法的IBM JDK ...
无论是使用DataDirect连接器还是不行(与Oracle,IBM,Microstrategy等一起提供,其中包含特定的"主题"在conf。

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

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

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