본문 바로가기
BIG-DATA/KAFKA

[KAFKA] 무작정 시작하기 (5) - SASL 인증 설정

by 허도치 2019. 11. 22.

2019/11/19 - [BIG-DATA/KAFKA] - [KAFKA] 무작정 시작하기 (1) - 설치 & 실행

2019/11/20 - [BIG-DATA/KAFKA] - [KAFKA] 무작정 시작하기 (2) - Zookeeper 설정

2019/11/20 - [BIG-DATA/KAFKA] - [KAFKA] 무작정 시작하기 (3) - Kafka 설정

2019/11/21 - [BIG-DATA/KAFKA] - [KAFKA] 무작정 시작하기 (4) - Topic & Producer & Consumer 실행

 

 

  지난 포스트에서 Kafka 서버를 실행하고 접속까지 해보았다. 이번 시간에는 서버에 접속할 때 인증된 사용자만 접근할 수 있도록 보안을 강화하여 보겠다. 여러 Configuration 파일들을 생성해야 하므로 포스트가 길어질 수 있으며, 최대한 보기 좋게 정리하도록 노력해보겠다.

 

 

1. Zookeeper Server 설정

   1-1. zookeeper.properties 옵션 추가

1
2
3
4
5
6
7
8
# 모든 클라이언트들이 SASL 인증을 하도록 설정.
zookeeper.sasl.client=true
 
# 인증되지않은 사용자의 연결을 유지하지만, 조작은 할 수 없음.
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
 
# 모든 Connection이 SASL 인증방식을 사용하도록 설정.
requireClientAuthScheme=sasl
cs

 

   1-2. zookeeper_jaas.conf 작성

1
2
3
4
5
6
Server {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="1234"
    user_admin="1234";
};
cs

         - 3~4 ln: Super 유저의 설정

         - 5 ln: 일반 유저의 설정, user_[ 유저명 ]="[ 패스워드 ]"

 

   1-3. zookeeper_server_start.bat 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rem zookeeper_server_start.bat
@echo off
 
rem 현재 디렉토리 설정
pushd %~dp0
set KAFKA_HOME=%cd%
popd
 
rem jdk.8.0_131 이상 버전에서 지원
set JAVA_HOME=%KAFKA_HOME%\java\jdk-11.0.5
set KAFKA_OPTS=
set KAFKA_OPTS=%KAFKA_OPTS% -Dkafka.logs.dir=%KAFKA_HOME%\logs
set KAFKA_OPTS=%KAFKA_OPTS% -Djava.security.auth.login.config=%KAFKA_HOME%\auth\zookeeper_jaas.conf
 
%KAFKA_HOME%\bin\windows\zookeeper-server-start.bat %KAFKA_HOME%\config\zookeeper.properties
cs

         - 13 ln: -Djava.security.auth.login.config에 위에서 작성한 Configuration 경로를 작성

 

   1-4. Zookeeper Server 실행

         - 로그가 정신없이 생기는데 잘 살펴보면 아래와 같은 로그를 확인할 수 있음.

 

2. Kafka Server 설정

   2-1. server.properties 옵션 추가

1
2
3
4
5
6
7
8
9
10
11
# Kafka Server의 Super 유저 이름.
super.users=User:admin
 
# SASL 인증 방식을 처리하기 위한 설정.
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
 
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
 
allow.everyone.if.no.acl.found=true
cs

 

   2-2. server.properties 옵션 수정

1
2
3
4
5
# Broker가 사용하는 호스트와 포트를 지정, 형식은 PLAINTEXT://your.host.name:port 을 사용
listeners=SASL_PLAINTEXT://:9092
 
# Producer와 Consumer가 접근할 호스트와 포트를 지정, 기본값은 listeners를 사용.
advertised.listeners=SASL_PLAINTEXT://localhost:9092
cs

         - 2 ln: SASL_PLAINTEXT://:9092으로 변경, 9092포트로 접속하면 SASL 인증을 요청함.

         - 3 ln: SASL_PLAINTEXT://localhost:9092로 변경.

 

   2-3. kafka_jaas.conf 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
   password="dochi"
   user_admin="dochi"
    user_producer="dochi"
    user_dochi="dochi";
};
Client {
    org.apache.kafka.common.security.plain.PlainLoginModule required
   username="admin"
   password="1234";
};
cs

         - 1~8 ln: zookeeper_jaas.conf 와 똑같이 Super 유저와 일반 유저 설정.

         - 9~13 ln: Zookeeper Server에 접속할 유저 정보.

 

   2-4. kafka_server_start.bat 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rem kafka_server_start.bat
