본문 바로가기

OpenSource/Spring

[Spring] Hadoop Kerberos 티켓 갱신 실패 시 해결방법(javax.security.sasl.SaslException: GSS initiate failed)

스프링 프로젝트에서 커버로스 인증을 통한 hdfs에 접근하려면 org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytab 을 이용하여 커버로스 티켓을 생성할 수 있다.

@Configuration
class HadoopConfig {
    @Bean
    public org.apache.hadoop.conf.Configuration hadoopConfig() {
        Configuration conf = new Configuration();

        UserGroupInformation.setConfiguration(conf);
        UserGroupInformation.loginUserFromKeytab(kerberosUser, keytabPath);

        return conf;
    }
}

위와 같이 커버로스 키탭을 이용하여 커버로스 티켓을 할당받을 수 있으며, loginUserFromKeytab으로 생성된 커버로스 티켓은 expire가 되기전 자동으로 커버로스 티켓이 갱신이 되기때문에 더이상 수동으로 티켓을 재할당 받거나 하는 코드가 필요하지 않다.

하지만 위와 같은 설정을 했음에도 불구하고, 하루정도 지난 뒤 티켓이 갱신 되지 못하면 아래와 같은 에러가 발생한다.

Caused by: javax.security.sasl.SaslException: GSS initiate failed
        at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211)
        at org.apache.hadoop.security.SaslRpcClient.saslConnect(SaslRpcClient.java:413)
        at org.apache.hadoop.ipc.Client$Connection.setupSaslConnection(Client.java:553)
        at org.apache.hadoop.ipc.Client$Connection.access$1800(Client.java:368)
        at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:722)
        at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:718)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
        at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:717)
        ... 74 common frames omitted
Caused by: org.ietf.jgss.GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
        at sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:162)
        at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:122)
        at sun.security.jgss.krb5.Krb5MechFactory.getMechanismContext(Krb5MechFactory.java:189)
        at sun.security.jgss.GSSManagerImpl.getMechanismContext(GSSManagerImpl.java:224)
        at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:212)
        at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179)
        at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:192)
        ... 83 common frames omitted

해결방법

하둡 클라이언트 라이브러리를 추가할때 정확한 버전의 라이브러리를 추가하면 된다.
필자는 CDH(클라우데라) 하둡을 사용하고 있기 때문에 아래와 같은 버전으로 변경하여 해결하였다.

<!-- maven pom.xml -->

<!-- 기존 문제가 발생한 버전 -->
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-client</artifactId>
  <version>2.6.0</version>
</dependency>

<!-- 문제 해결 버전 -->
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-client</artifactId>
  <version>2.6.0-cdh5.14.2</version>
</dependency>

위와 같이 하둡버전과, 클라우데라 버전을 설치된 하둡 버전에 맞게 설정하면 커버로스 티켓이 갱신 안되는 문제를 해결할 수 있다.