복붙노트

[HADOOP] keytab을 사용하여 보안 Kerberos 인증 클러스터에서 하이브에 연결

HADOOP

keytab을 사용하여 보안 Kerberos 인증 클러스터에서 하이브에 연결

CDH 5.3.3을 사용하고 하이브 JDBC 드라이버를 사용하여 보안 클러스터의 하이브에 연결합니다. 키탭을 사용하여 로그인을 시도했습니다.

UserGroupInformation.loginUserFromKeytab (lprincipal, keytabpath);

하이브 URL에 다음 형식을 사용했습니다.

jdbc : hive2 : // localhost : 10000; AuthMech = 1; KrbRealm = EXAMPLE.COM; KrbHostFQDN = hs2.example.com, KrbServiceName = 하이브

샘플 코드 :

// 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);

URL 형식은 다음과 같습니다.

jdbc : hive2 : // localhost : 10000; AuthMech = 1; KrbRealm = EXAMPLE.COM; KrbHostFQDN = hs2.example.com, KrbServiceName = 하이브

다음과 같은 예외가 발생합니다.이 문제의 원인을 파악하는 데 도움이된다면 감사하겠습니다.

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

디버그를 추가 한 후에 다른 클러스터 배포판에서 다음 예외가 표시됩니다.

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)

해결법

  1. ==============================

    1.Kerberos는 단지 흑 마술 일뿐입니다. 그것은 당신의 영혼을 빨아 줄 것입니다. 진지하게.

    Kerberos는 단지 흑 마술 일뿐입니다. 그것은 당신의 영혼을 빨아 줄 것입니다. 진지하게.

    이제 GSSAPI 추적을 활성화하는 방법에 대한 문서화 된 방법이 매우 부족합니다. 실제 문제를 확대 할 수있는 유일한 방법입니다 (GSS가 자동으로 기본적으로 무시하는 구성 파일의 문법 오류 일 수 있음)

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

    원래 주문 책이 있습니다.

  2. ==============================

    2.이 링크는 키탭을 사용하여 kerberos가 활성화 된 (kerberised) 하이브 클러스터에 연결하는 데 도움이됩니다.

    이 링크는 키탭을 사용하여 kerberos가 활성화 된 (kerberised) 하이브 클러스터에 연결하는 데 도움이됩니다.

    이미 keytab 파일을 가지고 있기 때문에 성공적인 연결을 위해 JAAS 구성 파일, Java Subjects 추상화 및 Java CallbackHandler가 추가로 필요합니다. 물론 종속 라이브러리 (jar 파일)가 필요합니다.

    HTH.

  3. ==============================

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

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

    kerberized Hive에 JDBC 연결을위한 몇 가지 실제 예제가 있습니다.

    디버깅에 대한 @Samson Scharfrichter의 조언. +1했습니다.

    "GSS 초기화 실패"+ "GSSException : 제공된 유효한 자격 증명이 없습니다" 일반적으로 클라이언트 쪽 kerberos 티켓이 없거나 만료되었다는 의미입니다.

    클라이언트 쪽에서 klist를 실행하고 여기에 복사하여 붙여 넣으십시오.

  4. from https://stackoverflow.com/questions/31824149/connect-to-hive-in-a-secured-kerberos-authenticated-cluster-using-keytab by cc-by-sa and MIT license