개요

엘라스틱서치/키바나를 사용하며 인증(authentication)을 적용해야 하는 필요성을 느꼈습니다. 그래서 방법을 모색 후 ES 5.1.1(5.x 이상에서 동일) 버전에서 적용 가능한 인증 적용 방법을 정리하여 공유합니다.

결론 먼저 소개

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을 아래의 커맨드로 설치한다.

$ bin/elasticsearch-plugin install x-pack

아래와 같이 프롬프트가 나오면 y를 선택한다.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     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에서 아래의 내용을 변경한다.

$ cd config
$ vi elasticsearch.yml
...
action.auto_create_index: .security,.monitoring*,.watches,.triggered_watches,.watcher-history*

ES 구동

이제 ES를 실행하면 된다.

$ bin/elasticsearch

키바나 플러그인 설치 및 구동

키바나에서도 인증이 필요한 경우 아래와 같이 설치 후 실행하면 된다.

$ bin/kibana-plugin install x-pack
$ bin/kibana

인증 적용 검증하기(ES)

인증이 제대로 동작하는지 확인해보는 간단한 방법은 ES를 구동해보는 것이다.

기본 포트를 사용한다면 아래와 같이 브라우저에서 http://localhost:9200/로 접속해보자.

참고사항
인증 정보를 요구하면 정상 설치 된 것으로 아래의 계정 기본값으로 로그인 할 수 있다.
ID : elastic
PW : changeme
ID : kibana
PW : changeme

인증 적용 검증하기(키바나)

키바나도 구동 후 접속해보면 아래와 같이 인증정보를 요구한다.

계정 환경설정

기본계정 패스워드 변경하기

패스워드를 반드시 변경해야 하는 계정은 elastickibana이다. 모두 기본 패스워드가 changeme로 되어있는데 둘 다 변경해야 한다.

아래와 같이 키바나 메뉴를 이용하여 elastic계정의 비번을 변경하자. 마찬가지로 로그아우 후 kibana 계정으로도 로그인 후 패스워드를 변경한다.

키바나 패스워드 변경

키바나에서 ES에 접속시 default는 kibana계정 및 기본 패스워드를 사용한다. 하지만 이제 kibana 계정의 비번을 바꾸었으니 계정정보를 kibana.yml에 명시해준다. 이부분을 바꾸지 않으면 키바나 구동 및 ES 접속이 정상동작 하지 않는다.

$ vi config/kibana.yml
...
elasticsearch.username: "계정명"
elasticsearch.password: "패스워드"

키바나 재구동

kibana.yml 수정 후 키바나를 재구동해준다.

내 계정 생성

기본 계정(elastic, kibana)은 리눅스의 root와 같이 위험 할 수 있으므로 아래와 같이 자신의 계정을 생성한다.

POST /_xpack/security/user/계정명
{
  "password" : "패스워드",
  "roles" : [ "superuser" ],
  "full_name" : "Kwangsik Lee",
  "email" : "lks21c@gmail.com",
  "metadata" : {
  "intelligence" : 7
},
  "enabled": true
}

기본 계정 비활성화 하기

보안을 위해 기본 계정(elastic, kibana)은 아래와 같이 비활성화 할 수 있다.

PUT /_xpack/security/user/elastic/_disable

PUT /_xpack/security/user/kibana/_disable

계정 삭제 및 계정 리스트 보기

계정 삭제나 계정 리스트는 아래와 같은 명령어로 확인 할 수 있다.

DELETE /_xpack/security/user/계정명

GET /_xpack/security/user

자바 클라이언트에 적용

키바나로도 사용을 하지만 자바 클라이언트에서도 이제 ES 접속을 할때 인증을 거쳐야 한다. 아래의 방법은 JavaTrnasportClient를 사용할 때 인증 적용 방법이다.

x-pack 메이븐 의존성 추가

ES 프로젝트에도 인증을 적용하기 위해 관련 메이븐 의존성을 추가한다.

<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를 지정하면 된다.

// 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));