[주의]
클라이언트 전용 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만 넣어야 합니다. 안 그러면 인증 안 됩니다.
'인프라,데이터' 카테고리의 다른 글
AWS Elasticache service update를 하면 일어나는 일 (0) | 2023.04.21 |
---|---|
데이터 중심 애플리케이션 설계 4장 정리 (0) | 2022.05.29 |
데이터 중심 애플리케이션 설계 3장 정리 (0) | 2022.05.22 |
데이터 중심 애플리케이션 설계 2장 정리 (0) | 2022.05.15 |
데이터 중심 애플리케이션 설계 1장 정리 (0) | 2022.05.08 |