使用kerberos验证连接到具有JDBC的impala时出错
问题描述:
我创建了一个扩展DriverManagerDataSource的类SecureImpalaDataSource,并使用UserGroupInformation.doAs()
通过keytab文件获取与impala的连接。但我得到的错误如下:使用kerberos验证连接到具有JDBC的impala时出错
值java.sql.SQLException:[辛巴] ImpalaJDBCDriver错误 初始化或进行身份验证创建交通: [辛巴] ImpalaJDBCDriver无法连接到服务器:空。
但是,当我在测试演示中获得与kerberos票证缓存的连接时,我很成功。任何人都可以帮助我?
答
其结果是,该我的URL中的HOST和FQDN不一致。
答
忘掉Hadoop的UGI:JDBC驱动程序只需要原始JAAS配置创建一个Kerberos票据上即时(与useKeyTab
升起和降下useTicketCache
)。
系统属性
-
java.security.krb5.conf
=>(可选)非defaut的Kerberos CONF -
java.security.auth.login.config
=> JAAS配置文件 -
javax.security.auth.useSubjectCredsOnly
=>必须强制为 “假” (该默认已经在一些Java版本中发生了变化,嗯)
示例JAAS conf文件,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="[email protected]"
debug=false;
};
样品JAAS的conf文件,Apache的配置单元驱动
只需更改节的名称从Client
到com.sun.security.jgss.krb5.initiate
PS:你的东西,在相同的conf文件的多个部分;这意味着您可以定义一个“全局”配置文件,并使用它与多个工具&驱动程序库,具有一致的设置。
调试
-
sun.security.krb5.debug
=>设置为 “true” -
java.security.debug
=>设置为 “gssloginconfig,CONFIGFILE,configparser,LoginContext的”
答
验证您的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
......
非常感谢。 \t 虽然你的回答不会帮助我解决我的问题。 – SimbaHuang