스프링 프로젝트에서 커버로스 인증을 통한 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>
위와 같이 하둡버전과, 클라우데라 버전을 설치된 하둡 버전에 맞게 설정하면 커버로스 티켓이 갱신 안되는 문제를 해결할 수 있다.
'OpenSource > Spring' 카테고리의 다른 글
[Spring Batch] MapJobRepositoryFactoryBean을 사용하여 메타 테이블 생성 없이 배치 작업 설정 with CommandLineRunner (0) | 2020.02.20 |
---|