본문 바로가기
공부

Elastic Search 설치 및 환경설정

by son_i 2023. 12. 7.
728x90

Elastic Search란 ? ) 오픈소스 검색엔진. 키워드가 어떤 document에 있다고 저장하는 방식. 

 

GCP에 SSH 키 등록하는 방법 

https://blog.wsgvet.com/google-cloud-platform-ssh-key-putty-connection/

 

구글 클라우드 플랫폼에서 SSH키 생성 후 PuTTY 접속하기

구글 클라우드 플랫폼에서 SSH로 접속할 때, 기본적으로 제공하는 브라우저 접속은 로그인이 필요하고, 반응…

blog.wsgvet.com

 

에러발생

ES 설치 후 또 다른 putty 터미널 창에서 curl -XGET localhost:9200으로 접속 시 curl: (52) Empty reply from server 에러

 

접속 할 때 HTTP를 사용해서 발생하는 에러. config/elasticsearch.yml의 4가지 옵션을 false로 변경

 

새로운 터미널에서 curl 명령어를 이용해서 접속하면 이상 없이 뜸.

 

"name" 노드 이름 (호스트 이름과 같음)

 

ctrl + c를 눌러 프로세스를 종료 시키고 다시한 번 접속하면 연결이 안 됨. 당연함 


node 3개 실행 후 마스터 노드 2번으로 정해짐.

외부 터미널에서 $ curl 외부IP:9200/_cat/nodes 확인해보면 ES 노드 3개가 전부 바인딩되어 한 클러스터로 묶인 것을 확인.

$ curl elastic-1:9200/_cat/nodes 로도 가능

마스터 노드가 *로 표시

 

>curl "http://외부IP:9200/_cat/nodes?v 

title도 같이 볼 수 있음.

(?옵션 줄 때는 http를 붙여야함.)

 

 


보안설정

클러스터 보안 설정

>vi config/elasticsearch.yml

xpack.security.enabled: true 설정

 

에러 발생

network.host를 지정해줬기 때문에 운영모드로 실행이 되는데 부트스트랩 체크에서 failed됨.

-> ssl transport를 무조건 지정을 해줘야함

Y ? ) security를 enabled한 순간부터  클러스터링 할 때 transport layer security를 적용하지 않으면 클러스터링이 되지 않도록 되어있음.

