본문 바로가기

DevOps/Kafka

[Kafka] 카프카의 보안

728x90

[9장에서 배울것]

- 카프카 보안의 3요소

- 카프카 클러스터에 SSL과 커버로스를 적용하는 방법

- ACL을 이용한 카프카 권한 설정

 


- 카프카는 기업 내부 시스템으로 주로 활용해서, 대부분 사내 보안에 대해 큰 신경을 쓰지 않는다고 한다. 

=> 보안이 적용되어 있지 않은 경우가 대부분이다.

- RabbitMQ같은 오픈소스에서는 자체적으로 기본적인 보안 기능이 포함되어서  관리자가 초기 구성에서 바로 보안 기능을 적용할 수 있지만, 카프카는 설치시에 자동으로 설정안되기 떄문에 관리자가 직접 적용해야 한다.

 

카프카가 연결 가능한 클라이언트들은 모든 권한을 가지고 있어서 토픽에 메시지 수송신이 가능하기 때문에, 악의적인 목적을 가진 사용자가 사용한다면 큰 문제가 생길 수 있다. 

따라서 세가지 보안 요소가 필요함. 

1. 카프카 보안의 세 가지 요소

1) 암호화

통신을 암호화해서 패킷을 가로채더라도 데이터를 읽을 수 없게 설정

웹 : http가아닌 https를 사용하는 것과 같은 원리, SSL을 사용

2) 인증

안전하다고 확인된 클라이언트만 접근할 수 있도록 설정

웹 : 로그인

SASL - 인터넷 프로토콜에서 인증과 데이터 보안을 위한 프레임워크

3) 권한

인증 받은 클라이언트의 권한을 제한

웹 : 일반 사용자 / 관리자

ACL(Access Control List) : 접근 제어 리스트 이용해서 권한을 사용 

간단히 CLI 로 ACL을 설정할 수 있음 (모든 ACL 규칙은 주키퍼에 저장)

ACL은 리소스 타입 (토픽, 그룹, 클러스터, …)별로 구체적인 설정이 가능

=> 강력한 권한 설정 가능 


2. SSL을 이용한 카프카 암호화 (클러스트 환경)

카프카 SSL 적용을 위한 전반적인 구성도 (클러스트 환경)

자바 기반 애플리케이션에서는 KeyStore라고 불리는 인터페이스를 통해 Public key, Private key, 인증서 를 추상화해 제공한다.

카프가는 자바기반 애플리케이션이므로, Java의 Keytool이라는 명령어를 이용해 SSL을 적용한다. 

1) 브로커 키스토어(KeyStore) 생성

2) CA 인증서 생성

  • 사설 인증서 or 공인 인증서 

3) 트러스트스토어(TrustStore) 생성

  • 자체 서명된 CA 인증서를 클라이언트 쪽에서 신뢰할 수 있도록 트러스트스토어에 추가 해줌.

4) 인증서 서명

  • 카프카 브로커 쪽에 키스토어에 저장된 인증서에 대해 자체 서명된 CA의 서명을 받음

5) 다른 브로커에 대한 SSL 구성

6) 브로커 설정에 SSL 추가

=>브로커 설정 파일 변경

server.properties

listeners=PLAINTEXT://:9092,SSL://0.0.0.0:9093
advertised.listeners=PLAINTEXT://peter-kafka01.foo.bar:9092, \
                           SSL://peter-kafka01.foo.bar:9093

ssl.truststore.location=/usr/local/kafka/ssl/kafka.server.truststore.jks
ssl.truststore.password=peterpass
ssl.keystore.location=/usr/local/kafka/ssl/kafka.server.keystore.jks
ssl.keystore.password=peterpass
ssl.key.password=peterpass
security.inter.broker.protocol=SSL ⬅ 브로커 간 SSL 내부 통신

sudo systemctl restart kafka-server

7) SSL 기반 메시지 전송

security.protocol=SSL
ssl.truststore.location=/usr/local/kafka/ssl/kafka.client.truststore.jks
ssl.truststore.password=peterpass
/usr/local/kafka/bin/kafka-console-producer.sh \
                    --bootstrap-server peter-kafka01.foo.bar:9093 \
                    --topic peter-test07 \
                    --producer.config /home/ec2-user/ssl.config

3. 커버로스(SASL)를 이용한 카프카 인증

- 커버로스는 티켓을 기반으로 하는 컴퓨터 네트워크 인증 프로토콜로 사용자의 신원을 식별하기 위한 용도로 사용

- 하나의 커버로스 티켓을 이용해 여러 서비스에 같이 적용할 수 있는 SSO을 지원함.

- 카프카 클라이언트 쪽에서 서버가 따로 존재, 인증 요청을 받고 서버에게 티켓을 발급해준다.

1) 커버로스 구성

  • 커버로스 설치
  • 유저 생성
  • 프린시펄 생성
  • 키탭 생성

2) 키탭을 이용한 인증

  • 브로커로 키탭 파일 전송

3) 브로커 커버로스 설정

server.properties

listeners=PLAINTEXT://:9092,SSL://0.0.0.0:9093,SASL_PLAINTEXT://0.0.0.0:9094
advertised.listeners=PLAINTEXT://peter-kafka01.foo.bar:9092, \
                           SSL://peter-kafka01.foo.bar:9093, \
                           SASL_PLAINTEXT://peter-kafka01.foo.bar:9094

security.inter.broker.protocol=SASL_PLAINTEXT ⬅ 내부통신
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.enabled.mechanism=GSSAPI
sasl.kerberos.service.name=kafka ⬅ 커버로스 생성 시 만들었던 kafka 서비스네임과 일치

kafka_server_jaas.conf

KafkaServer {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    storeKey=true
    keyTab="/usr/local/kafka/keytabs/peter-kafka01.service.keytab"
    principal="kafka/peter-kafka01.foo.bar@FOO.BAR";
};

/usr/local/kafka/config/jmx

KAFKA_OPTS="-Djava.security.auth.login.config=/usr/local/kafka/config/kafka_server_jaas.conf"

 

4) 클라이언트 커버로스 설정

KafkaClient {
    com.sun.security.auth.module.Krb5LoginModule required
    useTicketCache=true;
};

 

export KAFKA_OPTS="-Djava.security.auth.login.config=/home/ec2-user/kafka_client_jaas.conf"

kerberos.config

 

sasl.mechanism=GSSAPI
security.protocol=SASL_PLAINTEXT
sasl.kerberos.service.name=kafka

4. ACL을 이용한 카프카 권한 설정

1) 브로커 권한 설정

server.properties

authorizer.class.name=kafka.security.authorizer.AclAuthorizer -- 권한을 위한 class
super.users=User:admin;User:kafka -- 슈퍼유저

2) 유저별 권한 설정

  • kafka-acls.sh 명령어 사용
  • 리소스 타입, 그룹 리소스 타입 따로 권한 설정

결론 : 여러가지 상황을 잘 검토하고 보안 설정을 하자~

 


Reference

 

실전 카프카 개발부터 운영까지 - 교보문고

데이터플랫폼의 중추 아파치 카프카의 내부동작과 개발,운영,보안의 모든것 | | 이 책에서 다루는 내용 | - 풍부한 그림으로 알기 쉽게 설명한 카프카 내부 구조와 동작 원리 - 자바와 파이썬을

www.kyobobook.co.kr

 

 

Apache Kafka

Apache Kafka: A Distributed Streaming Platform.

kafka.apache.org

 

728x90