Kafka

Strimzi Kafka mTLS 적용 알아보기

황동리 2025. 12. 3. 18:51
반응형

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-namespacetest 라는 이름의 secret이 생성이 됩니다.


그리고 해당 secret의 내용을 살펴보면, 아래 이미지와 같이 생성이 됩니다.

여기서 조금 헷갈릴 수 있는데, KafkaUser로 생성된 시크릿의 ca.crtClient 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 연결이 정상적으로 됩니다.


감사합니다.

반응형