在 kerberos 授权下使用 JDBC 连接到 impala 时出错
Error when connect to impala with JDBC under kerberos authrication
我创建了一个扩展 DriverManagerDataSource 的 class SecureImpalaDataSource,并使用 UserGroupInformation.doAs()
通过密钥表文件获得到 impala 的连接。但是我得到如下错误:
java.sql.SQLException: [Simba]ImpalaJDBCDriver Error
initialized or created transport for authentication:
[Simba]ImpalaJDBCDriver Unable to connect to server: null.
但是当我在测试演示中获得与 kerberos 票证缓存的连接时,我成功了。谁能帮帮我?
忘掉 Hadoop UGI:JDBC 驱动程序只需要原始 JAAS 配置来即时创建 Kerberos 票证 (useKeyTab
已引发并且 useTicketCache
降低).
系统属性
java.security.krb5.conf
=>(可选)非默认 Kerberos conf
java.security.auth.login.config
=> JAAS 配置文件
javax.security.auth.useSubjectCredsOnly
=> 必须强制为 "false" (默认值在某些 Java 版本中已更改,duh)
示例 JAAS 配置文件,Impala/Hive Cloudera 驱动程序
这里有一个 Windows 路径,采用 Java 风格的表示法。
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 conf 文件,Apache Hive 驱动程序
只需将部分名称从 Client
更改为 com.sun.security.jgss.krb5.initiate
PS:你可以在同一个conf文件中填充多个部分;这意味着您可以定义一个 "global" conf 并将其与多个工具、驱动程序和库一起使用,并具有一致的设置。
调试
sun.security.krb5.debug
=> 设置为 "true"
java.security.debug
=>设置为"gssloginconfig,configfile,configparser,logincontext"
结果是我URL中的HOST和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
......
我创建了一个扩展 DriverManagerDataSource 的 class SecureImpalaDataSource,并使用 UserGroupInformation.doAs()
通过密钥表文件获得到 impala 的连接。但是我得到如下错误:
java.sql.SQLException: [Simba]ImpalaJDBCDriver Error initialized or created transport for authentication: [Simba]ImpalaJDBCDriver Unable to connect to server: null.
但是当我在测试演示中获得与 kerberos 票证缓存的连接时,我成功了。谁能帮帮我?
忘掉 Hadoop UGI:JDBC 驱动程序只需要原始 JAAS 配置来即时创建 Kerberos 票证 (useKeyTab
已引发并且 useTicketCache
降低).
系统属性
java.security.krb5.conf
=>(可选)非默认 Kerberos confjava.security.auth.login.config
=> JAAS 配置文件javax.security.auth.useSubjectCredsOnly
=> 必须强制为 "false" (默认值在某些 Java 版本中已更改,duh)
示例 JAAS 配置文件,Impala/Hive Cloudera 驱动程序
这里有一个 Windows 路径,采用 Java 风格的表示法。
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 conf 文件,Apache Hive 驱动程序
只需将部分名称从 Client
更改为 com.sun.security.jgss.krb5.initiate
PS:你可以在同一个conf文件中填充多个部分;这意味着您可以定义一个 "global" conf 并将其与多个工具、驱动程序和库一起使用,并具有一致的设置。
调试
sun.security.krb5.debug
=> 设置为 "true"java.security.debug
=>设置为"gssloginconfig,configfile,configparser,logincontext"
结果是我URL中的HOST和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
......