@echo off
 
rem 현재 디렉토리 설정
pushd %~dp0
set KAFKA_HOME=%cd%
popd
 
rem jdk.8.0_131 이상 버전에서 지원
set JAVA_HOME=%KAFKA_HOME%\java\jdk-11.0.5
set KAFKA_OPTS=
set KAFKA_OPTS=%KAFKA_OPTS% -Dkafka.logs.dir=%KAFKA_HOME%\logs
set KAFKA_OPTS=%KAFKA_OPTS% -Djava.security.auth.login.config=%KAFKA_HOME%\auth\kafka_jaas.conf
 
%KAFKA_HOME%\bin\windows\kafka-server-start.bat %KAFKA_HOME%\config\server.properties
cs

         - 13 ln: -Djava.security.auth.login.config에 위에서 작성한 Configuration 경로를 작성

 

   2-5. Kafka Server 실행

         - 정상적으로 접속이 된다면 ZooKeeperClient가 Connected 된 후 loadding이 계속됨.

         - 유저 정보가 틀렸을 경우 이후 계속 시도하다가 timeout이 발생하면서 종료됨.

 

 

3. Producer Client 설정

   3-1. producer_jaas.conf 작성

1
2
3
4
5
6
7
bootstrap.servers=SASL_PLAINTEXT://localhost:9092
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
 
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
  username="producer" \
  password="dochi";
cs

         - 1~3 ln: Client가 접속할 서버의 인증 방식과 주소 설정.

         - 5~7 ln: Client의 유저 정보, kafka_jaas.conf 에 등록된 유저 정보.

 

   3-2. producer.bat 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
 
rem 현재 디렉토리 설정
pushd %~dp0
set KAFKA_HOME=%cd%
popd
 
rem jdk.8.0_131 이상 버전에서 지원
set JAVA_HOME=%KAFKA_HOME%\java\jdk-11.0.5
set PRODUCER_CONF=%KAFKA_HOME%\auth\producer_jaas.conf
 
%KAFKA_HOME%/bin/windows/kafka-console-producer.bat --broker-list "localhost:9092" --topic "local-topic" --producer.config=%PRODUCER_CONF%
 
cs

         - 10 ln: Configuration 파일 위치 지정.

 

 

4. Consumer Client 설정

   4-1. consumer_jaas.conf 작성

1
2
3
4
5
6
7
8
9
10
client.id=dochi
group.id=local-group
 
bootstrap.servers=SASL_PLAINTEXT://localhost:9092
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
 
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
  username=dochi \
  password=dochi;
cs

         - 1 ln: client의 이름.

         - 2 ln: client의 Group명.

         - 4~6 ln: Client가 접속할 서버의 인증 방식과 주소 설정.

         - 8~10 ln: Client의 유저 정보, kafka_jaas.conf 에 등록된 유저 정보.

         - Client 정보는 producer와 유저 정보만 다르게 설정.

  

   4-2. consumer.bat 작성

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
 
rem 현재 디렉토리 설정
pushd %~dp0
set KAFKA_HOME=%cd%
popd
 
rem jdk.8.0_131 이상 버전에서 지원
set JAVA_HOME=%KAFKA_HOME%\java\jdk-11.0.5
set CONSUMER_CONF=%KAFKA_HOME%\auth\consumer_admin_jaas.conf
 
%KAFKA_HOME%/bin/windows/kafka-console-consumer.bat --bootstrap-server "localhost:9092" --topic "local-topic" --group "local-group" --consumer.config=%CONSUMER_CONF%
cs

         - 10 ln: Configuration 파일 위치 지정.

 

 

5. Client 권한 부여

   5-1. Producer 권한 부여 스크립트 실행

1
2
rem Producer 생성
%KAFKA_HOME%/bin/windows/kafka-acls.bat --add --producer --authorizer-properties "zookeeper.connect=localhost:2181" --allow-principal User:producer --topic "local-topic"
cs

         - [ --producer ]는 유저가 Producer 임을 명시하며 이에 대한 권한을 쉽게 부여할 수 있음.

         - [ --allow-principal User:유저명 ]는 권한을 부여할 대상을 지정

         - [ --topic ]은 메시지를 적재할 대상.

 

   5-2. Producer 권한 확인

1
2
rem 권한 확인
%KAFKA_HOME%/bin/windows/kafka-acls.bat --list --authorizer-properties "zookeeper.connect=localhost:2181" --topic "local-topic"
cs

         - Create, Write, Describe 권한이 부여됨.

 

   5-3. Consumer 권한 부여 스크립트 실행

