9.2 SSL을 이용한 카프카 암호화
KeyStore
- 자바 기반 애플리케이션에서 사용하는 인증 추상화를 제공하는 인터페이스
- 퍼블릭 키, 프라이빗 키, 인증서를 추상화해 제공한다.
- 카프카 또한 자바 기반이기에 자바의 keytool 명령어로 SSL 적용 작업을 진행하게 된다.
- 클러스터 환경 기준 SSL 구성도엔 다음 요소들이 포함된다.
- 클라이언트
- 트러스트스토어
- CA 인증서
- 키스토어
- 각 토픽들
9.2.1 브로커 키스토어 생성
- 클러스터 내 각 브로커마다 키스토어를 먼저 생성해야 한다.
- 각 브로커마다 프라이빗 키와 인증서가 필요하기 때문
graph LR
subgraph 클라이언트
TrustStore[트러스트스토어]
end
클라이언트 <-->|인증| 서버
subgraph 서버
키스토어
end
- 키스토어와 트러소트스토어는 모두 클라이언트, 서버 사이 SSL 연결 시 사용한다.
- 키스토어
- 서버 측면의 프라이빗 키와 인증서를 저장하며 자격 증명을 제공
- 그 외 민감 정보도 저장한다.
- 트러스트스토어
- 클라이언트 측에서 서버가 제공하는 인증서를 검증
- 검증을 위한 퍼블릭 키와 서명된 인증서를 저장
- 민감 정보는 저장하지 않는다.
9.2.2 CA 인증서 생성
- 클라이언트-서버 간 안전한 통신을 위해서 인증기관(CA)에서 발급해주는 인증서가 필요하다.
- CA가 발급해주는 공인된 인증서를 가지면 클라이언트로부터 신뢰받을 수 있다.
- 다만 테스트나 개발 환경 등에선 CA 발급은 부담이 되므로 자체 서명된 인증서를 사용하기도 한다.
- 아래는 리눅스의 openssl 명령어로 ca 인증서를 생성하는 예이다.
new
새로 생성 요청
x509
표준 인증서 번호
keyout
생성할 키 파일 이름
out
생성할 인증서 파일 이름
days
유효일자
subj
인증서 제목
nodes
프라이빗 키 파일을 암호화하지 않음
sudo openssl req -new -x509 -keyout ca-key -out ca-cert -days 356 -subj "/CN=foo.bar" -nodes
- 인증을 생성하면 인증서 파일인 ca-cert와 프라이빗 키 파일인 ca-key가 생성된다.
ls
ca-cert ca-key kafka.server.keystore.jks
- 관리자는 프라이빗 키가 절대 외부에 유출되지 않게 잘 관리해야 한다.
9.2.3 트러스트스토어 생성
- 서버가 공인 인증서를 발급받은 경우 클라이언트는 서버 측에 접속해 서버의 인증서가 신뢰할 수 있는지 확인한다.
- 인증서가 공인 인증서인지, 사설 인증서인지에 따라 클라이언트의 신뢰는 달라진다.
- 공인 인증서: 신뢰할 수 있는 CA에서 발급 → 별도 조치 없이 클라이언트가 신뢰.
- 사설 인증서: 자체 발급 → 클라이언트가 신뢰할 수 있도록 CA 인증서를 직접 트러스트스토어에 등록해야 함.
- 아래는 트러스트스토어에 CA 인증서를 추가하는 명령어다.
sudo keytool -keystore kafka.server.truststore.jks -alias
CARoot -importcert -file c-cert -storepass $SSLPASS -keypass $SSLPASS
- keytool 명령어의 상세 옵션은 다음과 같다.
keytool
키스토어 이름
alias
별칭
importcert
인증서를 임포트
file
인증서 파일
storepass
저장소 비밀번호
keypass
키 비밀번호