백엔드 데이터 인프라 113편 — Kafka Security Overview (3축 종합)

2026-05-17백엔드 데이터 인프라

백엔드 데이터 인프라 113편. Kafka Security 3축 종합 — Authentication (SSL/SASL)·Authorization (ACL)·Encryption (TLS) 의 역할 분담, 보안 protocol 4가지 (PLAINTEXT·SSL·SASL_PLAINTEXT·SASL_SSL), 운영 환경 권장 조합까지 풀어쓴 학습 노트.

📚 백엔드 데이터 인프라 · 113편 — Kafka Security Overview (3축 종합)

이 글은 백엔드 데이터 인프라 시리즈 130편 중 113편이에요. Part 5-7 Internals 까지 끝났다면, 이번 113편부터는 Part 5-8 — Kafka Security (4편). 첫 글은 3축 종합으로 Authentication(인증)·Authorization(권한)·Encryption(암호화) 세 영역을 한 번에 훑어요.

Security가 어렵게 느껴지는 이유

Kafka 보안은 세 영역이 묶여서 한꺼번에 돌아가고, 영역마다 옵션이 여러 개에다 서로 영향을 주고받아 헷갈리기 쉬워요.

첫째, 3축이 헷갈려요. "누구야"를 묻는 Authentication, "뭘 할 수 있나"를 묻는 Authorization, "데이터를 어떻게 지킬까"를 묻는 Encryption — 이 셋이 각자 따로 돌면서도 서로 보완 관계라 머릿속에서 자꾸 섞여요.

둘째, security.protocol 조합이 4가지예요. PLAINTEXT·SSL·SASL_PLAINTEXT·SASL_SSL — 이름만 보고 어느 쪽이 인증이고 어느 쪽이 암호화인지 바로 안 떠올라요.

셋째, SASL(Simple Authentication and Security Layer) 메커니즘이 5가지나 돼요. GSSAPI·PLAIN·SCRAM-SHA-256·SCRAM-SHA-512·OAUTHBEARER 중 언제 어느 걸 골라야 할지 결정이 어렵죠.

이 글에서 3축 종합 + protocol 4가지 + SASL 메커니즘에 권장 조합까지 한 번에 정리해요.

3축 — Authentication · Authorization · Encryption

누구야 (Identity)?      → Authentication
뭘 할 수 있나?          → Authorization
데이터 누출 방지?       → Encryption

Authentication (인증)

"이 client/broker 가 누구인가"를 확인하는 단계예요.

옵션:

  • SSL (client certificate)
  • SASLGSSAPI·PLAIN·SCRAM-SHA-256·SCRAM-SHA-512·OAUTHBEARER

Authorization (권한 부여)

인증을 통과한 client가 무엇을 할 수 있는지 정해요.

옵션:

  • ACL(Access Control List) — Kafka 내장
  • Custom Authorizer — 외부 시스템 통합

Encryption (암호화)

전송 중인 데이터를 누구도 들여다보지 못하게 막아요.

옵션:

  • SSL/TLS (전송 암호화)
  • Disk encryption (디스크 레벨, OS 또는 cloud)

Security Protocol — 4가지 조합

security.protocol 설정:

Protocol Authentication Encryption 자주 쓰는 자리
PLAINTEXT 없음 없음 학습·로컬
SSL client cert (mTLS) 옵션 TLS 인증서 기반
SASL_PLAINTEXT SASL 없음 같은 VPC, 인증만
SASL_SSL SASL TLS 운영 환경 표준

PLAINTEXT — 학습용만

security.protocol=PLAINTEXT

인증도 암호화도 없어요. 운영 환경에서는 절대 X.

SSL — 인증서 기반

security.protocol=SSL
ssl.keystore.location=/etc/kafka/kafka.keystore.jks
ssl.truststore.location=/etc/kafka/kafka.truststore.jks

서버 인증서로 broker가 진짜인지 확인해요. mTLS(mutual TLS, 양방향 인증) 를 켜면 client도 함께 인증하고요. 비밀번호는 안 써요.

SASL_PLAINTEXT — SASL 인증 + 평문 전송

security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-512

인증만 SASL로 하고 전송은 평문이에요. 같은 데이터센터나 VPC(Virtual Private Cloud, 가상 사설망) 안처럼 신뢰되는 구간에서 써요.

SASL_SSL — 운영 표준

security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-512
ssl.truststore.location=...

인증과 암호화를 한 번에 챙겨요. 운영 환경에서 권장.

SASL 메커니즘 5가지

SASL/PLAIN — 단순 username/password

sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
    username="alice" \
    password="password123";
  • 가장 단순한 방식
  • 평문으로 전송되니까 반드시 SSL 위에서 (SASL_SSL) 써야 해요
  • 비밀번호가 broker 측에 평문으로 저장되는 위험도 있고요

대부분 환경에서는 SCRAM 권장.

SASL/SCRAM-SHA-256 / SCRAM-SHA-512 — 권장

sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
    username="alice" \
    password="password123";
  • Challenge-response 방식이라 평문 비밀번호를 보내지 않아요
  • broker 측에는 salted hash(소금 친 해시) 만 저장되고요
  • 운영 환경 표준
  • SHA-512 권장 (SHA-256 보다 강력)

SASL/GSSAPI — Kerberos

sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka
  • Enterprise 환경에서 이미 깔려 있는 Kerberos(커버로스, 티켓 기반 인증 프로토콜) 인프라를 그대로 활용해요
  • 보안은 강하지만 설정이 복잡해요
  • 보통 대기업에 AD(Active Directory)/LDAP(Lightweight Directory Access Protocol) 가 깔린 환경에서 써요

SASL/OAUTHBEARER — OAuth 2.0

sasl.mechanism=OAUTHBEARER
sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
    oauth.token.endpoint.uri="https://auth.example.com/token";
  • OAuth 2.0 / OpenID Connect 와 통합
  • Confluent Cloud·Aiven·MSK 같은 cloud 환경의 표준
  • 기업 SSO(Single Sign-On, 통합 로그인) 와 붙이기 쉬워요

신규 cloud 환경에서는 OAUTHBEARER가 많이 보여요.

SASL/IAM (AWS MSK)

sasl.mechanism=AWS_MSK_IAM

AWS MSK 전용. IAM(Identity and Access Management) role 기반이에요.

선택 가이드

환경 권장
로컬 개발 PLAINTEXT
같은 VPC + 신뢰 환경 SASL_PLAINTEXT + SCRAM
운영 환경 표준 SASL_SSL + SCRAM-SHA-512
대기업 + Kerberos SASL_SSL + GSSAPI
Cloud + SSO SASL_SSL + OAUTHBEARER
AWS MSK SASL_SSL + AWS_MSK_IAM

ACL — Authorization

ACL은 Access Control List의 줄임말이고, Principal × Operation × Resource 라는 3 tuple 로 구성돼요.

allow User:alice to Read Topic:orders
allow User:alice to Write Topic:orders
deny User:bob from Read Topic:secrets

Resource 종류:

  • Topic (Read·Write·Create·Delete·Alter·Describe)
  • Group (consumer group)
  • Cluster (Create·Alter·DescribeConfigs)
  • TransactionalId
  • DelegationToken

자세한 내용은 116편에서.

Encryption — TLS

운영 환경에서는 반드시 TLS. 인터넷이나 다른 VPC를 거치는 통신을 평문으로 두면 도청 위험이 생겨요.

설정:

ssl.keystore.location=/etc/kafka/kafka.keystore.jks
ssl.keystore.password=keystore-pass
ssl.key.password=key-pass
ssl.truststore.location=/etc/kafka/kafka.truststore.jks
ssl.truststore.password=trust-pass
ssl.protocol=TLSv1.3
ssl.enabled.protocols=TLSv1.3,TLSv1.2

자세한 내용은 114편에서.

Inter-Broker Security

Broker 간 통신에도 보안을 걸어요:

inter.broker.listener.name=SASL_SSL
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512

운영 환경에서는 inter-broker 통신도 반드시 보호해야 해요. 안 하면 내부에서 오가는 데이터가 그대로 도청될 수 있어요.

ZooKeeper Security (옛 모드)

ZooKeeper 모드 (Kafka 4.0 deprecated) 에서는 ZooKeeper 쪽에도 보안 설정이 필요해요:

zookeeper.set.acl=true

KRaft(Kafka Raft, ZooKeeper를 없앤 메타데이터 모드) 모드에서는 ZK 의존이 없으니 이 영역이 통째로 사라져요. 그래서 신규 환경은 KRaft 권장.

모니터링 — 보안 메트릭

JMX(Java Management Extensions, 자바 모니터링 표준):

  • connections-creation-rate — 새 connection 빈도
  • successful-authentication-rate · failed-authentication-rate
  • authenticate-failed-time-ms — 인증 시간

failed-authentication-rate 가 높다면 공격 시도이거나 설정 오류로 봐야 해요.

운영 환경 권장 조합

