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 № 1Attention 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 Là.
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.