Elastic Search란 ? ) 오픈소스 검색엔진. 키워드가 어떤 document에 있다고 저장하는 방식.
GCP에 SSH 키 등록하는 방법
https://blog.wsgvet.com/google-cloud-platform-ssh-key-putty-connection/
에러발생
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에 추가해줘야함.
- 공개키와 대칭키를 입력해줘야 함.
-> 키를 먼저 만들어야 함.
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로 보안 적용하는 것까지 연습.
'공부' 카테고리의 다른 글
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 |