# Broker 설정
listeners=SASL_SSL://0.0.0.0:9093
advertised.listeners=SASL_SSL://kafka-1.example.com:9093

security.inter.broker.protocol=SASL_SSL
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
sasl.enabled.mechanisms=SCRAM-SHA-512

# TLS
ssl.keystore.location=/etc/kafka/ssl/keystore.jks
ssl.keystore.password=...
ssl.key.password=...
ssl.truststore.location=/etc/kafka/ssl/truststore.jks
ssl.truststore.password=...
ssl.client.auth=required
ssl.enabled.protocols=TLSv1.3,TLSv1.2

# Authorization
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
super.users=User:admin
allow.everyone.if.no.acl.found=false
# Client 설정
security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
    username="app-user" \
    password="...";

ssl.truststore.location=/etc/kafka/ssl/truststore.jks
ssl.truststore.password=...
ssl.endpoint.identification.algorithm=https

한계·실무 함정

1. PLAINTEXT 운영 강행

데이터도 자격증명도 모두 평문 노출. 절대 X.

2. SSL 의 zero-copy 손실

85편 efficiency 에서 봤듯이, SSL은 user space CPU를 거치니까 zero-copy 효과가 없어져요. 그만큼 처리량이 떨어지고요.

3. SCRAM password 평문 broker config

ZooKeeper 모드 환경에서 broker config 에 password 를 평문으로 두면 디스크에 그대로 노출돼요. KRaft 환경 쪽이 더 안전한 이유 중 하나죠.

4. super.users 권한 남발

super.users=User:admin,User:dev1,User:dev2 처럼 모두에게 admin을 주면 ACL 자체가 의미를 잃어요.

5. allow.everyone.if.no.acl.found=true

기본값은 false. 만약 true 면 ACL이 없는 resource는 모두 허용(insecure default) 되니까, 항상 false 로 두는 걸 권장해요.

6. 인증서 만료

인증서가 만료되면 모든 client 연결이 거부되면서 운영 사고로 번져요. 모니터링과 자동 갱신이 필수.

시험 직전 한 번 더 — Kafka Security Overview 함정 압축 노트

  • 3축 = Authentication (누구야) · Authorization (뭘 해도 되나) · Encryption (전송 보호)
  • Authentication 옵션 = SSL (cert) · SASL (5가지 메커니즘)
  • Authorization 옵션 = ACL (내장) · Custom Authorizer
  • Encryption 옵션 = SSL/TLS (전송) · Disk encryption (디스크)
  • security.protocol 4가지 = PLAINTEXT · SSL · SASL_PLAINTEXT · SASL_SSL (운영 표준)
  • PLAINTEXT = 학습만, 운영 절대 X
  • SASL_PLAINTEXT = 같은 VPC 신뢰 환경
  • 운영 표준 = SASL_SSL + SCRAM-SHA-512
  • SASL 메커니즘 5가지 — PLAIN · SCRAM-SHA-256/512 (권장) · GSSAPI (Kerberos) · OAUTHBEARER (OAuth) · AWS_MSK_IAM
  • SCRAM = challenge-response, 평문 비밀번호 안 보냄
  • GSSAPI = 대기업 + AD/Kerberos
  • OAUTHBEARER = cloud + SSO (Confluent Cloud·Aiven 등)
  • ACL = Principal × Operation × Resource (Topic·Group·Cluster·TransactionalId)
  • 자세한 내용 = 116편
  • TLS = ssl.keystore.*·ssl.truststore.*·ssl.protocol
  • TLSv1.3 + TLSv1.2 권장
  • Inter-Broker = security.inter.broker.protocol=SASL_SSL 운영 필수
  • ZooKeeper 보안 = 옛 모드만 (KRaft 는 사라짐)
  • 모니터링 = successful/failed-authentication-rate
  • 운영 권장 = SASL_SSL + SCRAM-SHA-512 + TLSv1.3 + ACL + StandardAuthorizer + super.users 최소
  • 함정 — PLAINTEXT 운영
  • 함정 — SSL zero-copy 손실 (CPU ↑)
  • 함정 — SCRAM password 평문 config (KRaft 권장)
  • 함정 — super.users 남발
  • 함정 — allow.everyone.if.no.acl.found=true (반드시 false)
  • 함정 — 인증서 만료 → 모든 연결 거부

공식 문서: Kafka Security Overview 에서 자세한 사양을 확인할 수 있어요.

시리즈 다른 편 (앞뒤 글 모음)

이전 글:

다음 글:

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

답글 남기기

error: Content is protected !!