在 kerberos 授权下使用 JDBC 连接到 impala 时出错
Posted
技术标签:
【中文标题】在 kerberos 授权下使用 JDBC 连接到 impala 时出错【英文标题】:Error when connect to impala with JDBC under kerberos authrication 【发布时间】:2017-02-27 03:41:43 【问题描述】:我创建了一个扩展 DriverManagerDataSource 的 SecureImpalaDataSource 类,并使用 UserGroupInformation.doAs()
通过 keytab 文件获取到 impala 的连接。但我得到如下错误:
java.sql.SQLException: [Simba]ImpalaJDBCDriver 错误 为身份验证初始化或创建的传输: [Simba]ImpalaJDBCDriver 无法连接到服务器:null。
但是当我在测试演示中获得与 kerberos 票证缓存的连接时,我是成功的。谁能帮帮我?
【问题讨论】:
【参考方案1】:忘记 Hadoop UGI:JDBC 驱动程序只需要原始 JAAS 配置即可即时创建 Kerberos 票证(提高了useKeyTab
并降低了useTicketCache
)。 p>
系统属性
java.security.krb5.conf
=>(可选)非默认 Kerberos 配置
java.security.auth.login.config
=> JAAS 配置文件
javax.security.auth.useSubjectCredsOnly
=> 必须强制为“false”(在某些 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="dummy@SOME.REALM"
debug=false;
;
示例 JAAS conf 文件,Apache Hive 驱动程序
只需将部分名称从 Client
更改为 com.sun.security.jgss.krb5.initiate
PS:您可以在同一个 conf 文件中填充多个部分;这意味着您可以定义一个“全局”配置,并将其与多个工具、驱动程序和库一起使用,并具有一致的设置。
调试
sun.security.krb5.debug
=> 设置为“真”
java.security.debug
=> 设置为“gssloginconfig,configfile,configparser,logincontext”
【讨论】:
非常感谢。虽然你的回答并不能帮助我解决我的问题。【参考方案2】:结果是我的网址中的HOST和FQDN不一致。
【讨论】:
【参考方案3】:验证 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
......
【讨论】:
以上是关于在 kerberos 授权下使用 JDBC 连接到 impala 时出错的主要内容,如果未能解决你的问题,请参考以下文章
为啥我们在启用 Kerberos 的 EMR 集群上使用直线连接到 Hive 时使用 Hive 服务主体?
使用 Kerberos 连接到 SMB 共享时出现 KrbException“消息流已修改 (41)”
连接到 cloudera impala 环境时出现 Kerberos 错误
使用 Rstudio windows 中的 R rJDBC 包连接到 hive(启用了 kerbero)