본문 바로가기

인프라,데이터

카프카 SASL_SSL 방식 + jks truststore로 로그스태시 연결하기

[주의]
클라이언트 전용 jks 키를 받아 깔끔하게 연결하면 좋았겠으나, 그 클라이언트 전용 키를 못 받아서 컨플루언스를 떠돌다 구한 다른 팀의 키로 어떻게든 카프카-로그스태시를 연결해보려고 한 이야기입니다... 

*** 삽질이 난무합니다.***

*** 반전이 있으니 당장 사용하셔야 하는 용도로 이 글을 보고 계신다면 맨 밑으로 내려서 밑부터 읽어주세요.****

 

준비물 : 컨플루언스에서 어떻게 구한 다른 팀에서 쓰는 클라이언트용 keystore, truststore 키    
              카프카와의 클라이언트 SSL 인증에서 필요한 계정, 비밀번호는 받았다고 가정

다른 팀 클라이언트 키스토어에 우리팀 서명을 해보자!

keytool -keystore kafka.client.keystore.jks -alias CARoot -keyalg RSA -validity 3000 -genkey -storepass $SSLPASS -keypass $SSLPASS -storetype pkcs12

  • (국가) C=KR
    (시) ST=Seoul
    (군, 구) L=GangNam
    (조직 이름) O=MyCompanyCo., Ltd.
    (조직 단위) OU=R&D
    CN=발급받은 계정의 이름

맞습니까? 물어보면 y 입력

 

--- 

키 저장소 유형: PKCS12
키 저장소 제공자: SUN

키 저장소에 1개의 항목이 포함되어 있습니다.

별칭 이름: caroot
생성 날짜: 2022. 8. 3
항목 유형: PrivateKeyEntry
인증서 체인 길이: 1
인증서[1]:
소유자: CN=user_username, OU=DE, O="Mycompany Co., Ltd.", L=GangNam, ST=Seoul, C=KR
발행자: CN=user_username, OU=DE, O="Mycompany Co., Ltd.", L=GangNam, ST=Seoul, C=KR
일련 번호: axxxxxx
적합한 시작 날짜: Wed Aug 0X 23:29:03 KST 202X 종료 날짜: Sat Oct XX 23:29:03 KST 20X0
인증서 지문:
     MD5:  49:E5:49:98:8XXXXXXX
     SHA1: BA:74:B2:75:5A:DXXXXXX
     SHA256: 90:EA:FA:79:BF:0D:76:F9:55:C2:B3:CXXXXXXX
서명 알고리즘 이름: SHA256withRSA
주체 공용 키 알고리즘: 2048비트 RSA 키
버전: 3

*******************************************

 

 

연동이 필요한 로그스태시의 config 폴더에서 아래 명령어를 입력합니다.

openssl req -new -x509 -keyout ca-key -out ca-cert -days 3000 -nodes

옵션 이름 설명
new 새로 생성 요청
x509 표준 인증서 번호
keyout 생성할 키 파일 이름
out 생성할 인증서 파일 이름
days 유효 일자
nodes 프라이빗 키 파일을 암호화하지 않음
days 인증서의 유효 날짜. 임의로 넣어줍니다.
  • (국가) C=KR
    (시) ST=Seoul
    (군, 구) L=GangNam
    (조직 이름) O=WithInnovation Co., Ltd.
    (조직 단위) OU=R&D
    (관리자명) CN=관리자의_이름

그러면 관리자의 정보로 ca-key, ca-cert 가 생성됩니다.

 

export SSLPASS=공통으로_설정할_키_비밀번호를_입력해줍니다

 

 

키스토어에 저장된 인증서가 자체 서명된 CA의 서명을 받아, 클라이언트가 인증서 요청을 보냈을 때 해당 인증서를 신뢰할 수 있게 합니다. 

다음의 명령어를 입력해 키스토어에서 인증서를 추출합니다. 

 

keytool -keystore kafka.client.keystore.jks -alias tmp -certreq -file cert-file -storepass $SSLPASS -keypass $SSLPASS

 

생성된 cert-file에 자체 서명된 CA 서명을 적용합니다.

openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days 3000 -CAcreateserial -passin pass:$SSLPASS

 

옵션 이름 설명
x509 표준 인증서 번호
req 인증서 서명 요청
ca 인증서 파일
CAkey 프라이빗 키 파일
passin 소스의 프라이빗 키 비밀번호

 

keytool -keystore kafka.client.keystore.jks -alias 발급받은_계정의_이름 -importcert -file cert-signed -storepass $SSLPASS -keypass $SSLPASS

인증서를 신뢰합니까? y 


별칭 이름: user_username
생성 날짜: 2022. 8. 3
항목 유형: trustedCertEntry

소유자: CN=user_username, OU=DE, O="Mycompany Co., Ltd.", L=GangNam, ST=Seoul, C=KR
발행자: CN=관리자, OU=관리팀, O="Mycompany Co., Ltd.", L=GangNam, ST=Seoul, C=KR
일련 번호: 9XXXXXXXXX
적합한 시작 날짜: Wed Aug 03 21:37:04 KST 2022 종료 날짜: Sun Oct 20 21:37:04 KST 2030
인증서 지문:
     MD5:  F3:97:54XXXXXXX
     SHA1: 1B:51:11:DC:C3XXXXXXXX
     SHA256: 78:CD:F7:CC:10:35:DXXXXXXXXXX
서명 알고리즘 이름: SHA256withRSA
주체 공용 키 알고리즘: 2048비트 RSA 키
버전: 1

 

위와 같은 식으로 소유자 정보에 발급받은 계정의 이름, 발행자는 관리인의 이름이 들어가 있어야 합니다.

그리고 원래 있던 다른 팀의 인증 정보는

keytool -delete -alias 다른팀_alias -keystore kafka.client.keystore.jks

로 지워버립니다.

우리팀의 alias 이름 변경은 

keytool -changealias -alias 기존_alias -destalias 변경할_alias -keypass $SSLPASS -keystore kafka.client.keystore.jks

로 바꿀 수 있습니다. 

 

그런데 ..... keystore로 이 짓을 할 필요가 없었습니다.

왜냐구요? truststore만 있어도 카프카와 로그스태시가 연결이 가능했기 때문이죠 ^^

* keystore : 서버 측면에서 프라이빗 키와 인증서를 저장, 자격 증명을 제공
* truststore : 클라이언트 측면에서 서버가 제공하는 인증서를 검증

 

logstash.conf

input {
    kafka {
        bootstrap_servers => "ip:9093,ip2:9093,ip3:9093"
        group_id => "DE"
        topics => ["TOPIC1", "TOPIC2"]
        decorate_events => true
        sasl_mechanism => "PLAIN"
        security_protocol => "SASL_SSL"
        jaas_path => "/logstash/config/jaas.conf"
        ssl_truststore_location => "/logstash/config/kafka.client.truststore.jks"
        ssl_endpoint_identification_algorithm => ""
    }
}
 

decorate_events : TOPIC 과 같은 정보를 데이터에 추가합니다.
ssl_endpoint_identification_algotithm => ""   : endpoint 확인을 안 하게 합니다. 

 

jaas.conf

KafkaClient {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="aimb"
    password="password";
};

 

* 카프카에서 user_aimb로 설정해서 관리자가 계정을

username : user_aimb
password : password 

이렇게 줘도 jaas.conf 에는 user_ 부분을 뗀 aimb만 넣어야 합니다. 안 그러면 인증 안 됩니다.