Kafka 클러스터에 엑세스 보안이 필요한 이유
Kafka는 단순 메시지 큐가 아니라 실제 운영 환경의 모든 주요 데이터 흐름이 지나가는 곳 입니다.
예시를 들자면,
- 사용자 로그인 이벤트
- 결제 데이터
- 주문 상태 정보
- 로그/모니터링 데이터
- 내부 서비스 간 API 결과
그런데, Kafka 클러스터 접근에 아무런 조지가 없이 열려있다면 회사의 실시간 비즈니스 데이터에 쉽게 접근할 수 있게됩니다.
이렇게 되면 누구나 Producer/Consumer 가 되어버리면 데이터가 조작이 가능해져 서비스가 위험해질 수 있습니다.
그래서 이번엔 Strimzi Kafka에서 mTLS 인증을 사용해보는 방법에 대해 알아보겠습니다.
mTLS(mutual TLS) 란?
mTLS는 서버와 클라이언트가 서로 인증서를 통해 상대의 신원을 확인하는 보안 통신 방식 입니다.
일반적인 TLS(HTTPS)는:
- 서버만 인증서를 제시하고, 클라이언트는 서버를 신뢰하는 방식 (단방향 인증)
그러나 mTLS는 양방향 인증이 이루어집니다. 즉,
- 서버도 클라이언트의 인증서를 검사
- 클라이언트도 서버의 인증서를 검사
Strimzi Kafka에서 mTLS 인증 사용하는 방법
먼저 Strimzi Kafka를 설치하면, 설치한 네임스페이스에서 아래 명령어로 secret을 확인해보면,
cluster-ca-cert 가 생성된 것을 확인할 수 있습니다.
k get secret
NAME TYPE DATA AGE
<Strimzi Kafka 생성할때 정의한 이름>-cluster-ca-cert Opaque 1 3h10m해당 secret 안에 적힌 ca.crt 값은 Client 측에서 사용할 ca.crt 입니다.
그리고 이제 KafkaUser 를 아래 YAML 파일을 통해 생성해줍니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: test # 원하는 이름으로 설정
namespace: test-namespace # Strimzi Kafka가 설치된 네임스페이스
labels:
strimzi.io/cluster: <Strimzi Kafka 생성할때 정의한 이름>
spec:
authentication:
type: tls위 YAML 파일을 적용하면,
test-namespace 에 test 라는 이름의 secret이 생성이 됩니다.
그리고 해당 secret의 내용을 살펴보면, 아래 이미지와 같이 생성이 됩니다.

여기서 조금 헷갈릴 수 있는데, KafkaUser로 생성된 시크릿의
ca.crt는 Client CA 로서,
client 인증서(user.crt/user.key)를 sign한 CA 입니다.
즉, 해당 CA는 Kafka 브로커가 클라이언트 인증서(user.crt/user.key)를 검증할 때 사용하는 CA 입니다.
이제 mTLS 설정을 하기 위해 필요한 인증서들은 모두 준비를 했으니 실제로 연결을 해보도록 하겠습니다.
먼저 Strimzi Kafka 클러스터의 listeners 설정에서 아래와 같이 수정 해줍니다.
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
....
listeners:
- name: plain
port: 9092
type: internal
tls: false
- name: tls
port: 9093
type: internal
tls: true # tls 설정 true
authentication:
type: tls # mTLS 인증을 위해 true그리고 연결할 Client 쪽 코드에서 아래와 같이 추가를 해주면 됩니다.
- node.js 예시
const Kafka = require('node-rdkafka');
console.log(Kafka.features); // this should print 'ssl', among other things
const producer = new Kafka.Producer({
'metadata.broker.list': KAFKA Broker 호스트:SSL_PORT,
'security.protocol': 'ssl',
'ssl.key.location': '<KafkaUser로 생성한 Secret의 user.key 파일>',
'ssl.certificate.location': '<KafkaUser로 생성한 Secret의 user.crt 파일>',
'ssl.ca.location': '<Strimzi Kafka 클러스터 생성할 때 생성된 Cluster-ca-cert 시크릿의 ca.crt 파일>',
'dr_cb': true
});
producer.connect();
producer.on('ready', () => {
// produce the messages and disconnect
});이렇게 하면 Strimzi Kafka <-> Client 연결이 정상적으로 됩니다.
감사합니다.
'Kafka' 카테고리의 다른 글
| AWS MSK 메트릭 수집 및 모니터링 (0) | 2025.11.06 |
|---|---|
| Kafka 리플리케이션 완벽 이해: 동작 원리부터 토픽 설정까지 (0) | 2025.10.31 |
| 카프카 프로듀서 구조와 동작 원리 (0) | 2025.10.24 |
| Kafka는 왜 이렇게 빠르고 안정적일까? — 높은 처리량과 안정성을 만드는 핵심 원리 (0) | 2025.10.24 |
| Kafka 저장 구조의 모든 것: Partition, Replication, Segment (0) | 2025.10.24 |