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