【问题标题】:Error when connect to impala with JDBC under kerberos authrication在 kerberos 授权下使用 JDBC 连接到 impala 时出错
【发布时间】:2017-02-27 03:41:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: authentication kerberos jdbctemplate cloudera-cdh impala


    【解决方案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
      ......
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-22
        • 1970-01-01
        • 2019-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多