[9장에서 배울것]
- 카프카 보안의 3요소
- 카프카 클러스터에 SSL과 커버로스를 적용하는 방법
- ACL을 이용한 카프카 권한 설정
- 카프카는 기업 내부 시스템으로 주로 활용해서, 대부분 사내 보안에 대해 큰 신경을 쓰지 않는다고 한다.
=> 보안이 적용되어 있지 않은 경우가 대부분이다.
- RabbitMQ같은 오픈소스에서는 자체적으로 기본적인 보안 기능이 포함되어서 관리자가 초기 구성에서 바로 보안 기능을 적용할 수 있지만, 카프카는 설치시에 자동으로 설정안되기 떄문에 관리자가 직접 적용해야 한다.
카프카가 연결 가능한 클라이언트들은 모든 권한을 가지고 있어서 토픽에 메시지 수송신이 가능하기 때문에, 악의적인 목적을 가진 사용자가 사용한다면 큰 문제가 생길 수 있다.
따라서 세가지 보안 요소가 필요함.
1. 카프카 보안의 세 가지 요소
1) 암호화
통신을 암호화해서 패킷을 가로채더라도 데이터를 읽을 수 없게 설정
웹 : http가아닌 https를 사용하는 것과 같은 원리, SSL을 사용
2) 인증
안전하다고 확인된 클라이언트만 접근할 수 있도록 설정
웹 : 로그인
SASL - 인터넷 프로토콜에서 인증과 데이터 보안을 위한 프레임워크
3) 권한
인증 받은 클라이언트의 권한을 제한
웹 : 일반 사용자 / 관리자
ACL(Access Control List) : 접근 제어 리스트 이용해서 권한을 사용
간단히 CLI 로 ACL을 설정할 수 있음 (모든 ACL 규칙은 주키퍼에 저장)
ACL은 리소스 타입 (토픽, 그룹, 클러스터, …)별로 구체적인 설정이 가능
=> 강력한 권한 설정 가능
2. 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
'DevOps > Kafka' 카테고리의 다른 글
[kafka] 카프카 버전 업그레이드와 확장 (0) | 2022.05.25 |
---|---|
[Kafka] 카프카의 모니터링 (0) | 2022.05.25 |
[Kafka] 카프카의 내부 동작 원리와 구현 (0) | 2022.04.26 |
[Kafka] 카프카 기본 개념 구조 이해하기 (0) | 2022.04.21 |