백엔드 데이터 인프라 113편. Kafka Security 3축 종합 — Authentication (SSL/SASL)·Authorization (ACL)·Encryption (TLS) 의 역할 분담, 보안 protocol 4가지 (PLAINTEXT·SSL·SASL_PLAINTEXT·SASL_SSL), 운영 환경 권장 조합까지 풀어쓴 학습 노트.
이 글은 백엔드 데이터 인프라 시리즈 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)
- SASL —
GSSAPI·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-rateauthenticate-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.protocol4가지 = 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 에서 자세한 사양을 확인할 수 있어요.
시리즈 다른 편 (앞뒤 글 모음)
이전 글:
- 108편 — Kafka Log 파일 구조 (Segment · Index · Offset)
- 109편 — Kafka Network Layer (NIO · Selector · Thread Pool)
- 110편 — Kafka Message Format (Record Batch v2 · 바이트 구조)
- 111편 — Kafka Consumer Rebalance Protocol (KIP-848 새 모델)
- 112편 — Kafka Transaction Protocol (EOS 내부 메커니즘)
다음 글: