Authentication 在kerberos身份验证下使用JDBC连接到impala时出错

Authentication 在kerberos身份验证下使用JDBC连接到impala时出错,authentication,kerberos,jdbctemplate,cloudera-cdh,impala,Authentication,Kerberos,Jdbctemplate,Cloudera Cdh,Impala,我创建了一个扩展DriverManager数据源的SecureImpalaDataSource类,并使用UserGroupInformation.doAs()通过keytab文件获得到impala的连接。但我得到的错误如下: java.sql.SQLException:[Simba]ImpalaJDBCDriver错误 已初始化或创建用于身份验证的传输: [Simba]ImpalaJDBCDriver无法连接到服务器:null 但是,当我在测试演示中获得与kerberos票证缓存的连接时,我就成

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

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


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

忘记Hadoop UGI吧:JDBC驱动程序只需要原始JAAS配置就可以动态创建Kerberos票证(提升
useKeyTab
并降低
useTicketCache

系统属性

  • java.security.krb5.conf
    =>(可选)非defaut Kerberos conf
  • java.security.auth.login.config
    =>JAAS配置文件
  • javax.security.auth.UseSubjectCredOnly
    =>必须强制为“false”(默认值在某些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配置单元驱动程序
只需将节名从
Client
更改为
com.sun.security.jgss.krb5.initiate

PS:您可以在同一个conf文件中填充多个部分;这意味着您可以定义一个“全局”配置,并将其与多个工具&驱动程序和lib一起使用,并具有一致的设置

调试

  • sun.security.krb5.debug
    =>设置为“true”
  • java.security.debug
    =>设置为“gssloginconfig、configfile、configparser、logincontext”

忘记Hadoop UGI:JDBC驱动程序只需要原始JAAS配置就可以动态创建Kerberos票证(提升
useKeyTab
并降低
useTicketCache

系统属性

  • java.security.krb5.conf
    =>(可选)非defaut Kerberos conf
  • java.security.auth.login.config
    =>JAAS配置文件
  • javax.security.auth.UseSubjectCredOnly
    =>必须强制为“false”(默认值在某些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配置单元驱动程序
只需将节名从
Client
更改为
com.sun.security.jgss.krb5.initiate

PS:您可以在同一个conf文件中填充多个部分;这意味着您可以定义一个“全局”配置,并将其与多个工具&驱动程序和lib一起使用,并具有一致的设置

调试

  • sun.security.krb5.debug
    =>设置为“true”
  • java.security.debug
    =>设置为“gssloginconfig、configfile、configparser、logincontext”

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

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

验证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
......
//1。登录使用密钥表
setProperty(“java.security.krb5.realm”、“XXX.COM”);
setProperty(“java.security.krb5.kdc”、“kdcXXX”);
Configuration conf=新配置();
conf.set(“hadoop.security.authentication”、“Kerberos”);
UserGroupInformation.setConfiguration(conf);
UserGroupInformation ugi=UserGroupInformation.loginuserfromkeytabanderturnugi(“test”,“test.keytab”);
// 2. 创建impala jdbc连接
类forName(JDBCDriverName);
conn=(连接)ugi.doAs(新的PrivilegedExceptionAction(){
公共对象运行(){
连接tcon=null;
试一试{
tcon=DriverManager.getConnection(connectionUrl);
}捕获(SQLE异常){
e、 printStackTrace();
}
返回tcon;
}
});
// 3. 使用conn执行查询
......

验证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
......
//1。登录使用密钥表
setProperty(“java.security.krb5.realm”、“XXX.COM”);
setProperty(“java.security.krb5.kdc”、“kdcXXX”);
Configuration conf=新配置();
conf.set(“hadoop.security.authentication”、“Kerberos”);
UserGroupInformation.setConfiguration(conf);
UserGroupInformation ugi=UserGroupInformation.loginuserfromkeytabanderturnugi(“test”,“test.keytab”);
// 2. 创建impala jdbc连接
类forName(JDBCDriverName);
conn=(连接)ugi.doAs(新的PrivilegedExceptionAction(){
公共对象运行(){
连接tcon=null;
试一试{
tcon=DriverManager.getConnection(connectionUrl);
}捕获(SQLE异常){
e、 printStackTrace();
}
返回tcon;
}
});
// 3. 使用conn执行查询
......

非常感谢。虽然你的回答不能帮我解决我的问题。非常感谢。虽然你的回答无助于我解决问题。