-
[엘라스틱서치] ElasticSearch & 키바나 시큐리티 기능 구현[IT] 공부하는 개발자/Open Source 2019. 9. 8. 01:48
개요
엘라스틱서치는 6.8 버전부터 시큐리티 기능을 지원한다. 그 전 버전까지는 별도의 인증과정 없이, 리퀘스트를 보내면 바로 리스폰스가 돌아왔는데, 시큐리티 기능을 활성화시키면 리퀘스트에 아이디와 패스워드를 파라미터로 담아 넘겨주어야만 리스폰스가 돌아온다. (혹은 토큰)
엘라스틱서치 시큐리티 인증 설정
1) ElasticSearch 가 설치된 경로 하위의 config 폴더에서 yml 파일을 열고,
xpack.security.enabled: true 를 넣어준다.
$ vi config/elasticsearch.yml #---------------------------# cluster.name: "docker-cluster" network.host: 0.0.0.0 xpack.security.enabled: true
- 라이센스, 작업환경에 따라 https 프로토콜을 활성화 시켜야 하는 경우도 있다. 다중서버를 사용하는 경우 https 프로토콜을 활성화하면 SSL 인증서가 필요한데, 엘라스틱서치는 자체 SSL 인증서 발급 기능을 제공하므로 공인기관(CA)에서 발급받은 SSL이 없어도 https 통신을 구현할 수 있다. 관련 매뉴얼 링크를 문서 하단에 첨부하였다.
2) elasticSearch가 돌고 있다면 중지하고 재실행한 후, bin 폴더에서 elasticsearch-setup-passwords 를 찾아 실행한다.
$ bin/elasticsearch-setup-passwords interactive
Unexpected response code [500] from calling GET http://172.17.0.2:9200/_security/_authenticate?pretty It doesn't look like the X-Pack security feature is enabled on this Elasticsearch node. Please check if you have enabled X-Pack security in your elasticsearch.yml configuration file. ERROR: X-Pack Security is disabled by configuration.
혹시 이런 에러 메시지가 뜬다면, 재실행해주지 않아서 그렇다.
그리고 각 항목에 대한 패스워드를 설정한다. (일단 root id는 elastic인데, 나중에 elastic으로 로그인해서 새 유저 추가, 권한 GRANT 도 가능하다)
4) 이제 잘 설정되었는지 확인해보자. 브라우저를 열어 localhost:9200 로 접속.
패스워드를 요구한다.
아까 설정한 패스워드를 입력하면, 정상 응답을 한다.
kibana 시큐리티 인증 설정
키바나는 엘라스틱서치 데이터의 간편한 조회, 조작이 가능한 GUI 툴이다. 엘라스틱서치에 시큐리티 기능을 활성화시켰다면 kibana도 연동설정을 해주어야 한다.
1) kibana 가 설치된 경로 하위의 config 폴더에서 yml 파일을 열어 엘라스틱서치와 동일한 아이디정보, 패스워드 정보를 추가한다.
$ vi config/kibana.yml #--------------------# #Kibana Security elasticsearch.username: "elastic" elasticsearch.password: "******" xpack.security.encryptionKey: "something_at_least_32_characters" xpack.security.sessionTimeout: 600000
encryptionKey 는 암호화 key로 사용될 스트링이다. 임의로 32자 이상을 넣어준다.
sesionTimeout은 로그인이 유지되는 세션 시간인데, 디폴트는 600000(10분)이다.
2) 키바나를 재시작후, 키바나 디폴트 포트인 5601로 접속. 이제 시큐리티 기능이 활성화되었다.
3) 로그인 후 dev-tools 메뉴를 이용해 새 권한을 가지는 새 유저를 만들어 본다. 우측의 리스폰스 화면에 "created": true 가 출력됨으로써 아이디가 잘 만들어졌음을 확인할수 있다.
mac 유저는 터미널로 9200번 포트로 curl 리퀘스트를 보내서 재확인해보자.
$ curl -i http://localhost:9200/_security/user -uelastic
이제부터 엘라스틱서치는 모든 리퀘스트에 Credential을 실어 보낼 것을 요구한다. 기존에 엘라스틱서치와 통신하는 애플리케이션이 있다면 Credential을 포함하도록 API를 수정할 필요가 있다.
엘라스틱서치 시큐리티 PYTHON API 연동
$ pip install elasticsearch
from elasticsearch import Elasticsearch # Build the connectivity es = Elasticsearch( hosts=[{'host': 'localhost', 'port': 9200}], http_auth=('elastic', '******') ) # Request res = es.search(index='kibana_sample_data_flights', scroll='1m')
권한이 GRANT 되지 않은 credential을 사용하거나 password가 틀린 경우 에러를 낸다.
AuthorizationException: AuthorizationException(403, u'security_exception', u'action [indices:data/read/search] is unauthorized for user [gem1n2]')
엘라스틱서치 시큐리티 JAVA API 연동
#build.gradle dependencies { compile 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.3.1' }
Spring boot와 연동시에는 gradle에 버전정보의 명시적 선언도 꼭 해주어야 한다. (스프링에 내장된 version management 기능때문에 빌드시 에러가 발생한다.) maven도 마찬가지.
ext { set('elasticsearch.version', '7.3.1') }
리퀘스트에 파라미터로 credential 정보를 실어 준다.
RestClientBuilder builder = RestClient.builder( new HttpHost("localhost", 9200)) .setHttpClientConfigCallback(new HttpClientConfigCallback() { @Override public HttpAsyncClientBuilder customizeHttpClient( HttpAsyncClientBuilder httpClientBuilder) { return httpClientBuilder .setDefaultCredentialsProvider(getCredentialsProvider()); } }); public CredentialsProvider getCredentialsProvider(){ CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "*******")); return credentialsProvider; }
ELK 스택 공식 매뉴얼
https://www.elastic.co/guide/en/kibana/current/using-kibana-with-security.html
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.3/_basic_authentication.html
* ROLES : https://www.elastic.co/guide/en/elastic-stack-overview/current/built-in-roles.html
* 키 인증 방식 > SSL 인증서 자체 발급
https://www.elastic.co/kr/blog/elasticsearch-security-configure-tls-ssl-pki-authentication
'[IT] 공부하는 개발자 > Open Source' 카테고리의 다른 글
logstash 'unknown setting *** for jdbc' 에러 메시지 (0) 2020.12.07 [Kafka] 터미널에서 카프카 토픽 생성, 발행, 컨슘하기 (0) 2020.05.07 [도커 + 엘라스틱서치] Docker로 ElasticSearch ELK 스택 디플로이 (0) 2019.08.26 [ElasticSearch 엘라스틱서치] 멀티 필드 맵핑, 정렬과 검색을 동시에 (2) 2019.08.21 NOOK Glowlight plus 누크뿔 크레마 설치하기 [2019년판] (윈도우/맥OS) (2) 2019.08.12