Kafka KRaft Mode에서 SCRAM 인증 사용

Sanghyun An
SPITHA Blog
Published in
13 min readJul 7, 2023
  1. (방법 1) 신규 Kafka Cluster KRaft 인증 구성
  2. (방법 2) SCRAM 인증 추가 구성 방법
  3. kafka-metadata-shell.sh

목표

Kafka 3.5.0에 KRaft SCRAM 인증 구성이 추가 되었습니다! 이 글의 목표는 SCRAM 인증을 사용한 Kafka 클러스터를 구성하는 것입니다.

Kafka SCRAM ?

Kafka SCRAM은 Apache Kafka에서 사용되는 인증 메커니즘 중 하나 입니다. SCRAM은 사용자 이름과 비밀번호를 기반으로 클라이언트와 브로커 간의 인증을 처리합니다. 이를 통해 Kafka 클러스터에 접근하는 사용자의 신원을 검증하고 보안을 강화할 수 있습니다.

테스트 환경

  • Controller 1대 (v3.5.0)
  • Broker 3대 (v3.5.0)

( 방법 1 ) 신규 Kafka Cluster KRaft 인증 구성

Kafka KRaft 모드를 신규로 구성하는 경우 다음과 같은 방법으로 SCRAM 인증을 구성합니다.

  1. (Controller) server.properties 설정
  2. (Broker) server.properties 설정
  3. kafka-storage.sh를 사용하여 SCRAM 초기 계정 설정

(Controller) server.properties

KRaft 모드를 사용하기 위해 Controller의 server.properties를 구성합니다. 아래는 Controller를 구성에 필요한 옵션입니다.

Controller의 프로토콜은 PLAINTEXT로 구성 되었습니다.

# Controller (PLAINTEXT)

# node 번호
node.id=1000

# controller role
process.roles=controller

# CONTROLLER에 대한 listener.security.protocol.map을 정의 합니다.
listener.security.protocol.map=CONTROLLER:PLAINTEXT,SASL_PLAINTEXT:SASL_PLAINTEXT

# CONTROLLER에 대한 listener를 설정합니다.
listeners=CONTROLLER://MY_CONTROLLER_IP:MY_CONTROLLER_PORT

# CONTROLLER의 quorum.voters 및 listener.names 정보를 입력합니다.
controller.quorum.voters=1000@MY_CONTROLLER_IP:MY_CONTROLLER_PORT
controller.listener.names=CONTROLLER


...

(Broker) server.properties

다음으로 Broker에 대한 설정입니다. Broker의 경우 protocol을 SASL_PLAINTEXT로 mechanism을 SCRAM-SHA-512 로 지정합니다.

Controller의 프로토콜은 PLAINTEXT이므로 listener.security.protocol.map에 CONTROLLER:PLAINTEXT 으로 등록합니다.

# Broker 0 (SASL_PLAINTEXT SCRAM-SHA-512)

# node 번호
node.id=0

# broker role
process.roles=broker

# broker 및 controller에 해당하는 protocol.map을 설정합니다.
listener.security.protocol.map=SASL_PLAINTEXT:SASL_PLAINTEXT,CONTROLLER:PLAINTEXT

# SCRAM 사용을 위한 SASL_PLAINTEXT을 구성합니다.
listeners=SASL_PLAINTEXT://MY_BROKER_IP:MY_BROKER_PORT

# CONTROLLER 관련 설정을 합니다.
controller.quorum.voters=1000@MY_CONTROLLER_IP:MY_CONTROLLER_PORT
controller.listener.names=CONTROLLER

# Broker SCRAM 인증을 구성합니다.
listener.name.sasl_plaintext.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
username="admin" \
password="admin-secret" ;

# SCRAM 관련 mechanism을 활성화 하고 Broker간의 프로토콜을 SASL_PLAINTEXT으로 지정합니다.
sasl.enabled.mechanisms=SCRAM-SHA-512
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
security.inter.broker.protocol=SASL_PLAINTEXT

...

kafka-storage.sh를 사용하여 SCRAM 초기 계정 설정

kafka-storage.sh 스크립트를 사용하여 모든 Broker, Controller log.dirs에 지정된 디렉토리 및 파일을 생성합니다.

kafka-storage.sh?

Broker와 Controller의 저장 공간을 초기화하는 데 사용되는 스크립트 입니다. 생성되는 파일 중에 하나는 클러스터의 bootstrap 프로세스에 필요한ApiMessageAndVersion레코드를 포함하는 bootstrap.checkpoint입니다.

또한 저장소를 포맷할 때마다 필요한 SCRAM 자격 증명 업데이트인 UserScramCredentialsRecordkafka-storage.sh로 추가할 수 있습니다.

SCRAM 인증을 구성하기 위해 --add-scram 옵션으로 초기 계정을 입력합니다. 해당 옵션은 Kafka 버전 3.5.0 이상에서 사용이 가능하며 __cluster_metadata 토픽에 직접 ApiMessageAndVersion레코드를 추가할 수 있습니다.

./kafka-storage.sh format --config ../config/server.properties \
--cluster-id 'auZaogopTl_UOMJXTAFpqw' \
--add-scram 'SCRAM-SHA-512=[name=admin,password=admin-secret]'

테스트

인증이 성공적으로 구성 되었다면 인증 테스트를 진행합니다. Client 설정을 아래와 같이 구성하고 해당 설정을 적용하여 Topic생성 및 삭제 테스트를 진행합니다.

