Dev/Troubleshoot

Elasticsearch 패스워드 설정 방법 with ELK

두넌 2024. 3. 23.

배경

 

Elasticsearch 인덱스가 자꾸 삭제된다면 ?!

배경 프로젝트 진행 중, 효율적인 검색 등 여러 이점을 취하기 위하여 ELK 스택을 프로젝트에 도입하게 되었다 가끔 이틀에 한번씩 계속 인덱스가 삭제되어서, NoSuchIndexException 이 발생하였고 왜

blog.dduneon.me

엘라스틱서치 DB를 해킹? 랜섬웨어 공격? 을 당한 이후에 보안을 적용시켜야 겠다고 생각하였고, 비밀번호를 설정하여 어느정도 보안을 유지하는 방향으로 결정하였다

아래 방법은 docker 환경에서 설정하는 것을 베이스로 하며, 로컬 환경인 경우에도 어느정도 따라할 수 있을 것이다

 

방법

elasticsearch 설정

먼저, 다음 명령어를 실행하여 실행중인 elasticsearch 컨테이너에 접근한다

docker exec -it elasticsearch bash

 

다음 명령어를 통해 elasticsearch.yml 을 열고, 다음 줄을 추가한다

cd config
vi elasticsearch.yml

// 아래 내용을 해당 파일에 추가
xpack.security.enabled: true

 

그 다음, 엘라스틱서치에서 기본적으로 제공하는 패스워드 설정 프로그램이 있는데 이를 실행시켜야 한다

아래 명령어를 통해 홈으로 나간 후, elasticsearch-setup-password 를 실행시킬 수 있다

cd
./bin/elasticsearch-setup-password auto

 

그러면 패스워드가 자동으로 설정될 것이며, 자동으로 적용된 패스워드가 다음과 같이 쉘에 나타날 것이다

아래 보여지는 패스워드를 어딘가에 기록해 둔다! 이후에 설정할 때 쓰이기 때문이다

// **************** 은 패스워드를 임의로 처리한 것이며, 결과는 실제 패스워드가 출력될 것임

Changed password for user apm_system
PASSWORD apm_system = ****************

Changed password for user kibana_system
PASSWORD kibana_system = ****************

Changed password for user kibana
PASSWORD kibana = ****************

Changed password for user logstash_system
PASSWORD logstash_system = ****************

Changed password for user beats_system
PASSWORD beats_system = ****************

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = ****************

Changed password for user elastic
PASSWORD elastic = ****************

 

kibana 설정

만약 위에 설정한 후에 아직 elasticsearch 도커 컨테이너에서 나오지 않았다면, 아래 명령어를 통해 컨테이너 내부에서 나온다

exit

 

이후에는 kibana 컨테이너로 접속할 것이다

위에서 했던 것처럼 똑같은 명령어를 사용하여 kibana 컨테이너 내부로 접속한다

docker exec -it kibana bash

 

이후 kibana.yml 에 elasticsearch 에서 방금 설정했던 username과 password 를 지정해 주기 위하여

다음 명령어를 통해 kibana.yml을 오픈하고, 적힌 두 줄을 입력한다

이미 있다면, 수정하는 방향으로 진행하면 될 것이다

cd config
vi kibana.yml

// 접속 이후 아래 두 줄을 kibana.yml 파일에 입력한다. 이미 있다면 수정한다.
elasticsearch.username: kibana
elasticsearch.password: {password}

 

여기서 나오는 {password} 는 위 setup-password를 완료하고 나온 아래 내용에서 가져와서 적용하면 된다

PASSWORD 뒤 kibana 는 username이고

****** 마스킹된 부분의 내용은 password 이다

...

Changed password for user kibana
PASSWORD kibana = ****************

...

 

여기까지 완료되었다면 elasticsearch, kibana에 password가 적용되었을 것이며,

컨테이너를 재시작 하면 잘 작동하는 지 확인할 수 있을 것이다

docker restart elasticsearch
docker restart kibana

 

아래 엘라스틱서치 서버 주소로 접속 시 사용자 이름과 비밀번호를 입력하는 창이 나올 것이다

http://{elasticsearch 서버 주소}:9200

 

kibana 또한 위 주소로 접근한다면 사용자 이름과 패스워드를 묻는 창이 나올 것이다

 

logstash 설정

logstash 또한 위와 동일하게 컨테이너에 접근하고, 내부에 있는 설정 파일에 저장된 내용을 추가하거나 변경해주면 된다

docker exec -it logstash bash
config/logstash.yml

// 해당 내용을 위 파일에 추가

xpack.monitoring.elasticsearch.hosts: [ "http://{엘라스틱서치 서버 주소}:9200" ]
xpack.monitoring.elasticsearch.username: "elastic"
xpack.monitoring.elasticsearch.password: "{위 지정된 elasticsearch 비밀번호}"

 

위 파일을 수정했으면, pipeline/logstash.conf 파일을 수정하면 된다

아래 output -> elasticsearch 에서 user, password 를 추가해주면 된다

여기서 username이 아니고 user 라는 점을 인지해야 한다!! (이거때문에 엄청 고생했음)

pipeline/logstash.conf

// 위 파일에 아래 내용 추가 (output)
  elasticsearch {
    ...(생략)
    hosts => "http://{엘라스틱서치 서버 주소}:9200"
    user => "elastic"
    password => "{위 설정된 엘라스틱서치 패스워드}"
    ...(생략)
  }

 

이후

일단 위와 같이 한다면, 패스워드 설정은 끝이 났고 logstash에서 데이터를 잘 받아와서 elasticsearch에 넣어주는지만 확인하면 된다

나는 spring-data-elasticsearch 를 프로젝트에서 사용하기 때문에 아래와 같이 프로젝트에서도 설정해 주면 끝이다

 

application.properties

spring.elasticsearch.uris={엘라스틱서치 서버 주소}:9200
spring.elasticsearch.username=elastic
spring.elasticsearch.password={엘라스틱서치 패스워드}

이렇게 해서 데이터를 잘 불러올 수 있게 되었고, 이후에는 아마도? 이런 공격이 발생하지 않을 것 같다

뭐든 보안 이슈를 생각하고, 방어할 수 있도록 구조를 설정하는 것이 중요하다고 느낀 경험이었다

댓글