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.*
GroupConsumer Groupmy-consumer-group
Cluster클러스터 전체kafka-cluster
TransactionalId트랜잭션 IDmy-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

관련 문서