# client.properties
sasl.mechanism=SCRAM-SHA-512
security.protocol=SASL_PLAINTEXT
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
username="admin" \
password="admin-secret";
# 토픽 생성
./kafka-topics.sh --bootstrap-server MY_BROKER_IP:MY_BROKER_PORT --command-config client.properties --create --topic test
Created topic test.

# 토픽 리스트 출력
./kafka-topics.sh --bootstrap-server MY_BROKER_IP:MY_BROKER_PORT --command-config client.properties --list
test

# 토픽 삭제
./kafka-topics.sh --bootstrap-server MY_BROKER_IP:MY_BROKER_PORT --command-config client.properties --delete --topic test

( 방법 2 ) SCRAM 인증 추가 구성 방법

기존 KRaft에서 Kafka를 PLAINTEXT로 사용 중 SASL_PLAINTEXT로 Protocl을 변경하는 방법입니다. PLAINTEXT Protocol에 SCRAM 계정을 추가한 후 Protocol을 변경합니다. 해당 작업은 아래와 같은 순서로 작업합니다.

  1. kafka-config.sh를 사용한 SCRAM 계정 생성
  2. PLAINTEXT -> SASL_PLAINTEXT 변경
  3. 롤링 재 기동

kafka-config.sh를 사용한 SCRAM 계정 생성

kafka-config.sh를 사용하여 계정 및 패스워드를 등록합니다. 아래는 계정admin, 패스워드 admin-secret, 역할 admin으로 SCRAM-SHA-512 메커니즘에 등록하는 예제입니다.

./kafka-configs.sh --bootstrap-server MY_BROKER_IP:MY_BROKER_PORT \
--alter --add-config 'SCRAM-SHA-512=[password=admin-secret]' \
--entity-type users --entity-name admin

PLAINTEXT -> SASL_PLAINTEXT 변경

성공적으로 계정이 업데이트 되었다면 다음으로 Broker의 server.properties를 변경합니다.

  1. Broker Protocol 변경 PLAINTEXT -> SASL_PLAINTEXT
  2. Mechanism 활성화 및 Broker 간의 Protocol 추가
# Broker 0 (PLAINTEXT -> SASL_PLAINTEXT SCRAM-SHA-512)

listener.security.protocol.map=CONTROLLER:PLAINTEXT,SASL_PLAINTEXT:SASL_PLAINTEXT
listeners=CONTROLLER://:9091,SASL_PLAINTEXT://:9092


# Security

# SCRAM-SHA-512를 활성화
sasl.enabled.mechanisms=SCRAM-SHA-512

# Broker 간의 메커니즘 프로토콜을 SCRAM-SHA-512으로 활성화
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512

# Broker 간의 보안 프로토콜을 SASL_PLAINTEXT로 설정
security.inter.broker.protocol=SASL_PLAINTEXT

listener.name.sasl_plaintext.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
username="admin" \
password="admin-secret";

...

재 기동

위와 같이 모든 Broker에 대해 설정이 구성 되었다면 롤링으로 재 기동 합니다.

테스트

롤링으로 Broker 재 기동이 완료 되었다면 인증 테스트를 진행합니다. Client 설정을 아래와 같이 구성하고 해당 설정을 적용하여 Topic생성 및 삭제 테스트를 진행합니다.

# client.properties
sasl.mechanism=SCRAM-SHA-512
security.protocol=SASL_PLAINTEXT
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
username="admin" \
password="admin-secret";
# 토픽 생성
./kafka-topics.sh --bootstrap-server MY_BROKER_IP:MY_BROKER_PORT --command-config client.properties --create --topic test
Created topic test.

# 토픽 리스트 출력
./kafka-topics.sh --bootstrap-server MY_BROKER_IP:MY_BROKER_PORT --command-config client.properties --list
test

# 토픽 삭제
./kafka-topics.sh --bootstrap-server MY_BROKER_IP:MY_BROKER_PORT --command-config client.properties --delete --topic test

kafka-metadata-shell.sh

kafka-config.shkafka-storage.sh 를 사용하여 SCRAM 계정을 추가하면 생성된 데이터를 어떻게 확인할 수 있을까요? kafka-metadata-shell.sh를 사용하여 확인이 가능합니다. kafka-metadata-shell.sh— snapshot 옵션을 사용하여 __cluster_metadata Topic의 로그 파일을 지정하여 사용할 수 있습니다.

kafka-metadata-shell.sh ?

Kafka 클러스터의 메타데이터를 쿼리하고 관리하는 데 사용되는 쉘 스크립트입니다. Kafka 메타데이터 토픽과 연결하여 클러스터의 상태와 구성 정보를 확인하고 변경할 수 있습니다.

__cluster_metadata ?

__cluster_metadata Topic에는 각 Broker와 Controller의 메타데이터가 포함되어 있습니다. Broker ID, 호스트 및 포트 정보, Partition 할당 정보, Topic 및 Partition Reader정보 등이 존재 합니다. 또한 클러스터의 구성 설정, ACL정보 등도 이 토픽에 저장됩니다.

./kafka-metadata-shell.sh --snapshot /data/kafka-logs/__cluster_metadata-0/00000000000000000000.log 

Loading...
Starting...
[ Kafka Metadata Shell ]
>> cat /local/version
3.5.0
>> ls /image/scram/SCRAM-SHA-512 #Scram 계정확인
admin
>> ls /image/topics/byName/
test
>>

참고

[KAFKA-14765] https://issues.apache.org/jira/browse/KAFKA-14765

[KIP-900] https://cwiki.apache.org/confluence/display/KAFKA/KIP-900%3A+KRaft+kafka-storage.sh+API+additions+to+support+SCRAM+for+Kafka+Brokers

--

--