개요
엘라스틱서치/키바나를 사용하며 인증(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을 아래의 커맨드로 설치한다.
아래와 같이 프롬프트가 나오면 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를 실행하면 된다.
키바나 플러그인 설치 및 구동
키바나에서도 인증이 필요한 경우 아래와 같이 설치 후 실행하면 된다.
인증 적용 검증하기(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 접속이 정상동작 하지 않는다.
키바나 재구동
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)은 아래와 같이 비활성화 할 수 있다.
계정 삭제 및 계정 리스트 보기
계정 삭제나 계정 리스트는 아래와 같은 명령어로 확인 할 수 있다.
자바 클라이언트에 적용
키바나로도 사용을 하지만 자바 클라이언트에서도 이제 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));