ElasticSearch Cluster 암호 걸기

Halim Kim·2021년 5월 19일
0

ElasticSearch

목록 보기
3/4

X-Pack은 ElasticSearch의 Plugin이며 보안 기능이 추가되어 있다. 이전 버전에서는 따로 설치를 해야했지만 현재 버전(7.12)에서는 ElasticSearch를 설치하면 X-Pack도 포함이 되어 있다.

그래서 따로 플러그인을 설치할 필요없이 몇가지 작업을 해주면 ElasticSearch Cluster에 암호를 설정할 수 있고, User나 Role을 설정해서 User마다 Index, Cluster에 대한 접근 제한을 할 수 있다.

TLS 구성

먼저 Node마다 인증서가 필요하다. 다른 프로그램으로 인증서를 생성해도 되지만 ElasticSearch에서도 인증서를 만들어주는 기능이 있다. ElasticSearch의 bin 디렉토리가 있는 곳(/usr/share/elasticsearch)로 가서 아래의 명령어로 인증서를 생성한다.

bin/elasticsearch-certutil cert -out /etc/elasticsearch/elastic-certificates.p12 -pass ""

맨끝에 -pass "" 이 부분은 인증서의 비밀번호 설정이며 ""로 집어넣었기 때문에 비밀번호가 없는 것이다. -pass ""를 넣지않으면 인증서 비밀번호를 입력하라는 프롬프트가 뜬다.

참고 : Java version이 9 이전 버전이라면 인증서 생성을 할 수 없을 것이다. (인증서를 생성하는 알고리즘이 구현이 안되어 있는 것으로 추정) JDK를 업데이트하면 해결될 것이다.

Datanode에도 MasterNode에서 만든 인증서를 복사해서 같은 위치에 넣어주면 된다. SSH을 통한 통신으로 원격 서버에 인증서를 보내줄 수 있다.

$ scp <파일명(/etc/elasticsearch/elastic-certificates.p12)> <user@hostip>:<도착할 위치(/tmp)>

권한 문제 때문에 인증서가 도착할 원격 서버의 File Path는 /tmp로 하고 원격 서버에 SSH로 접속한 뒤에 Root User로 들어가 다시 /etc/elasticsearch directory로 옮겨주었다.

elasticsearch.yml 파일

인증서를 생성했으니 이제 elasticsearch.yml 파일도 TLS 통신을 하도록 설정을 해주어야 한다.

아래의 parameter들을 elasticsearch.yml 파일에 넣어주면 된다. xpack의 security 기능들을 사용하도록 설정한 것이다.

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12


yml 파일을 수정했으면 ElasticSearch를 재시작한다.

$ sudo systemctl restart elasticsearch.service

그러나 위의 Parameter들을 추가하고, ElasticSearch를 재실행하면 아래와 같은 Error 메세지가 뜰 것이다.

Job for elasticsearch.service failed because the control process exited with error code.
See "systemctl status elasticsearch.service" and "journalctl -xe" for details.

이유를 확인하려고 Log를 확인하였더니 원인은 Permission이었다.

참고 : Log는 /var/log/elasticsearch/<클러스터이름>.log를 확인하면 될 것이다.

위의 사진을 보면 인증서 파일만 Group에 권한이 없는 것을 확인할 수 있다. 다른 파일들과 권한을 같게 만들어주었다.

$ chmod g+rw elastic-certificates.p12

그리고 Elasticsearch를 재시작하면 정상적으로 작동할 것이다.

Cluster 비밀번호 설정

Master Node와 Data Node가 다시 실행되었으면, Cluster의 비밀번호를 설정해야 한다. 비밀번호 설정은 Master Node에서 한다.

아래의 명령어를 입력하면 랜덤한 비밀번호를 자동으로 설정해준다.

$ bin/elasticsearch-setup-passwords auto

parameter를 interactive로 하면 직접 비밀번호를 입력하여 설정할 수도 있다. Test에서는 interactive를 선택해서 비밀번호를 작성하였다.

$ bin/elasticsearch-setup-passwords interactive

이 명령어를 실행하면 elasticsearch만 아니라 Kibana나 logstash의 비밀번호도 설정하라는 프롬프트가 뜨는데 모두 동일한 비밀번호를 설정해주었다.

참고 : Cluster에 Datanode가 없거나 Masternode가 없는데 위의 명령어를 사용하면 에러가 뜰 것이다. 즉 Node간 연결이 이뤄지지 않았을 가능성이 있으니 확인해볼 것


비밀번호를 설정 후 elasticsearch에 접속을 시도하면 위와 같이 Username과 Password를 입력하라는 팝업창이 뜬다. (계정명은 elastic이다.)

Basic Auth

HTTP 인증 방식에는 여러가지가 있지만 일단 테스트에서는 가장 기본적인 Basic Auth를 사용해보았다. 보낼 때만 암호화를 하기 때문에 스니핑에 취약하다고 한다.

User 추가

ElasticSearch의 xpack을 사용하면 User와 Role을 부여해 User마다 Role을 부여해 접근 권한을 제한할 수 있다.

Elasticsearch의 REST API를 사용해서도 User와 Role을 추가할 수도 있지만, 아직 익숙하지 않아 Kibana를 이용해 GUI로 Test를 진행해보았다.

Kibana를 설치하고 elastic 계정으로 접속을 하면 왼쪽 하단에 톱니바퀴 모양의 아이콘이 보일텐데 그 아이콘을 클릭하면 Elasticsearch를 관리하는 옵션들이 나온다.

그리고 관리 항목 중 Security 항목의 Users를 클릭하면 User들의 목록을 볼 수 있고 User를 새로 만들어 줄 수도 있다. 테스트를 위해 test라는 user를 생성해보았다.

user를 생성했지만 아직 접근 권한을 제한할 Role을 만들지 않았기 때문에 user에 Role은 부여하지 않았다.

Role 부여

Role도 User와 같이 Security 항목에 위치해있다.

Roles를 클릭하고 Create Role을 클릭한 뒤에 test-role이라는 Role을 만들어주었다.

아래의 Add index privilege 버튼을 눌러 test-role을 nutch라는 index을 읽을 수만 있게 권한을 부여해주었다.

그 뒤에 아까 만들어준 test라는 user에 test-role을 부여해주었다.

User로 인증 후 검색

보안 기능을 활성화 했기 때문에 이제 ElasticSearch REST API를 이용하려면 Authorization header가 추가로 필요하다.

Postman의 Authorization 항목을 보면 Header를 추가할 수 있다. 일단 index가 어떤 것이 있는지 확인하기 위해 elastic 계정으로 인증하여 Request를 보냈다.

보안 기능을 활성화해서 생긴 Index를 제외하면 직접 생성한 index는 nutch와 test 하나이다.

이 중에서 test index는 test user에게 읽을 수 있는 권한을 주지 않았기 때문에 결과를 받을 수 없을 것이다.

반면에 nutch index는 test라는 user에게 읽기 권한을 주었기 때문에 검색이 잘 된다.

profile
나는 하림

0개의 댓글