authentication kerberos jdbctemplate cloudera-cdh impala

authentication - Error al conectarse a impala con JDBC bajo autenticación Kerberos



jdbctemplate cloudera-cdh (3)

Creo una clase SecureImpalaDataSource que extiende DriverManagerDataSource, y uso UserGroupInformation.doAs() para obtener una conexión a impala con el archivo keytab. Pero me sale el error de la siguiente manera:

java.sql.SQLException: [Simba] ImpalaJDBCDriver Error inicializado o creado transporte para la autenticación: [Simba] ImpalaJDBCDriver No se puede conectar al servidor: nulo.

Pero tengo éxito cuando obtengo la conexión con el caché de tickets kerberos en una demostración de prueba. ¿Alguien puede ayudarme?


El resultado es que el HOST y el FQDN en mi URL son inconsistentes.


Olvídese de la UGI de Hadoop: un controlador JDBC solo necesita la configuración RAAS sin procesar para crear un ticket Kerberos sobre la marcha (con useKeyTab elevado y useTicketCache reducido) .

Propiedades del sistema

  • java.security.krb5.conf => (opcional) conf Kerberos no predeterminado
  • java.security.auth.login.config => archivo de configuración JAAS
  • javax.security.auth.useSubjectCredsOnly => debe forzarse a "falso" (el valor predeterminado ha cambiado en algunas versiones de Java, duh)

Ejemplo de archivo conf de JAAS, controladores Impala / Hive Cloudera
Aquí con una ruta de Windows en notación de estilo Java.

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; };

Ejemplo de archivo conf de JAAS, controlador de Apache Hive
Simplemente cambie el nombre de la sección del Client a com.sun.security.jgss.krb5.initiate
PD: puede rellenar varias secciones en el mismo archivo conf; esto significa que puede definir una configuración "global" y usarla con múltiples herramientas, controladores y bibliotecas, con configuraciones consistentes.

Depuración

  • sun.security.krb5.debug => establecido en "verdadero"
  • java.security.debug => establecido en "gssloginconfig, configfile, configparser, logincontext"

Una forma de autenticar su conexión jdbc es usar ugi.doAs. Aquí está el código de ejemplo:

// 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 ......