1
2
rem Consumer 생성
%KAFKA_HOME%/bin/windows/kafka-acls.bat --add --consumer --authorizer-properties "zookeeper.connect=localhost:2181" --allow-principal User:dochi --topic "local-topic" --group "local-group"
cs

         - [ --consumer ]는 유저가 Consumer 임을 명시하며 이에 대한 권한을 쉽게 부여할 수 있음.

         - [ --allow-principal User:유저명 ]는 권한을 부여할 대상을 지정.

         - [ --topic ]은 메시지를 받아올 topic을 지정하고, [ --group ]으로 해당 그룹별로 접근하도록 지정.

 

   5-4. Consumer 권한 확인

1
2
rem 권한 확인
%KAFKA_HOME%/bin/windows/kafka-acls.bat --list --authorizer-properties "zookeeper.connect=localhost:2181" --topic "local-topic"
cs

         - Read, Describe 권한이 부여됨.

 

   5-5. 그 외 명령어

1
2
3
4
5
6
7
8
rem --producer를 대신하는 명령어
%KAFKA_HOME%/bin/windows/kafka-acls.bat --add --authorizer-properties "zookeeper.connect=localhost:2181" --allow-principal User:p1 --allow-host 127.0.0.1 --operation Create --operation Write --operation Describe --topic "local-topic"
 
rem --consumer를 대신하는 명령어
%KAFKA_HOME%/bin/windows/kafka-acls.bat --add --authorizer-properties "zookeeper.connect=localhost:2181" --allow-principal User:c1 --allow-host 127.0.0.1 --operation Read --operation Describe --topic "local-topic" --group "local-group"
 
rem 권한 삭제
%KAFKA_HOME%/bin/windows/kafka-acls.bat --remove --authorizer-properties "zookeeper.connect=localhost:2181" --allow-principal User:p1 --allow-host 127.0.0.1 --operation Create --operation Write --operation Describe --topic "local-topic"
cs

         - 권한부여에 대한 더 많은 정보를 원한다면 역시 공식 문서를 참조.

https://docs.confluent.io/4.0.0/kafka/authorization.html

 

Authorization and ACLs — Confluent Platform

Version 4.0.0 Docs Operations » Security » Authorization and ACLs View page source Authorization and ACLs Table of Contents Kafka ships with a pluggable Authorizer and an out-of-box authorizer implementation that uses ZooKeeper to store all the ACLs. It is

docs.confluent.io

 

6. Client 접속 확인.

    6-1. Zookeeper와 Kafka Server를 실행.

    6-2. producer.bat 실행.

          - producer는 바로 접속되는 것처럼 보이는데 테스트 메시지를 보내봐야지 정확하게 알 수 있음.

          - 정상적으로 접속이 되었다면 프롬프트를 계속 입력할 수 있는 상태가 유지됨.

          - 인증 오류가 발생하면 아래와 같이 '{local-topic=TOPIC_AUTHORIZTION_FAILED}'가 나타남.

producer에 대한 권한이 유효하지 않은 상태.

          - 이 외에 '{local-topic=UNKNOWN_TOPIC_OR_PARITION }'이라는 오류가 발생해서 애를 먹었는데, data 폴더를 삭제하고 처음부터 다시 작업하니까 해결되었음. (정확한 원인을 파악하고 해결해야 하는데 갑자기 해결되버려서 난감.)

 

   6-3. consumer.bat 실행

         - 정상적으로 접속되면 메시지를 받기위해 대기상태가 됨.

         - 오류는 producer와 같음.

 

   6-4. 메시지 pub / sub 테스트.

         - producer에서 consumer로 아무  메시지나 전달해보자.

 

 

 

  이상으로 Kafka Server에 SASL인증을 추가하여 보안을 강화하여 보았다. SASL인증은 단순히 로그인과 같은 개념으로 생각하면 쉽다. SSL로 인증 방식을 추가할 수도 있는데 이는 로그인과 더불어 인증서도 가지고 있어야 Kafka Server에 접속할 수 있다. 이 방식은 인증서를 생성하고 몇가지 옵션들을 추가하면 가능하다. SSL인증은 나중에 다루어 보도록하겠다.

  다음 포스트에서는 Filebeat로 Log파일을 읽어서 Topic에 적재하고 Consumer에서 확인해보는 프로세스를 구현해보겠다.

댓글