본문 바로가기

Monitoring Tools/ELK Stack

[elasticsearch] 단일 node에 8.14.x 설치(CentOS, xpack security)

반응형

설치하기 전에


관련글은 아래 링크를 참조 하도록 한다.

 

elasticsearch 8.14.x 버전은 redhat 기준으로  CentOS7, RHEL8, RHEL9 가 지원되며 (8.0 부터 CentOS6은 지원하지 않는다.) JAVA는 openjdk 17, 21, 22 버전을 지원한다.

참고 : https://www.elastic.co/kr/support/matrix#matrix_jvm

 

설치 환경은 아래와 같다.

  • OS : CentOS Stream release 8
  • Kernel : 4.18.0-553.6.1.el8.x86_64
  • elasticsearch : 8.14.3

최종 3개의 elasticsearch(이하 ES) node로 cluster를 구성하고 1개의 node로 logstash, kibana를 구성할 예정이다.

  • ES node :
    • test-ES01 : 172.16.10.111
      • node name : es-node01
    • test-ES02 : 172.16.10.112
      • node name : es-node02
    • test-ES03 : 172.16.10.113
      • node name : es-node03
  • kibana, logstash :
    • test-ES04 : 172.16.10.114
      • node name : es-kibana01, es-logstash01
test-ES01은 host의 hostname이며 es-node01은 ES 의 node name 이다

이 글에서는 test-ES02 node 1개의 ES 설치 과정을 설명한다.

 

 

본격적인 설치


hosts 파일 등록

경로 : /etc/hosts

172.16.10.111   test-ES01
172.16.10.112   test-ES02
172.16.10.113   test-ES03
172.16.10.114   test-ES04

 

 

yum repository 추가

elasticsearch GPG KEY import

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

 

repogitory 추가

아래 경로에 설정을 추가한다.

경로 : /etc/yum.repos.d/elasticsearch.repo

