Kafka KRaft Mode에서 SCRAM 인증 사용
- (방법 1) 신규 Kafka Cluster KRaft 인증 구성
- (방법 2) SCRAM 인증 추가 구성 방법
- 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 인증을 구성합니다.
- (Controller) server.properties 설정
- (Broker) server.properties 설정
- 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 자격 증명 업데이트인
UserScramCredentialsRecord
를kafka-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을 변경합니다. 해당 작업은 아래와 같은 순서로 작업합니다.
- kafka-config.sh를 사용한 SCRAM 계정 생성
- PLAINTEXT -> SASL_PLAINTEXT 변경
- 롤링 재 기동
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를 변경합니다.
- Broker Protocol 변경 PLAINTEXT -> SASL_PLAINTEXT
- 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.sh
및 kafka-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