在kerberos authrication下使用JDBC连接到impala时出错

时间:2017-02-27 03:41:44

标签: authentication kerberos jdbctemplate cloudera-cdh impala

我创建了一个扩展DriverManagerDataSource的类SecureImpalaDataSource,并使用UserGroupInformation.doAs()通过keytab文件获取与impala的连接。但我得到的错误如下:

  

java.sql.SQLException:[Simba] ImpalaJDBCDriver错误   初始化或创建的身份验证传输:   [Simba] ImpalaJDBCDriver无法连接到服务器:null。

但是当我在测试演示中获得与kerberos票证缓存的连接时,我很成功。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

忘记Hadoop UGI:JDBC驱动程序只需要原始JAAS配置即时创建Kerberos票证(引发useKeyTab并降低useTicketCache

系统属性

  • java.security.krb5.conf => (可选)非defero Kerberos conf
  • java.security.auth.login.config => JAAS配置文件
  • javax.security.auth.useSubjectCredsOnly =>必须被迫“错误”#34; (某些Java版本中的默认值已更改,duh)

示例JAAS配置文件,Impala / Hive Cloudera驱动程序
这里有一个Java风格的Windows路径。

Client {
  com.sun.security.auth.module.Krb5LoginModule
    required
  useTicketCache=false
  doNotPrompt=true
  useKeyTab=true
  keyTab="file:C:/blah/blah/dummy.keytab"
  principal="dummy@SOME.REALM"
  debug=false;
};

示例JAAS配置文件,Apache Hive驱动程序
只需将部分名称从Client更改为com.sun.security.jgss.krb5.initiate
PS:你可以在同一个conf文件中填充多个部分;这意味着你可以定义一个"全球" conf并将其与多种工具一起使用&司机& libs,具有一致的设置。

<强>调试

  • sun.security.krb5.debug =&gt;设置为&#34; true&#34;
  • java.security.debug =&GT;设置为&#34; gssloginconfig,configfile,configparser,logincontext&#34;

答案 1 :(得分:1)

结果是我的URL中的HOST和FQDN不一致。

答案 2 :(得分:1)

验证jdbc连接的一种方法是使用ugi.doAs。以下是示例代码:

// 1. login use keytab
System.setProperty("java.security.krb5.realm", "XXX.COM");
System.setProperty("java.security.krb5.kdc", "kdcXXX");
Configuration conf = new Configuration();
conf.set("hadoop.security.authentication", "Kerberos");
UserGroupInformation.setConfiguration(conf);
UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("test", "test.keytab");

// 2. create impala jdbc connection
Class.forName(JDBCDriverName);
conn = (Connection) ugi.doAs(new PrivilegedExceptionAction<Object>() {
  public Object run() {
    Connection tcon = null;
    try {
      tcon = DriverManager.getConnection(connectionUrl);
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return tcon;
  }
});

// 3. execute query using conn
......