Big Data/Kafka

[Kafka] SASL/SCRAM 인증

devidea 2020. 9. 9. 14:51

이번글에서는 SCRAM 인증에 대해서 살펴보고자 한다.

앞선 2개의 글(SASL/PLAIN, Kerberos) 에서 SASL 인증을 사용했을 때, 대략적인 설정 방법은 비슷하기 때문에 참고하면 좋다.

그래서 이 글에서는 SCRAM의 특징과 다른 인증과의 차이점이 무엇인지 살펴보면 의미가 있을 것 같다.

 

1. SCRAM?

SCRAM은 Salted Challenge Response Authentication Mechanism의 약칭이다. 간단히 설명하면 전통적인 사용자/비밀번호를 통해 인증을 처리하는데 비밀번호를 암호화해서 저장하는 방식이다. 카프카에서는 SCRAM-SHA-256과 SCRAM-SHA-512를 지원한다. 카프카는 SCRAM의 기본 저장소로 주키퍼를 사용한다. 실습을 진행하면서 주키퍼에 어떻게 저장되는지도 살펴볼 예정이다.

 

2. Credential 생성

카프카는 kafka-config.sh 커맨드로 주키퍼에 Credential를 생성할 수 있다. Credential을 사전에 찾아보면 인증서, 증명서라는 뜻인데, Credential의 생성은 주키퍼에 사용자 정보를 저장하는 것과 동일하다. 주의할 부분은 카프카 브로커에 내부 통신용 인증을 적용하기 전에 Credential을 먼저 생성해야 한다.

 

kafka-config.sh 커맨드로 Credential을 생성한다.

아래 예를 보면 비밀번호가 플레인 텍스트로 지정된다. 하지만 SCRAM 방식에 따라 비밀번호가 암호화되서 주키퍼에 저장된다.

 

주키퍼의 저장된 내용을 보자(그림 1). 주키퍼의 저장 위치는 /config/users/{사용자 이름} 이다.

stored_key 값으로 암호화된 비밀번호가 저장된 것을 확인할 수 있다.

그림1. 주키퍼에 저장된 Credential

사용자 정보는 kafka-configs.sh 커맨드로 확인할 수 있는데, 주키퍼에 저장된 정보와 동일하게 제공된다.

 

3. 브로커 설정

브로커 설정은 다른 인증방식과 비슷하다. 다만 사용하는 인증모듈의 설정만 다르다. 2개의 파일 설정을 진행한다.

  1. 인증 정보를 포함하는 JAAS 파일
  2. 브로커 설정에서 인증방식 변경 (server.properties)

JAAS에서 인증방식은 org.apache.kafka.common.security.scram.ScramLoginModule으로 설정한다. 그리고 인증정보를 넣는다.

 

server.properties에서는 다음 항목이 변경된다.

 

참고로 inter.broker.protocol은 브로커 내부간의 인증방식을 지정하는 것이다. 만약 여러개의 프로토콜을 사용한다면 (예를 들어 PLAINTEXT 포함) 다른 프로토콜을 사용해도 상관없다.

 

설정이 끝났다면 브로커를 시작할 때, 앞서 생성한 JAAS 파일을 KAFKA_OPTS에 포함해서 실행하면 된다.

KAFKA_OPTS="-Djava.security.auth.login.config={jaas 파일} ./bin/kafka-server-start.sh ./config/server.properties

 

4. 클라이언트 테스트

클라이언트도 인증을 적용해서 시작해야 한다. 간단한 테스트를 위해 앞서 생성한 alice 사용자로 kafka-console-producer.sh를 수행해보자.

수행하는 방식은 비슷하다. 그런데 브로커에서 설정했던 것과 다르게 JAAS 파일을 생성하지 않고 프로듀서 설정만으로 동작하는 방법이 있다.

 

아래 내용은 프로듀서 설정에서 인증 변경에 따라 필요한 값만 정리했다.

주목한 곳은 sasl.jaas.config 값이다. JAAS 파일로 만들었던 내용을 프로듀서 설정 안에 넣을 수 있다.

security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="alice" password="alice-secret";

JAAS 파일을 생성하지 않아도 되니, KAFKA_OPTS는 지정하지 않아도 된다.

./bin/kafka-console-producer.sh --broker-list localhost:9094 --topic test --producer.config ./config/producer_sasl.properties

인증을 설정하지 않았을 때의 오류는 다른 인증방식의 결과와 동일하다. 인증값을 다르게 하면서 직접 테스트 해보면 좋을 듯 하다.

 

5. 결론

카프카의 JAAS를 사용한 인증방식은 대부분 비슷한 설정을 따르고 있어서 실습해 보는데 어렵지 않았다. SCRAM은 Kerberos나 OAuth처럼 다른 시스템이 필요하지 않아서 적용하는데 더 부담이 없었다. 그리고 SASL/PLAIN과 같이 비밀번호가 노출되도록 저장되지 않아서 사용자에 의해 비밀번호를 등록할 수 있게 한다면 보안상으로도 더 나은 방법으로 생각되었다. 사용자에 의한 비밀번호 설정은 Admin API로 가능할 텐데 테스트 이후에 다른 글을 통해 정리하겠다.

 

 

반응형