본문 바로가기
MessageQueue/Kafka

docker kafka 보안 설정

by 아이티.파머 2023. 5. 31.
반응형

docker kafka 보안 설정

카프카사용시 네트워크 정책이나, 보안설정을 하지 않으면 다른곳에서 컨슈머 서버를 기동시 토픽에 들어간 데이터가 어디서 빠져나가는지 확인 할 수 없다. 이때문에 접근제어 컨트롤를 할 수 있도록 셋팅해주어야 한다.

간단하게 먼저 PLAIN SASL 인증 을 사용하여 server.properties 에서 설정을 할수있다. 더강력한 보안을 위해 PLAIN SALS, SSL/TLS 을 사용 할수 있다. 그렇다고 SALS , SSL/TLS 꼭 사용하여야만 하는것은 아니다. PLAIN SALS, SSL/TLS 사용하지 않고도 다음설정으로 외부 접근을 컨트롤 할 수있다.

listener.name.plain.authz.allowlist=192.168.1.1,localhost
authorizer.class.name=org.apache.kafka.server.authorizer.SimpleAclAuthorizer

# PLAINTEXT 프로토콜을 사용하여 포트 9092에서 Kafka 브로커의 리스닝을 수행
listeners=PLAINTEXT://:9092

#kafka-server 호스트의 포트 9092에서 Kafka 브로커에 접근할 수 있는 리스너를 외부 클라이언트에게 알립니다.
advertised.listeners=PLAINTEXT://kafka-server:9092

여기서 allowlist는 카프카브로커에 연결할수 있는 클라이언트 주소이며, 예제에서는 “192.168.1.1, localhost” 이렇게 두곳에서만 브로커에 접근할수 있다.

여기서 중요한건 allowlist, authorizer.class 설정에 대한 내용 이다.

  • allowlist
    • 앞서 말한것 처럼 접근을 허용하는 외부 네트워크 아이피 목록이다.
  • authorizer.class.name
    • 이속성은 카프카의 인가자 클레스를 설정하는데 사용한다.
    • SimpleAclAuthorizer 클레스를 사용하여 인가작업을 수행하도록 설정한다.

다음은 docker 에서 인증및 인가를 위한 네트워크 인바운드 설정을 위한 내용이다.

위와 동일한 기능을 수행하는 작업이며, 카프카 브로커에 접근할수있는 인가자로 SimpleAuthorizer 클레스를 사용하였다.

docker 전체파일내용

version: '2'

networks:
  test:
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    #networks:
    #  - test

  kafka:
    image: wurstmeister/kafka
    container_name: kafka
    environment:
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.12.92:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CREATE_TOPICS: "MEDIA-REPORT-COLLECT-TARGET:15:1"   # Topic명:Partition개수:Replica개수

            #### 여기부터 보안 설정 - START ##### 
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_SECURITY_PROTOCOL: PLAINTEXT
      KAFKA_INTERCEPTORS: io.confluent.monitoring.clients.interceptor.MonitoringProducerInterceptor,io.confluent.monitoring.clients.interceptor.MonitoringConsumerInterceptor
      KAFKA_AUTHORIZERS: org.apache.kafka.server.authorizer.SimpleAclAuthorizer
      KAFKA_AUTHORIZER_PROPERTIES: "allow.hosts=192.168.12.91,192.168.12.92,192.168.12.93,127.0.0.1"

            #### 여기부터 보안 설정 - END ##### 
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports: #{container port : os public port}
      - "9092:9092"
    depends_on:
      - zookeeper
    #networks:
    #  - test

설정에 대한 상세 정보

  • KAFKA_ADVERTISED_LISTENERS
    • 외부클라이언트가 kafka borker 에 접근할때 사용되는 리스너 주소 설정이다. 설치된 자신의 IP 주소와 PORT 정보를 입력한다.
    • 외부클라이언트에게 알려줄 주소를 명시적으로 지정한다고보면 된다.
    • 외부 클라이언트란 ?*
      Spring Boot 어플리케이션을 이용하여 kafka에 접속 하려고 할경우 해당 어플리케이션은 외부 클라이언트가 된다. 이처럼 내부가 아닌 외부에서 kafka 브로커에 접근하려고 하는 것을 외부 클라이언트로 볼수있다.
      spring:
         kafka:
             bootstrap-servers: [ "192.168.94:9092","192.168.95:9092","192.168.96:9092" ]
    • 이처럼 외부클라이언트에서는 ADVERTISED_LISTENERS 에 기입된 정보를 보고 네트워크에 접속 할수있다. Springboot를 사용한 카프카 예제를 살펴보면 application.properties 에기입되는 내용을 보면 알수있다.
    • broker01
      03 까지 클러스터링 되어 있고 이들의 아이피는 94
      96 번이다. 각 서버들의 server.properties 의 advertised.listeners 설정을 보면 spring boot 에서 설정한 아이피와 포트들이 기록되어 있다.
    • spring boot 에서는 broker 에 접속하기 위해 bootstrap-servers 에 advertised.listeners 에 기록된 내용들을 적어주었다.
    • 이로써 외부클라이언트는 카프카 broker 에 접근 할수있게 된다.

  • KAFKA_LISTENERS
    • 카프카 브로커가 클라이언트 연결을 수신 할때 사용하는 리스너 설정 이다.
    • 0.0.0.0 으로 모든 곳에서 접속 가능 하도록 설정되었다.
    • PLAINTEXT 프로토콜을 사용하고 암호화 되지 않은 방식을 이용한다.
          ┌───────────────┐
  ┌───────┤   브로커 1      ├───────┐
  │       └───────────────┘       │
  │  ┌─────────────────────────┐  │
  │  │    KAFKA_LISTENERS      │  │
  │  ├─────────────────────────┤  │
  │  │ PLAINTEXT://0.0.0.0:9092 │  │
  │  └─────────────────────────┘  │
  │               │               │
  │         ┌─────┴─────┐         │
  │         │           │         │
  │         ▼           ▼         │
  │   ┌───────────┐ ┌───────────┐ │
  │   │ 클라이언트 │ │ 클라이언트     │ │
  │   └───────────┘ └───────────┘ │
  │                               │
  └───────────────────────────────┘
  • KAFKA_AUTHORIZERS
    • SimpleAclAuthorizer 을 사용하여 인증관리를 하도록 설정 하였다.
  • KAFKA_AUTHORIZER_PROPERTIES
    • allow.hosts=192.168.12.91,192.168.12.92,192.168.12.93,127.0.0.1 에서만 접근가능 하도록 설정됨
  • KAFKA_INTERCEPTORS
    • 모니터링을 위한 인터셉터 설정 , 기본적으로 카프카에 대한 모니터링은 가능하나 상세하게 모니터링 하기 위해서는 상세 모니터링이 가능한 인터셉터를 정의해주어야 한다. 그래야 그라파나나, 다른 시각화 도구에서 볼수 있다.

이처럼 네트워크정책으로 인바운드를 정책을 설정할수도 있고, 카프카에서 제공하는 Authorizer 를 사용하여 보안 정책을 정의 할 수도 있다.

반응형

'MessageQueue > Kafka' 카테고리의 다른 글

Message Queue 처리 구조에 따른 종류  (0) 2023.06.02
Event broker 와 Message broker 란?  (0) 2023.06.02
kafka patitioning 과 replication, ack ISR 의 관계  (7) 2023.05.03
kafka cluster 구성  (0) 2020.05.13
kafka 특징  (0) 2020.05.13