[1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch. For more information see [https://www.elastic.co/guide/en/elasticsearch/reference/8.11/bootstrap-checks.html] bootstrap check failure [1] of [1]: Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false]; for more information see [https://www.elastic.co/guide/en/elasticsearch/reference/8.11/bootstrap-checks-xpack.html#bootstrap-checks-tls]

 

transport layer security설정

https://www.elastic.co/guide/en/elasticsearch/reference/7.11/encrypting-internode.html 여기에

- 이 부분에서 두 번째줄을 config/elasticsearch.yml에 추가해줘야함.

- 공개키와 대칭키를 입력해줘야 함.

  -> 키를 먼저 만들어야 함.

  https://www.elastic.co/guide/en/elasticsearch/reference/7.11/encrypting-communications-certificates.html 참조

 ES에서는 certificates를 만들 수 있는 certutil을 제공함. bin 디렉토리 안에 elasticsearch-certutil있음.

 

공개키 생성과 패스워드 지정

>bin/elasticsearch-certutil ca

엔터 누르고 비밀번호 지정

 

elastic-stack-ca.p12 파일이 만들어짐.

 

대칭키 만들기

config디렉토리 안에 cert 폴더 생성

아래 명령어 실행

./bin/elasticsearch-certutil cert \
--ca elastic-stack-ca.p12 \ 
--dns elastic-1,elastic-2,elastic-3 \ 
--ip es-1의내부IP,es-2의내부IP,es-3의내부IP \
--out config/certs/es-cluster.p12

입력 후 공개키 pass word 입력,

지금 만들 es-cluster.p12의 password 입력

 

정상 완료하면 es-cluster.p12 파일이 만들어짐.

이 파일을 elasticsearch.yml에 추가해줘야함.

 

3, 4번 째 줄을 추가해줘야함.

추가해주는 내용들 

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.keystore.path: certs/es-cluster.p12
xpack.security.transport.ssl.truststore.path: certs/es-cluster.p12

 

그럼 이제 부트스트랩 오류는 안 남.

다만 키를 만들 때 pw를 지정해줬기 때문에 설정을 해줘야하는데 안 해줘서 실행하면 그에 대한 오류가 남. 

[2023-12-06T15:47:51,198][ERROR][o.e.b.Elasticsearch ] [node-1] fatal exception while booting Elasticsearchorg.elasticsearch.ElasticsearchSecurityException: failed to load SSL configuration [xpack.security.transport.ssl] - cannot read configured [PKCS12] keystore (as a truststore) [/home/rsa-key-20231205/es-811/config/certs/es-cluster.p12] - this is usually caused by an incorrect password; (a keystore password was provided)

 

패스워드 입력 옵션 elasticsearch.yml에 넣어줌.

  해줘야할 것 이 4가지

xpack.security.transport.ssl.keystore.secure_password: "패스워드"
xpack.security.transport.ssl.truststore.secure_password: "패스워드"

그래도 오류가 나는데 패스워드를 눈에보이는 설정파일에 넣어놓는 것은 위험해서 남.

keystore에 저장해야 함.

 

이 명령어로 keystore 생성

./bin/elasticsearch-keystore create 
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

아래 항목 추가로 입력후 지정했던 패스워드 입력

 

잘 저장되면 이렇게 확인 가능.

 

-----

node-1에서 위와 같은 인증서를 만들어줬고 node2와 3에서 동일하게 적용하기 위해 scp 명령이용

scp는 각각의 호스트 끼리는 접근 못 함.

 

에러발생

윈도우 터미널에서 scp 명령어 사용할 때 Permisstion denied 발생

 

C:\Windows\System32>scp rsa-key-20231205@외부ip주소:/home/rsa-key-20231205/es-811/elastic-stack-ca.p12 C:\
rsa-key-20231205@34.64.83.55: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

 

접근이 안된다고 하길래 GCP에 등록해둔 SSH 비밀키로 해당 서버에 접속을 시도해보았다.

그랬더니 아래와 같이 보안이 좋지 않다고 떴다.

C:\Windows\System32>ssh -i C:\zerobase\awskey rsa-key-20231205@외부ip주소
Bad permissions. Try removing permissions for user: BUILTIN\\Users (S-1-5-32-545) on file C:/zerobase/awskey.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\zerobase\\awskey' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "C:\\zerobase\\awskey": bad permissions
rsa-key-20231205@34.64.83.55: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

 

그래서 새로 key를 발급해주기로 했다.

ssh-keygen -t rsa -f ~/.ssh/[KEY_FILENAME] -C [USERNAME]

 $ ssh-keygen -t rsa -f ~/.ssh/es-rsa -C rsa-key-20231205

입력하면 .ssh 폴더에 es-rsa 와 es-rsa.pub 파일이 생성.

 

* es-rsa 비밀키 파일을 본인만 읽고 다른 사람은 읽을 수 없게 400 권한을 줘야함.

$ chmod 400 ~/.ssh/es-rsa

 

공개 키파일 확인

$ cat .ssh/es-rsa.pub

나오는 내용 복사

 

GCP 메타 데이터에 SSH 공개키 붙여넣어서 등록하면 완료 !

 

로컬 터미널에서 ssh 명령어를 비공개 SSH 키파일, 사용자 이름, 연결할 인스턴스 외부 IP주소와 함께 사용.

ssh -i PATH_TO_PRIVATE_KEY USERNAME@EXTERNAL_IP

 

PATH_TO_PRIVATE_KEY : 비공개 SSH키 파일 경로

USERNAME : 인스턴스에 연결하는 사용자의 사용자 이름. 메타데이터에서 SSH 키를 관리하는 경우, 사용자 이름은 SSH 키를 만들 때 지정한 비밀번호. OS로그인 계정의 경우 사용자 이름은 GOOGLE 프로필에 있음.

EXTERNAL_IP : 인스턴스의 외부 IP 주소.

 

C:\Windows\System32>ssh -i ~/.ssh/es-rsa rsa-key-20231205@외부 ip주소

어떤 터미널이든 입력시 인스턴스에 연결할 수 있음.

짠 완료 !


node-1의 인증서 로컬에 복사

scp -i [비밀키경로] [리눅스계정]@[서버주소]:[파일있는목적경로] [복사해올로컬경로]

 

>scp -i ~/.ssh/es-rsa rsa-key-20231205@외부ip:/home/rsa-key-20231205/es-811/config/certs/es-cluster.p12 C:\

이렇게 하면 정상적으로 es-cluster.p12가 로컬로 복사됐다.

이제 이 파일을 node-2, 3에 복사해줘야한다.

 

각 노드의 config 밑에 certs 디렉토리 생성

로컬에있는 es-cluster.p12파일을 certs 디렉토리 밑에 복사.

scp -i [비밀키경로] [복사해줄파일경로] [리눅스계정]@[서버주소]:[복사할 파일을 넣을 목적경로] 

scp -i ~/.ssh/es-rsa ./es-cluster.p12 rsa-key-20231205@외부IP주소:/home/rsa-key-20231205/es-811/config/certs/es-cluster.p12

node2와 3의 외부 ip주소를 넣어서 똑같이 해줌.

 

똑같이 elasticsearch.yml에 설정해줌.

keystore도 만들어주고 비밀번호 인증서 만들 때 입력했던 패스워드 두 가지 추가로 입력.

./bin/elasticsearch-keystore create 
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

정상적으로 3개의 노드에서  elasticsearch를 정상적으로 실행했다 !

 

-> 보안 설정을 마쳤으므로 각 노드들이 통신을 할 때마다 보안된 프로토콜로 통신을 함.

 

이제 이렇게 접근하면 security-exception이 발생함. 앞으로 무조건  elasticsearch에 접근할 때는 id와 pw를 함께 입력해줘야함. 

 

아이디 패스워드 생성

$ bin/elasticsearch-setup-passwords

Commands(옵션) 두가지가 있음

  auto : 패스워드를 자동으로 만들어줌.

 interactive : 내가 직접 하나하나 설정해줘야 함.

 

auto

$ bin/elasticsearch-setup-passwords auto

주요 id에 대한 패스워드를 자동으로 생성해줌.

$ curl localhost:9200 -u elastic:elastic비밀번호

요청시 id와 정해진 비밀번호 함께 입력하면 접속 가능

한 번 패스워드를 잊어버리면 setup을 할 수 없음. 

이런 경우 노드 중지시키고 data를 한 번 없애고 다시 setup-passwords 해야함. <- 일반적인 경우는 아님.

 

interactive 

$ bin/elasticsearch-setup-passwords interactive

이렇게 하면 지정해줄 패스워드를 하나하나 물어봄.... 다고 하는데

나는 계속 이렇게 뜨면서 안 된다. (data 디렉토리를 날려줬음에도)

그래서 그냥 reset 옵션을 이용해 직접 elastic에만 지정해주었다.

그리고 나머지 비밀번호 세팅된 것들 다 이렇게 수동으로 바꿔주었다 ㅇ.....

터미널에서 $ curl elastic-1:9200 -u elastic:패스워드 하면 접속 된다 ~

패스워드유틸은 cluster에 있는 relam을 사용하기 때문에 같은 클러스터인 elastic-2,3에서도 따로 설정없이 된다.

 

 

사용자 추가

새로만든 유저로 elastic-1에 접근은 가능하지만 2, 3에는 접근이 안 됨. elasticsearch-users로 유저를 만들 때는 node1의 config 디렉토리 밑에 저장이 됨.

[rsa-key-20231205@elastic-1 es-811]$ bin/elasticsearch-users useradd soeun -p password -r superuser
[rsa-key-20231205@elastic-1 es-811]$ curl elastic-1:9200 -u soeun:password
{
  "name" : "node-1",
  "cluster_name" : "es-cluster-1",
  "cluster_uuid" : "c5pACvYdRia1ke4oD9YIuQ",
  "version" : {
    "number" : "8.11.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "6f9ff581fbcde658e6f69d6ce03050f060d1fd0c",
    "build_date" : "2023-11-11T10:05:59.421038163Z",
    "build_snapshot" : false,
    "lucene_version" : "9.8.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}
[rsa-key-20231205@elastic-1 es-811]$ curl elastic-2:9200 -u soeun:password
{"error":{"root_cause":[{"type":"security_exception","reason":"unable to authenticate user [soeun] for REST request [/]","header":{"WWW-Authenticate":["Basic realm=\"security\" charset=\"UTF-8\"","ApiKey"]}}],"type":"security_exception","reason":"unable to authenticate user [soeun] for REST request [/]","header":{"WWW-Authenticate":["Basic realm=\"security\" charset=\"UTF-8\"","ApiKey"]}},"status":401}[rsa-key-20231205@elastic-1 es-811]$

 

- 내부ip는 인스턴스 재시작해도 바뀌지 않지만 외부 ip는 바뀔 수 있음.

- elastic 방화벽은 외부의 클라이언트와 elastic-1노드가 통신할 수 있게 적용

- elatic-internal 방화벽은 같은 방화벽 규칙을 가진 노드들끼리 통신할 수 있도록 함.

정리
Google Cloud Platform에 3개의 인스턴스 생성, 각 인스턴스에 elastic search 노드 설치.
3개의 elasticsearch 노드를 클러스터링 한 뒤에 각각의 통신을 tls로 보안 적용하는 것까지 연습.
728x90

'공부' 카테고리의 다른 글

Elasticsearch) CRUD  (1) 2023.12.08
Elasticsearch 활용) 인덱스 샤드 모니터링  (0) 2023.12.07
Kibana  (2) 2023.12.07
JPA 영속성 컨텍스트  (0) 2023.11.30
윈도우에서 base64 인코딩 하는 방법  (0) 2023.10.08