Open hubtwork opened 1 week ago
전송계층 :
PLAINTEXT
,SSL
인증계층 :
SSL
,SASL
SSL, SASL 어떤 것이 더 좋냐?
둘의 목표가 다름
SSL 은 종단 간 교환 되는 메시지를 안전하게 보호하는 것이 목표
SASL 은 종단 간 사용할 인증 방식을 서로 합의할 수 있도록 해주는 프레임워크 (구체적인 인증작업은 GSSAPI, OAUTHBEARER 등 인증 프로토콜 구현)
Inter.broker.listener.name, security.inter.broker.protocol 설정을 사용하여 브로커간 통신시 사용되는 리스너 선택 가능
(자세한 설정은 p.300 참조)
p.301 ~ p.306 서버에서 키 생성하고 카프카 설정하는 것은 DevOps 형님들 몫이니 참고용
서버 쪽 키 저장소는 동적으로 갱신해 줄 수 있지만 kafka-configs.sh 사용(카프카 설치시 bin 디렉토리 내에 존재)
클라이언트는 재시작하는 것 외엔 방법이 없음
보안을 강화하기 위해 인증서의 유효기간 등을 동적으로 업데이트하는 기법을 사용한다면 이야기가 달라짐
리밸런싱이 발생함으로 작업이 지연 될 수도 있음
TLS 가 사용되지 않는 경우 사전 공격, 무작위 암호 대입 공격을 위한 충분한 정보 획득 가능
파일 시스템 권한을 적절히 설정함으로써, 키탭 파일에 대한 접근 역시 제한해야함
누출이 발생했을 때 누구 소행인지 특정하기 어려움
PLAIN
사용자 이름/비밀번호 인증
외부 비밀번호 저장소를 사용해서 비밀번호를 검증한느 서버측 커스텀 콜백과 함께 사용됨
안전한 전송 계층을 보장하기 위해 PLAIN 메커니즘 활성화시 SASL_SSL 암호화 설정 역시 켜줘야함
SCRAM-SHA-256 and SCRAM-SHA-512
사용자 이름/비밀번호 인증
카프카를 설치하자마자 바로 사용 가능
반드시 SASL_SSL 보안 프로토콜과 함께 사용되야함
주키퍼 역시 SSL 기능을 켜야함
OAUTHBEARER
OAuth bearer 토큰을 사용한 인증
OAuth 서버에서 부여된 토큰을 추출하고 검증하는 커스텀 콜백과 함께 사용
Rolling Update: 보안 패치를 적용할 때 카프카 클러스터의 브로커들을 순차적으로 업데이트하여 서비스를 중단하지 않고 진행
SSL 키스토어/트러스트스토어 업데이트: 브로커 재시작 없이 동적으로 SSL 설정을 갱신할 수 있음
사용중인 클러스터에 새로운 보안 프로토콜을 추가할 때는 기존 브로커와의 호환성 유지를 위해 리스너 설정을 주의해야 함
새로운 리스너를 추가할 때 listeners
와 advertised.listeners
설정을 활용
브로커 간 통신에 필요한 리스너 업데이트는 inter.broker.listener.name
을 통해 조정 가능
SASL 메커니즘을 PLAIN에서 SCRAM-SHA-256으로 교체하는 과정에서는 브로커 설정을 동적으로 적용할 수 있음
SCRAM 저장소에 사용자를 추가하고, 리스너 설정에서 SCRAM-SHA-256을 활성화
모든 클러스터에 SCRAM 설정을 적용한 후, 이전 PLAIN 설정을 삭제하여 보안 강화
AclAuthorizer: ACL(Access Control List)을 사용하여 자원에 대한 접근 제어를 설정. 사용자가 특정 자원에 대해 수행할 수 있는 작업을 Allow
또는 Deny
를 통해 설정할 수 있음.
SimpleAclAuthorizer: 카프카 2.0 이후 기본 제공되는 인가 기능으로, 주로 리소스에 대한 ACL을 관리하는 데 사용됨.
리소스 유형: 클러스터, 토픽, 그룹 등의 리소스에 대해 접근 권한을 설정할 수 있음
패턴 유형: 리터럴(Literal)과 접두사(Prefixed)를 사용하여 특정 리소스나 그룹을 지정 가능
작업 권한: Read
, Write
, Describe
, Alter
, Delete
등의 작업에 대해 권한을 부여하거나 제한할 수 있음
ACL 예시 : 예를 들어, User에게 특정 토픽에 대해 쓰기 권한을 부여하는 방식으로 설정 가능
CustomAuthorizer: 기본 제공되는 AclAuthorizer
를 확장하여 커스텀 권한 관리 기능을 구현할 수 있음
RbacAuthorizer: 역할 기반 접근 제어(Role-Based Access Control)를 지원, 특정 그룹이나 역할에 따라 권한을 설정할 수 있음
커스터마이징 예시: 내부 리소스에 대해 특정 사용자 또는 그룹에 맞춤형 역할과 접근 권한을 부여 가능(p.331 ~ 332 참고)
log4j
를 사용하여 감사와 디버깅 목적의 로그를 생성. kafka.authorizer.logger
를 통해 인가 관련 로그를 기록할 수 있음SASL 인증: 주키퍼의 보안을 강화하기 위해 SASL과 같은 인증 메커니즘을 설정
SSL 설정: 주키퍼에 SSL을 설정하여 통신 중 데이터를 암호화, 클라이언트와 브로커 간의 안전한 연결을 보장
ACL 적용: 주키퍼 노드에 대한 접근 제어를 위해 ACL을 설정하여 데이터를 보호
카프카 책이지만 보안에 대한 고려 사항들이 나와서 오늘도 키워드 많이 줍줍했다. 실제 세팅할 때 다시 한번 봐야지
카프카 보안이지만, 결국 소프트웨어 보안 관점에서 바라봐도 괜찮은 내용이었다. 인증, 인가, 보안 범위 등 시스템 위험을 최소화 하기 위해 엔지니어가 어떤 것들을 고려해야 하는지 잘 설명해주고 있다고 생각했다.
결국 안전한 카프카 클러스터
특징 7가지를 얼마나 적절하게 설정할 수 있는지가 중요한 것 같다.
이 챕터를 읽기 전에는 카프카 보안을 구체적으로 생각해본적이 없는데, 어쩌면 당연하게 기본인 것들을 놓치고 있는지 다시 한 번 되돌아봐야겠다. (나란 바보샛기...)
'안전한 카프카 클러스터' 특징이 완벽히 지켜질 수 있을지 궁금하다. 곧 직접 카프카를 이용한 새 프로젝트를 할텐데, 이번 챕터의 보안과 더불어 얼만큼 적절한 구조를 가져갈 수 있을지 궁금하다.
현재 SASL_SSL + MSK
조합으로 사용 중이다. 최근에 SRE 측에서 변경해주었는데, 기존에 Confluent + PLAINTEXT
로 설정해서 사용하던 걸 보고 경악을 금치 못했던 기억이 있다. ( 네트워크 접근을 어차피 막으니까 상관없다고 생각한건가; )
물론 SSL
인증 방식에서 zero-copy-transport 가 현재 지원되지 않으므로, CPU 오버헤드는 항상 존재할 수 있으나 이로 인해 얻는 보안적 이점 ( 클라이언트 - 서버 간 양방향 암호화 검증 ) 을 무마시킬 정도의 단점으로 절대 보이지 않는다. ( HTTPS
왜 쓰는데 그럼? ㅋ) 다만, 클라이언트 측면에서 STORE 기반의 인증서 관리가 매우 비효율적 일 수 있으므로 SASL
에게 온전히 책임을 전가시키는 방식이 존재하므로, 크게 고려하지 않아도 되는 사항이라고 생각된다.
재인증방식을 매번 연결시마다 인증해야하는 방식으로 바뀌는 것까지 갓-벽
역시나 보안 관련 기본 지식 외에 설정 관련해서는 "아하 그렇구나~" 하고 넘김 ㅋ
근데 우리 물리디스크랑 e2e 암호화는 안쓰고 있는 거로 알고있는데... 괜찮겠지ㅜ ㅋㅋ
과연 카프카 보안에만 신경을 써야 할까라는 생각이 들기도 했고.. 진짜 보안은 예전이나 지금이나 항상 재미가 없는 파트인거 같다는 생각이 들었다.. SASL은 보안할때 항상 언급이 되었던 내용이라 슥~~ 훑어봤습니다 :)
결론 : 사실 카프카에서도 보안을 언급하는거 보면, 우리가 만지는 소프트웨어도 보안에 대한 점검을 한번더 바라봐야할거 같다.
Chapter Ownership : @KangHun-Lee