엘라스틱 서치가 8.0 버전을 기점으로 보안셋팅이 기본으로 설정되어있다.
음.. 보안이란것은 나에게 엄청 멀게만 느껴졌었는데 서비스를 하려면 기본적으로 https 통신을 해야
고객(user)들의 데이터들이 통신할때 암호화 하기때문에 안전하게 통신할 수 있다.
https://opentutorials.org/course/228/4894
보안의 대한 개념 설명은 뒤로하고 엘라스틱서치 서버에 접근할때 보안접속을 하는 방법을 알아보자.
# 주의
본 내용은 노드간 통신에 적용하는 것이 아닌 외부PC에서 엘라스틱 서치 서버로 접근할때
데이터를 암호화 하기 위한 셋팅입니다.
동일 서버에서 엘라스틱 서치를 추가로 사용하실 경우엔
기존 적용되어있는 http.p12 인증서를 통해서도 접속이 가능합니다.
하지만 http.p12 인증서는 기관이 인증하지 않은 인증서 임으로 외부에서는 신뢰할 수 없습니다.
내부에서 보안 연결 확인
curl --cacert $ES_PATH/config/certs/http_ca.crt -u elastic:{PASSWORD} https://localhost:9200
엘라스틱 서치 외부 클라이언트로 보안 접속하기
일단 준비물 2가지가 필요하다.
1. 도메인 *서버 IP를 DNS 정보로 등록
2. 인증서 *위 도메인 정보가 포함되어있는 CA인증서
도메인의 경우는 유로로 구매할 수있고 무료로도 사용할 수 있다.
도메인 무료 발급 사이트 : https://www.freenom.com/en/index.html?lang=en
사용 방법 : https://teserre.tistory.com/3
인증서도 마찬가지로 길게 서비스 해야하는 경우 구매하는 것이 좋지만 무료 인증서 발급기관이 있다.
letsencrypt : https://jjeongil.tistory.com/842
letsencrypt 로 인증서를 발급받으면 3개월 마다 갱신해줘야하는 단점이 있다.
뒤 늦게 알게 되었는데
엘라스틱서치 서버에서 인증서를 반드시 발급받아야할 필요는 없는 것 같다.
로컬 PC든 어디든 일단 발급만 받으면 된다.
/etc/letsencrypt/archive/{MyDomain}
발급을 받았다면 위 경로에 .pem 파일로 인증서에 대한 정보들이 각각 분리되어있다.
cert1.pem chain1.pem fullchain1.pem privkey1.pem
엘라스틱 서치에서는 .pem 파일이 아니라 위 cert와 개인키가 포함되어있는 .p12 파일로 인증서를 처리하는 것 같다,
그래서 위 파일을 .p12 파일로 변환해줘야 한다.
openssl pkcs12 -export -inkey privkey1.pem -in cert1.pem -out cert_key.p12
인증서 패스워드 입력 : (keystore 에 등록해줘야하기때문에 메모해두시길 바랍니다.)
이후 생성된 .p12 키를 엘라스틱 서치 config/certs 디렉터리로 복사
cp cert_key.p12 $ES_PATH/config/certs
elasticsearch.yml 파일 수정
vi $ES_PATH/config/elasticserach.yml
xpack.security.enabled: true
xpack.security.http.ssl:
enabled: true
keystore.path: certs/cert_key.p12
인증서가 바뀌였으니 인증서 비밀번호도 변경해줘야합니다.
bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
위에서 설정해줬던 비밀번호 입력 :
엘라스틱 서치 실행
bin/elasticsearh
이제 브라우저에서 접속할 경우 접속이 가능합니다
왜냐하면 우리가 인증서를 발급받는 순간 인증서는 브라우저의 인증 정보를 제공하기 때문입니다.
하지만 터미널 curl 이나 , 다른 클라이언트로 연결할 경우 인증 못하는 경우가 발생할 수 있습니다.
그럴 경우 아까 발급받았던 cert_key.p12 인증서를 로컬 PC로 따로 뺴서 PC에 인증서를 등록하면 됩니다.
저의 경우 MAC을 사용하고 있어서 키체인을 통해 인증서를 등록했습니다.
python 클라이언트 접속 방법
from elasticsearch import Elasticsearch
client = Elasticsearch(
["https://{MyDomain}:9200"],
http_auth=('elastic',{PASSWORD}),
scheme="https",
port=433,
)
client.info()
보안 접속 성공!
'API > ElasticSearch' 카테고리의 다른 글
[ElasticSearch]. 다중 검색 종류 비교 : 비동기 검색(async_search) VS 멀티 서치(msearch) (0) | 2022.08.23 |
---|---|
[ElasticSearch]. 크론탭(crontab)으로 리눅스 서버 꺼지면 자동 재실행 하기 (0) | 2022.08.14 |
[elasticSearch] 엘라스틱 서치 클라우드 배포 &셋팅하기 (0) | 2022.03.11 |
[ElasticSearch]. 개발하면서 발견한 특징들 (0) | 2022.02.24 |
[ElasticSearch]. 엘라스틱 서치 서버 셋팅하기 (0) | 2021.12.04 |