[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

 

 

ES 설치

yum(dnf)를 이용하여 패키지 설치로 진행한다.

yum install elasticsearch-8.14.3

 

 

인증서 생성

elasticsearch config 설정에 앞서 xpack security에서 transport layer와 restful api에서 사용할 http ssl 인증서를 생성해야 한다.

인증서는 elasticsearch-certutil를 통해 생성하며 PKCS#12 포맷으로 아래 순서로 진행예정이다.

  • ca 인증서 생성
  • node 인증서 생성
  • http 인증서 생성
관련 참고 : https://www.elastic.co/guide/en/elasticsearch/reference/current/certutil.html

 

ca 인증서 

경로: /usr/share/elasticsearch/

bin/elasticsearch-certutil ca

 

This tool assists you in the generation of X.509 certificates and certificate
signing requests for use with SSL/TLS in the Elastic stack.

...

If you elect to generate PEM format certificates (the -pem option), then the output will
be a zip file containing individual files for the CA certificate and private key

Please enter the desired output file [elastic-stack-ca.p12]: [Enter 입력]
Enter password for elastic-stack-ca.p12 : [패스워드 입력]

ca 인증서의 패스워드는 node 인증서를 만들때 마다 필요하므로 분실되지 않도록 관리에 신경써야 한다.

 

node 인증서

node 인증서는 silent mode로 미리 instances.yml 파일을 만들어 필요한 node들의 인증서를 한번에 생성할 예정이다.

경로 : /usr/share/elasticsearch/

instances.yml 생성

# vim instances.yml
instances:
   - name: 'es-node02'
     dns: [ 'test-ES02' ]
   - name: 'es-kibana01'
     dns: [ 'test-ES04' ]
   - name: 'es-logstash01'
     dns: [ 'test-ES04' ]
elasticsearch node에 사용할 인증서는 한 곳의 node에서 생성하고 같은 인증서로 공유하여 사용할 수 있다.

 

node 인증서 생성

bin/elasticsearch-certutil cert --silent --in instances.yml --out certs.zip --ca elastic-stack-ca.p12

 

Enter password for CA (elastic-stack-ca.p12) : [ca 패스워드 입력]
Enter password for es-node02/es-node02.p12 : [es-node02 패스워드 입력]
Enter password for es-kibana01/es-kibana01.p12 : [es-kibana01 패스워드 입력]
Enter password for es-logstash01/es-logstash01.p12 : [es-logstash01 패스워드 입력]
각 node의 인증서 패스워드는 분실하지 않도록 유의 하여야 한다.

 

node 인증서 확인

unzip certs.zip

 

Archive:  certs.zip
   creating: es-node02/
  inflating: es-node02/es-node02.p12  
   creating: es-kibana01/
  inflating: es-kibana01/es-kibana01.p12  
   creating: es-logstash01/
  inflating: es-logstash01/es-logstash01.p12

 

node 인증서 키 저장소에 암호 추가

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

 

Setting xpack.security.transport.ssl.keystore.secure_password already exists. Overwrite? [y/N] [y 입력]
Enter value for xpack.security.transport.ssl.keystore.secure_password: [패스워드 입력]

 

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

 

Setting xpack.security.transport.ssl.truststore.secure_password already exists. Overwrite? [y/N] [y 입력]
Enter value for xpack.security.transport.ssl.truststore.secure_password: [패스워드 입력]

 

node 인증서 키 저장소 확인

bin/elasticsearch-keystore list

 

autoconfiguration.password_hash
keystore.seed
xpack.security.http.ssl.keystore.secure_password
xpack.security.transport.ssl.keystore.secure_password
xpack.security.transport.ssl.truststore.secure_password

 

node 인증서 패스워드 확인

입력한 패스워드를 확인 할 수 있다.

경로 : /usr/share/elasticsearch

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

 

 

http 인증서

ES node의 Restful API 사용 목적을 중점으로 하여 인증서를 생성 하려 한다. (kibana는 현재 고려대상이 아니다.)

경로 : /usr/share/elasticsearch/

bin/elasticsearch-certutil http

 

## Elasticsearch HTTP Certificate Utility
...
Generate a CSR? [y/N] [N 입력]

## Do you have an existing Certificate Authority (CA) key-pair that you wish to use to sign your certificate?
...
Use an existing CA? [y/N] [Y 입력]

## What is the path to your CA?
...
CA Path: [/usr/share/elasticsearch/elastic-stack-ca.p12 입력]
...
Password for elastic-stack-ca.p12: [ca 인증서 패스워드 입력]

## How long should your certificates be valid?
...
For how long should your certificate be valid? [5y] [유효기간 입력 5Y]

## Do you wish to generate one certificate per node?
...
Generate a certificate per node? [y/N] [각 node의 인증서 개별 생성? N입력]

## Which hostnames will be used to connect to your nodes?
...
Enter all the hostnames that you need, one per line.
When you are done, press <ENTER> once more to move on to the next step.

test-ES01
test-ES02
test-ES03
test-ES04
[관련 hostname이나 도메인 입력]
...
Is this correct [Y/n] [Y 입력]

## Which IP addresses will be used to connect to your nodes?
...
Enter all the IP addresses that you need, one per line.
When you are done, press <ENTER> once more to move on to the next step.

172.16.10.111
172.16.10.112
172.16.10.113
172.16.10.114
[관련 IP 주소 입력]
...
Is this correct [Y/n]Y

## Other certificate options
...
Do you wish to change any of these options? [y/N] [N 입력]

## What password do you want for your private key(s)?
...
If you wish to use a blank password, simply press <enter> at the prompt below.
Provide a password for the "http.p12" file:  [<ENTER> for none] [http 인증서 패스워드 입력]
Repeat password to confirm: [패스워드 확인]

## Where should we save the generated files?
...
What filename should be used for the output zip file? [/usr/share/elasticsearch/elasticsearch-ssl-http.zip] [Enter 입력]

Zip file written to /usr/share/elasticsearch/elasticsearch-ssl-http.zip

 

http 인증서 확인

unzip elasticsearch-ssl-http.zip

 

Archive:  elasticsearch-ssl-http.zip
   creating: elasticsearch/
  inflating: elasticsearch/README.txt  
  inflating: elasticsearch/http.p12  
  inflating: elasticsearch/sample-elasticsearch.yml  
   creating: kibana/
  inflating: kibana/README.txt       
  inflating: kibana/elasticsearch-ca.pem  
  inflating: kibana/sample-kibana.yml

 

http 인증서 키 저장소에 암호 추가

bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password

 

Setting xpack.security.http.ssl.keystore.secure_password already exists. Overwrite? [y/N] [y 입력]
Enter value for xpack.security.http.ssl.keystore.secure_password: [패스워드 입력]

 

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

 

Enter value for xpack.security.http.ssl.truststore.secure_password: [패스워드 입력]

 

http 인증서 키 저장소 확인 

bin/elasticsearch-keystore list

 

autoconfiguration.password_hash
keystore.seed
xpack.security.http.ssl.keystore.secure_password
xpack.security.http.ssl.truststore.secure_password
xpack.security.transport.ssl.keystore.secure_password
xpack.security.transport.ssl.truststore.secure_password

 

http 인증서 패스워드 확인

입력한 패스워드를 확인 할 수 있다.

경로 : /usr/share/elasticsearch

/bin/elasticsearch-keystore show xpack.security.http.ssl.keystore.secure_password
/bin/elasticsearch-keystore show xpack.security.http.ssl.truststore.secure_password



 

인증서 이동

생성된 인증서는 설정과 관리에 용이하도록 ES config 디렉토리에 복사한다.

경로 : /etc/elasticsearch/certs

기존인증서 삭제

rm -rf /etc/elasticsearch/certs/*

 

ca 인증서 이동

cp -arf /usr/share/elasticsearch/elastic-stack-ca.p12 /etc/elasticsearch/certs/

 

node 인증서 이동

cp -arf /usr/share/elasticsearch/es-node02/es-node02.p12 /etc/elasticsearch/certs/

 

http 인증서 이동

cp -arf /usr/share/elasticsearch/elasticsearch/http.p12 /etc/elasticsearch/certs/

 

 

ES configuration

경로 : /etc/elasticsearch/elasticsearch.yml

cluster.name: test-es-cluster
node.name: es-node02
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: ["_local_","_site_"]
http.port: 9200
discovery.seed_hosts: ["test-ES02"]
cluster.initial_master_nodes: ["es-node02"]

xpack.security.enabled: true
xpack.security.enrollment.enabled: true
xpack.security.http.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/http.p12
  truststore.path: certs/http.p12
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/es-node02.p12
  truststore.path: certs/es-node02.p12
  
xpack.monitoring.collection.enabled: true
  • cluster.name : cluster 이름을 설정하며 node들은 cluster 이름이 같으면 같은 cluster로 묶일수 있다.
  • node.name : ES node 이름.
  • path.data : 색인 데이터의 저장 경로. ES 7버전 까지는 다중 경로 지정이 가능했지만 ES 8버전부터는 단일 경로만 가능하다. 즉 ES node 당 하나의 물리디스크를 연결하는 것으로 정책이 변경되는것 같다.
  • path.logs : log 저장 경로.
  • bootstrap.memory_lock : [true|false] ES가 사용하는 heap 영역을 간섭받지 않도록 미리 점유하는 설정.
  • network.host : 바인딩되는 IP 주소로 직접 0.0.0.0 같은 주소 입력이 가능하지만 아래 변수 사용으로 편리하게 설정할 수 있다.
    • _local_ : default 값으로 127.0.0.1,localhost 등 루프백 주소
    • _site_ : 로컬네트워크(인터페이스) 주소
    • _global_ : 네트워크 외부에서 바로보는 주소
  • http.port : ES와 Client 간의 http 통신을 위한 port 번호로 9200번이 default 값이며 이미 점유 중인경우 9200 ~ 9299 사이의 값을 차례로 사용하게 된다.
  • discovery.seed.hosts : cluster로 구성할 node를 명시하는 설정으로  IP나 도메인을 입력할 수 있다. 명시된 node를 찾아 가는 것을 discover 라고 한다.
  • cluster.initial_master_nodes : cluster에서 master node 선출을 위한 node 들을 입력할 수 있다. 선출된 master node 가 장애일 경우 명시된 node 들에게서 다시 master node를 선출 하게 된다.
  • xpack.monitoring.collection.enabled: [true|false] Kibana Stack Monitoring 활성화

 

 

bootstrap.memory_lock: true 옵션은 아래와 같은 에러를 유발한다.

[202...][ERROR][o.e.b.Elasticsearch      ] [es-node02] node validation exception
[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.14/bootstrap-checks.html]
bootstrap check failure [1] of [1]: memory locking requested for elasticsearch process but memory is not locked; for more information see [https://www.elastic.co/guide/en/elasticsearch/reference/8.14/_memory_lock_check.html]

 

해결을 위해 아래와 같은 설정을 추가 한다.

경로 : /usr/lib/systemd/system/elasticsearch.service

[Service]
LimitMEMLOCK=infinity

 

systemctl daemon-reload

 

경로 : /etc/security/limits.conf

elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited

host를 재부팅한다.

 

 

jvm 옵션 설정

경로 : /etc/elasticsearch/jvm.options

-Xms8g
-Xmx8g

host의 물리메모리 절반의 값을 jvm 옵션으로 사용한다.

 

 

ES 서비스를 시작한다.

systemctl start elasticsearch

 

 

ES 사용자 계정 설정

ES 8.x 버전 부터 "elasticsearch-setup-passwords" 로 계정설정이 불가능하다.

대신 "elasticsearch-reset-password" 를 사용하여 계정 별 패스워드를 reset 할 수 있다. 패스워드는 자동으로 주어 진다.

경로 : /usr/share/elasticsearch

bin/elasticsearch-reset-password -u elastic

 

This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y


Password for the [elastic] user successfully reset.
New value: ***************************

New value 의 값을 패스워드로 사용 할 수 있다.

반응형