최근 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가 제공하는 다른 인증에 대해서도 살펴보고자 한다.
관련 문서
반응형
'Big Data > Kafka' 카테고리의 다른 글
[Kafka] Configurable SASL callback handler (0) | 2019.04.18 |
---|---|
[Kafka] 파티션 이동 (0) | 2019.04.12 |
[Kafka] consumer group offset change by python. (0) | 2018.12.31 |
[Kafka] consumer LAG 수집 및 elasticsearch 적재 (0) | 2018.12.28 |
[Kafka] Topic의 Replica 분배 로직 분석 (0) | 2018.11.22 |