/ / connectez-vous à la ruche dans un cluster sécurisé authentifié par Kerberos à l'aide de keytab - Hadoop, ruche, Kerberos, Cloudera, fil

se connecter à la ruche dans un cluster sécurisé authentifié Kerberos à l'aide de keytab - Hadoop, ruche, Kerberos, Cloudera, fil

J'utilise CDH 5.3.3 et le pilote hive JDBC pour me connecter à hive dans le cluster sécurisé. J'ai essayé de me connecter en utilisant keytab en utilisant

UserGroupInformation.loginUserFromKeytab (lprincipal, keytabpath);

J'ai utilisé le format suivant pour url ruche.

jdbc: hive2: // localhost: 10000; AuthMech = 1; KrbRealm = EXAMPLE.COM; KrbHostFQDN = hs2.example.com; KrbServiceName = ruche

Exemple de code:

// Authenticating Kerberos principal
System.out.println("Principal Authentication: ");
final String user = "cloudera@CLOUDERA.COM";
final String keyPath = "cloudera.keytab";
UserGroupInformation.loginUserFromKeytab(user, keyPath);
Connection connection = DriverManager.getConnection(url);

L'URL est au format suivant:

jdbc: hive2: // localhost: 10000; AuthMech = 1; KrbRealm = EXAMPLE.COM; KrbHostFQDN = hs2.example.com; KrbServiceName = ruche

J'obtiens l'exception suivante. J'apprécierais si de l'aide était fournie pour identifier la cause de ce problème:

com.cloudera.hive.support.exceptions.GeneralException: CONN_KERBEROS_AUTHENTICATION_ERROR_GET_TICKETCACHE

javax.security.auth.login.LoginException: Unable to obtain Princpal Name for authentication
at com.sun.security.auth.module.Krb5LoginModule.promptForName(Krb5LoginModule.java:800)
at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:671)
at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:584)
at sun.reflect.NativeMethodAccessorImpl.inv

Pour une distribution différente du cluster, après l’ajout du débogage, je vois l’exception suivante:

DEBUG org.apache.hadoop.security.UserGroupInformation: hadoop login
DEBUG org.apache.hadoop.security.UserGroupInformation: hadoop login commit
DEBUG org.apache.hadoop.security.UserGroupInformation: using kerberos            user:null
DEBUG org.apache.hadoop.security.UserGroupInformation: using local user:UnixPrincipal: user66
DEBUG org.apache.hadoop.security.UserGroupInformation: UGI loginUser:user66 (auth:KERBEROS)
DEBUG org.apache.hadoop.security.UserGroupInformation: PrivilegedAction as:user66 (auth:KERBEROS) from:org.apache.hadoop.hive.thrift.client.TUGIAssumingTransport.open(TUGIAssumingTransport.java:49)
DEBUG org.apache.thrift.transport.TSaslTransport: opening transport org.apache.thrift.transport.TSaslClientTransport@1f20a0ab
ERROR org.apache.thrift.transport.TSaslTransport: SASL negotiation failure
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException:   No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
at   com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:212)
at org.apache.thrift.transport.TSaslClientTransport.handleSaslStartMessage(TSaslClientTransport.java:94)
at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:253)
at org.apache.thrift.transport.TSaslClientTransport.open(TSaslClientTransport.java:37)
at org.apache.hadoop.hive.thrift.client.TUGIAssumingTransport$1.run(TUGIAssumingTransport.java:52)
at org.apache.hadoop.hive.thrift.client.TUGIAssumingTransport$1.run(TUGIAssumingTransport.java:49)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548)
at org.apache.hadoop.hive.thrift.client.TUGIAssumingTransport.open(TUGIAssumingTransport.java:49)
at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:156)
at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:96)
at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:104)

Réponses:

9 pour la réponse № 1

Attention mortel: Kerberos n'est que de la magie noire. Il va aspirer votre âme. Sérieusement.

Maintenant, il y a très mal documenté manière d’activer la trace GSSAPI, c’est votre seul espoir de zoom sur le problème réel (probablement une erreur de syntaxe cryptique dans un fichier de configuration que GSS ignore en mode silencieux par défaut)

-Djava.security.debug=gssloginconfig,configfile,configparser,logincontext

Le livre de sorts original est .


1 pour la réponse № 2

Ce lien vous aidera à connecter le cluster de ruche activé (kerberisé) activé par Kerberos à l’aide de keytab.

Puisque vous avez déjà un fichier keytab en place,vous avez également besoin du fichier de configuration JAAS, de l'abstraction Java Subjects et de Java CallbackHandler pour une connexion réussie. Et bien sûr, des bibliothèques dépendantes (fichiers JAR) sont nécessaires.

HTH.


0 pour la réponse № 3

http://appcrawler.com/wordpress/2015/06/18/examples-of-connecting-to-kerberos-hive-in-jdbc/

avoir des exemples de travail pour la connexion JDBC à un Hive kérberisé.

Bon conseil de Samson Scharfrichter sur le débogage. +1 "d

javax.security.sasl.SaslException: échec de l’initialisation GSS [Caused by GSSException: aucune information d'identification valide fournie (niveau de mécanisme: échec trouver n'importe quel groupe de Kerberos)] à l'adresse com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge (GssKrb5Client.java:212) à org.apache.thrift.transport.TSaslClientTransport.handleSaslStartMessage (TSaslClientTransport.java:94)

"Échec de l'initiation GSS" + "GSSException: aucune information d'identification valide fournie" signifie normalement votre côté client Le ticket kerberos n’existe pas ou a expiré.

Veuillez exécuter klist côté client et copier-coller ici.