Authorization (인가)
Kafka에서 ACL(Access Control Lists)을 사용하여 리소스에 대한 접근 권한을 관리합니다.
ACL 개요
기본 구조
┌─────────────────────────────────────────────────────────────────┐
│ ACL 구성 요소 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ACL = Principal + Permission + Operation + Resource │
│ │
│ 예: User:alice가 my-topic에 Read할 수 있다 │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ Principal │ │ Permission │ │ Operation │ │
│ │ User:alice │ │ Allow │ │ Read, Write, Create │ │
│ │ Group:dev │ │ Deny │ │ Delete, Alter, ... │ │
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Resource │ │
│ │ Topic, Group, Cluster, TransactionalId, DelegationToken │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
리소스 타입
리소스 설명 예시 Topic 토픽 my-topic, order.* Group Consumer Group my-consumer-group Cluster 클러스터 전체 kafka-cluster TransactionalId 트랜잭션 ID my-tx-id DelegationToken 위임 토큰 -
작업 (Operation)
작업 설명 대상 리소스 Read 읽기 Topic, Group Write 쓰기 Topic, TransactionalId Create 생성 Topic, Cluster Delete 삭제 Topic, Group Alter 수정 Topic, Cluster Describe 조회 Topic, Group, Cluster ClusterAction 클러스터 작업 Cluster DescribeConfigs 설정 조회 Topic, Cluster AlterConfigs 설정 수정 Topic, Cluster IdempotentWrite 멱등성 쓰기 Cluster All 모든 작업 모든 리소스
Authorizer 설정
Broker 설정
# server.properties
# Authorizer 활성화
authorizer.class.name = kafka.security.authorizer.AclAuthorizer
# Super User (모든 권한)
super.users = User:admin ;User:kafka
# 기본 거부 (ACL 없으면 거부)
allow.everyone.if.no.acl.found = false
KRaft 모드
# KRaft 모드 Authorizer
authorizer.class.name = org.apache.kafka.metadata.authorizer.StandardAuthorizer
ACL 관리
ACL 추가
# Producer 권한 부여
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:producer1 \
--operation Write \
--operation Describe \
--topic my-topic
# Consumer 권한 부여
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:consumer1 \
--operation Read \
--operation Describe \
--topic my-topic \
--group my-consumer-group
# 와일드카드 사용
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:admin \
--operation All \
--topic "*"
ACL 조회
# 모든 ACL 조회
kafka-acls.sh --bootstrap-server localhost:9092 --list
# 특정 리소스 ACL 조회
kafka-acls.sh --bootstrap-server localhost:9092 \
--list \
--topic my-topic
# 특정 Principal ACL 조회
kafka-acls.sh --bootstrap-server localhost:9092 \
--list \
--principal User:producer1
ACL 삭제
# 특정 ACL 삭제
kafka-acls.sh --bootstrap-server localhost:9092 \
--remove \
--allow-principal User:producer1 \
--operation Write \
--topic my-topic
# 모든 ACL 삭제 (주의!)
kafka-acls.sh --bootstrap-server localhost:9092 \
--remove \
--topic my-topic
일반적인 ACL 패턴
Producer ACL
# 기본 Producer
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:producer \
--operation Write \
--operation Describe \
--topic orders
# Idempotent Producer
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:producer \
--operation IdempotentWrite \
--cluster
# Transactional Producer
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:producer \
--operation Write \
--operation Describe \
--transactional-id my-tx-id
Consumer ACL
# Consumer Group 사용
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:consumer \
--operation Read \
--operation Describe \
--topic orders
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:consumer \
--operation Read \
--group order-processors
Admin ACL
# 토픽 관리
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:admin \
--operation Create \
--operation Delete \
--operation Alter \
--operation Describe \
--operation DescribeConfigs \
--operation AlterConfigs \
--topic "*"
# 클러스터 관리
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:admin \
--operation All \
--cluster
리소스 패턴
Literal vs Prefixed
# Literal (정확히 일치)
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:app \
--operation Read \
--topic orders \
--resource-pattern-type literal # 기본값
# Prefixed (접두사 일치)
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:app \
--operation Read \
--topic orders \
--resource-pattern-type prefixed
# orders로 시작하는 모든 토픽: orders, orders-v2, orders.events 등
와일드카드
# 모든 토픽에 대한 권한
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:superuser \
--operation All \
--topic "*"
Principal 형식
지원 형식
# User Principal (SASL)
--allow-principal User:alice
# Group Principal
--allow-principal Group:developers
# 여러 Principal
--allow-principal User:alice --allow-principal User:bob
와일드카드
# 모든 사용자
--allow-principal User: *
Deny ACL
사용
# 특정 사용자 거부
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--deny-principal User:blocked \
--operation All \
--topic sensitive-data
# 예외 허용
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:admin \
--operation All \
--topic sensitive-data
평가 순서
1. Deny ACL이 먼저 평가됨
2. Deny가 있으면 → 거부
3. Allow가 있으면 → 허용
4. 둘 다 없으면 → allow.everyone.if.no.acl.found에 따름
호스트 기반 제한
# 특정 IP에서만 허용
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--allow-principal User:app \
--allow-host 192.168.1.100 \
--operation Read \
--topic my-topic
# IP 범위 거부
kafka-acls.sh --bootstrap-server localhost:9092 \
--add \
--deny-principal User: * \
--deny-host 10.0.0.0 \
--operation All \
--topic "*"
모니터링
로그 확인
# 인가 로그 활성화 (log4j.properties)
log4j.logger.kafka.authorizer.logger = DEBUG
# 로그 확인
grep "authorizer" /var/log/kafka/kafka-authorizer.log
JMX 메트릭
kafka.security:type=SimpleAclAuthorizer,name=*
# ACL 수
aclCount
# 평균 인가 시간
authorizationTimeNs
Best Practices
1. 최소 권한 원칙
# 필요한 최소 권한만 부여
# ❌ All 권한 남발 금지
# ✓ 필요한 Operation만 지정
2. 그룹 기반 관리
# 개별 사용자 대신 그룹 사용
--allow-principal Group:producers
--allow-principal Group:consumers
3. Prefixed 패턴 활용
# 서비스별 접두사로 관리
# order-service: order-*
# payment-service: payment-*
4. Super User 제한
# 최소한의 Super User만 설정
super.users = User:admin
5. 정기 감사
# 주기적으로 ACL 검토
kafka-acls.sh --bootstrap-server localhost:9092 --list > acls-backup.txt
관련 문서
댓글 (0)