나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Big Data/Kafka

[Kafka] 인증 - SASL/PLAIN

devidea 2019. 3. 26. 10:57
최근 Kafka 인증에 대해서 살펴보고 있는데, 인증에서 가장 기본이 되는 SASL/PLAIN에 대해서 정리해 보고자 한다.
블로그의 내용은 Kafka Document의 내용을 토대로 직접 실습해보고 정리한 내용이다.

SASL/PLAIN 인증 방식은 가장 먼저 머리속에 떠오르는 id/password를 통한 인증이다.
id/password로 인증을 할 때는, SSL 통신을 해야 plain text가 노출되지 않는다.
Kafka에서는 SASL_SSL, SASL_PLAIN 2가지 타입이 있으며, Live 환경에서는 SASL_SSL으로 설정해서 SSL 통신을 하도록 추천하고 있다.

SASL/PLAIN 인증을 하기 위해서는 인증정보를 포함한 conf 파일을 Broker, Client에 각각 만들어 줘야 한다.
먼저 Broker에서 필요한 설정 정보를 보자.

[Broker 설정 - kafka_server_jaas.conf 파일]
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="admin-secret"
    user_admin="admin-secret"
    user_alice="alice-secret";
};

org.apache.kafka.common.security.plain.PlainLoginModule로 적어진 부분이 SASL/PLAIN을 사용하겠다고 정의한 부분이다.

주의깊게 볼 부분은 아래 user_{username}의 규칙으로 적힌 부분이다.
Broker 내부 설정에서 user_{username}의 key, password value로 user들을 관리하고 있다.

2.0 버전부터는 password를 Broker에 저장하지 않도록 password check 로직을 분리하는 callback handler를 만들 수 있게 되었다.
ssal.server.callback.handler.class를 구현하는 방식이다.

위 Broker 설정에서는 Broker 간의 데이터 교환은 admin 계정이 하도록 했다.


[server.properties 설정 추가]
user/password 관련 설정 파일을 추가한 다음 server.properties에서도 어떤 인증 방식을 사용할 것인지 설정해야 한다.
listeners=SASL_PLAIN://localhost:9092
security.inter.broker.protocol=SASL_PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN

위 설정들은 SASL_PLAIN으로 listeners를 추가하고 Broker 간의 내부통신은 SASL/PLAIN으로 한다는 의미이다.

이제 Broker를 실행해 보자.
실행 시 주의할 점은 JVM 파라미터로 아래 값을 추가해야 한다. 제일 먼저 만든 kafka_server_jaas.conf 파일을 JVM java.security.auth.login.config 파라미터로 할당해 주는 것이다.
JVM 파라미터는 Client에서도 넣어야 하니 주의하자.
-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf

그럼 Broker를 정상적으로 실행시키고 나서 kafka-console-producer로 데이터 전송 테스트를 해보자.
앞서 이야기 했듯이 Client도 JVM 설정이 필요한데, 아래 내용은 Clinet 용 conf 파일이다.

[Client 설정 - kafka_client_jaas.conf 파일]
KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
    username="alice"
    password="alice-secret";
};

Broker와 거의 동일한 내용인데, Broker 처럼 user_{username}으로 user들의 리스트를 가지고 있지 않는 부분이 다르다.

필자는 아래와 같이 KAFKA_OPTS에 JVM 옵션을 주고 kafka-console-producer를 실행했다.
# start producer
export KAFKA_OPTS="-Djava.security.auth.login.config=/kafka/config/kafka_client_jaas.conf"
./kafka-console-producer.sh --broker-list localhost:9092 --topic test --producer.config=/kafka/config/producer.properties

만약 kafka_client_jaas.conf 파일을 JVM 파라미터로 설정하지 않거나,
kafka_client_jaas.conf에 설정된 user/password가 Broker에 등록된 내용과 같지 않다면 인증 실패로 Broker에 연결이 실패하게 된다.

Kafka의 SASL/PLAIN 인증과 관련해서 살펴봤다.
Kafka에서 인증은 데이터 유출 측면에서 굉장히 중요한 기능이다. 인증 기능을 가지고 있지 않은 Kafka의 정보가 외부에 노출된다면, Consumer 하나만 따로 개발하면 쉽게 데이터를 유출할 수 있기 때문이다. 뿐만 아니라 Topic의 설정들도 쉽게 바꿀 수 있기에 retention, replica 등의 주요 설정도 바뀌게 되어 서비스에 영향을 미칠 수 있다.

추후에는 Kafka가 제공하는 다른 인증에 대해서도 살펴보고자 한다.


관련 문서

반응형