x-pack을 이용하여 엘라스틱서치와 키바나에 인증 적용하기
개요
엘라스틱서치/키바나를 사용하며 인증(authentication)을 적용해야 하는 필요성을 느꼈습니다. 그래서 방법을 모색 후 ES 5.x 이상 버전에서 적용 가능한 인증 적용 방법을 정리하여 공유합니다. 아래의 방법은 개인목적이나 소규모의 ES 사용환경에서는 사용할만 할듯 합니다. 중대규모 클러스터나 상용 환경은 관리 측면이나 성능 저하가 없는지 등을 고려해봐야 할듯 합니다.
결론 먼저 소개
ES 5.x 이상에서는 x-pack 플러그인 설치를 통해서 ES와 키바나 인증을 모두 해결할 수 있다.
x-pack 소개
ES 5.x에서 인증을 적용하기 위해서는 x-pack 플러그인 설치가 필요하다. 간단하게 x-pack을 소개하자면 보안, alert, 모니터링, 리포팅, 그래프 관련 기능들을 한데 모아놓은 패키지 플러그인이다. 앞서 언급한 컴포넌트들이 한데 모여 같이 동작하기 때문에 5.x 이상부터 x-pack이라는 이름으로 한번에 설치된다.
ES 5버전 이전부터 ES를 사용해왔다면 사용해봤을만한 shield, watcher, marvel 등으로 컴포넌트들이 흩어져 있어 불편한 것이 x-pack으로 통합되었다.
설치 및 환경설정
ES 플러그인 설치
기존 ES 플러그인 설치법과 동일하게 x-pack을 아래의 커맨드로 설치한다.
1
bin/elasticsearch-plugin install x-pack
아래와 같이 프롬프트가 나오면 y를 선택한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: plugin requires additional permissions @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ * java.lang.RuntimePermission accessClassInPackage.com.sun.activation.registries * java.lang.RuntimePermission getClassLoader * java.lang.RuntimePermission setContextClassLoader * java.lang.RuntimePermission setFactory * java.security.SecurityPermission createPolicy.JavaPolicy * java.security.SecurityPermission getPolicy * java.security.SecurityPermission putProviderProperty.BC * java.security.SecurityPermission setPolicy * java.util.PropertyPermission * read,write * java.util.PropertyPermission sun.nio.ch.bugLevel write * javax.net.ssl.SSLPermission setHostnameVerifier See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html for descriptions of what these permissions allow and the associated risks. Continue with installation? [y/N]y
elasticsearch.yml 설정 변경
만약 es 환경설정에서 action.auto_create_index 기능을 꺼두었다면 ES의 elasticsearch.yml에서 아래의 내용을 변경한다.
따로 설정을 건드린 부분이 없다면 신경쓰지 않아도 된다.
1 2 3 4
$ cd config $ vi elasticsearch.yml ... action.auto_create_index: .security,.monitoring*,.watches,.triggered_watches,.watcher-history*
ES 구동
이제 ES를 실행하면 된다.
1
$ bin/elasticsearch
키바나 플러그인 설치 및 구동
키바나에서도 인증이 필요한 경우 아래와 같이 설치 후 실행하면 된다.
1 2
$ bin/kibana-plugin install x-pack $ bin/kibana
인증 적용 검증하기(ES)
인증이 제대로 동작하는지 확인해보는 간단한 방법은 ES를 구동해보는 것이다.
기본 포트를 사용한다면 아래와 같이 브라우저에서 http://localhost:9200/로 접속해보자.
참고사항
인증 정보를 요구하면 정상 설치 된 것으로 아래의 계정 기본값으로 로그인 할 수 있다. ID : elastic PW : changeme ID : kibana PW : changeme |
인증 적용 검증하기(키바나)
키바나도 구동 후 접속해보면 아래와 같이 인증정보를 요구한다.
계정 환경설정
기본계정 패스워드 변경하기
패스워드를 반드시 변경해야 하는 계정은 elastic과 kibana이다. 모두 기본 패스워드가 changeme로 되어있는데 둘 다 변경해야 한다.
아래와 같이 키바나 메뉴를 이용하여 elastic계정의 비번을 변경하자. 마찬가지로 로그아웃 후 kibana 계정으로도 로그인 후 패스워드를 변경한다.
키바나 패스워드 변경
키바나에서 ES에 접속시 default는 kibana계정 및 기본 패스워드를 사용한다. 하지만 이제 kibana 계정의 비번을 바꾸었으니 계정정보를 kibana.yml에 명시해준다. 이부분을 바꾸지 않으면 키바나 구동 및 ES 접속이 정상동작 하지 않는다.
1 2 3 4
$ vi config/kibana.yml ... elasticsearch.username: "계정명" elasticsearch.password: "패스워드"
키바나 재구동
kibana.yml 수정 후 키바나를 재구동해준다.
1
$ ./bin/kibana
내 계정 생성
기본 계정(elastic, kibana)은 리눅스의 root와 같이 위험 할 수 있으므로 아래와 같이 자신의 계정을 생성한다.
1 2 3 4 5 6 7 8 9 10 11
POST /_xpack/security/user/계정명 { "password" : "패스워드", "roles" : [ "superuser" ], "full_name" : "Kwangsik Lee", "email" : "lks21c@gmail.com", "metadata" : { "intelligence" : 7 }, "enabled": true }
기본 계정 비활성화 하기
보안을 위해 기본 계정(elastic, kibana)은 아래와 같이 비활성화 할 수 있다.
1 2
PUT /_xpack/security/user/elastic/_disable PUT /_xpack/security/user/kibana/_disable
계정 삭제 및 계정 리스트 보기
계정 삭제나 계정 리스트는 아래와 같은 명령어로 확인 할 수 있다.
1 2
DELETE /_xpack/security/user/계정명 GET /_xpack/security/user
자바 클라이언트에 적용
키바나로도 사용을 하지만 자바 클라이언트에서도 이제 ES 접속을 할때 인증을 거쳐야 한다. 아래의 방법은 JavaTrnasportClient를 사용할 때 인증 적용 방법이다.
x-pack 메이븐 의존성 추가
ES 프로젝트에도 인증을 적용하기 위해 관련 메이븐 의존성을 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
<project ...> <repositories> <!-- add the elasticsearch repo --> <repository> <id>elasticsearch-releases</id> <url>https://artifacts.elastic.co/maven</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> ... </repositories> ... <dependencies> <!-- add the x-pack jar as a dependency --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>x-pack-transport</artifactId> <version>${본인의ES버전}</version> </dependency> ... </dependencies> ... </project>
TransportClient 사용하기
아래와 같이 기본 TransportClient를 PreBuiltXPackTransportClient로 변경 후 ID/PW를 지정하면 된다.
1 2 3 4 5 6 7 8
// ES_CLUSTER_NAME, ES_ID, ES_PW, ES_HOST, ES_PORT는 // 상수값으로 직접 지정하여 사용하면 된다. TransportClient client = new PreBuiltXPackTransportClient(Settings.builder() .put("cluster.name", ES_CLUSTER_NAME) .put("xpack.security.user", ES_ID + ":" + ES_PW) .build()) .addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName(ES_HOST), ES_PORT));