19 7월 2016 엔지니어링

Elasticsearch 5.0에서 사이트 플러그인 실행

By Clinton Gormley

Elasticsearch 0.17로 거슬러 가면 Elasticsearch에 정적 웹 페이지 서비스 기능이 탑재되고 사이트 플러그인 이 탄생했습니다. 사용자는 사이트 플러그인을 사용하여 Elasticsearch에 그래픽 사용자 인터페이스를 제공하는 Javascript 애플리케이션을 작성할 수 있었습니다.

이는 Elasticsearch 통계 모니터링, 인덱스 관리, 세그먼트 병합 시각화, 분석기 디버그, Clustering 등을 위한 다양한 플러그인 개발로 이어졌습니다.

현재 가장 많이 사용되는 사이트 플러그인은 HeadKopf이며, 둘 다 인덱스 관리와 모니터링을 결합한 것이 특징입니다.

지금까지 좋은 소식이었습니다. 이제 나쁜 소식을 이야기 할 차례입니다...

Elasticsearch 5.0에서 사이트 플러그인 지원 중단

자주 사용되는 사이트 플러그인 기능을 Elasticsearch에서 제거하는 이유가 무엇일까요?

Elasticsearch는 웹 서버로 작동하도록 설계되지 않았습니다. 정적 파일을 서비스하는 것은 Elasticsearch가 제공하는 HTTP REST 인터페이스 위해 간단히 추가한 일종의 편법이었습니다. 그런데 정적 파일 서비스에 어떤 유해성이 있을까요? 정적 파일 서비스 자체가 유해한 것으로 나타났고 있습니다. Elasticsearch에서 지금까지 발견된 7개 보안 취약점 중 2개가 사이트 플러그인과 관련되었습니다. 이는 상당한 비율로, 필수 기능이 아닌 경우 특히 그러합니다. 반면, 나머지 취약점 중 2개는 동적 스크립팅이 원인이었으며, 이 문제의 해결을 위해 Elastic은 완전히 새로운 스크립팅 언어를 개발했습니다!

Elasticsearch가 이제 Java Security Manager 아래에서 실행됩니다. Elasticsearch 코어의 최소 기본 실행을 위해 필요로 하던 권한에 제한을 두었습니다. 최저 코드 조각에 대한 파일 액세스와 권한 상향을 더욱 제한하기 위해 코어의 기능을 모듈로 옮기고 있습니다. 이러한 모든 조치를 취하는 이유는 제로데이 취약점을 노리는 해커의 악용 가능성을 차단하기 위해서입니다.

비필수 기능을 위해 웹 서버를 실행하는 것은 이러한 목표에 부합되지 않습니다.

더욱이 Elasticsearch에 웹 애플리케이션을 호스팅하는 것은 Elasticsearch를 인터넷에 노출시키는 바람직하지 못한 관례를 장려하는 효과를 낳게 됩니다. Elasticsearch는 분리된 보안 네트워크에 실행하는 것이 바람직합니다.

Elasticsearch 5.0에서 사이트 플러그인 실행

Head, Kopf (곧 Cerebro로 대체 예정), HQ 와 같은 자주 사용되는 사이트 플러그인에는 Elasticsearch 밖에서 실행하기 위한 명령이 이미 포함되어 있기 때문에, 사용자가 쉽게 이를 수행할 수 있습니다. 사이트 플러그인은 정적 HTML, Javascript, CSS 및 이미지 파일로 구성되며, 이들은 로컬 사용을 위한 Python의 SimpleHTTPServer를 포함하여 사용자가 원하는 웹 서버로 서비스 가능합니다.

cd my_plugin/
python -m SimpleHTTPServer 8000

사이트 플러그인은 사용자의 브라우저에서 Elasticsearch에 직접 요청을 하므로 Elasticsearch에서 교차 출처 리소스 공유(Cross Origin Resource Sharing)를 허용하도록 명령하려면 약간의 구성이 필요합니다.

예를 들어 elasticsearch.yml 구성 파일에 다음을 추가할 수 있습니다.

http.cors.enabled: true
http.cors.allow-origin: /https?:\/\/localhost(:[0-9]+)?/

allow-origin 설정은 사이트 플러그인을 호스팅하는 웹 서버 주소와 일치하는 정규식이어야 합니다. CORS 설정에 대한 자세한 내용은 HTTP 모듈 문서를 참조하십시오.

Elasticsearch 서버가 X-Pack (5.0에서 Shield를 대체함)의 보안 기능을 사용하는 경우에는 다음 설정도 추가해야 합니다.

http.cors.allow-credentials: true
http.cors.allow-headers: X-Requested-With,X-Auth-Token,Content-Type, Content-Length, Authorization

사이트 플러그인 이상

정적 웹 파일이 포함된 애플리케이션 작성의 제한을 벗어나려는 플러그인 작성자는 대신 Kibana 플러그인 개발을 고려해볼 수 있습니다.

Kibana에는 Node.js 웹 서버가 함께 제공되며 플러그인에 서버측 기능을 포함할 수 있습니다. 예를 들어 Elasticsearch에 대한 모든 호출을 사용자 브라우저가 아닌 Kibana 백엔드 서버에서 직접 수행할 수 있습니다.

또한 고유한 플러그인 개발을 시작할 수 있도록 도와주는 Kibana 플러그인 생성기와 개발 과정을 설명하는 Elastic{ON}16 동영상 도 제공됩니다. 언제나 마찬가지로 IRC포럼 에서 Kibana 개발자들에게 궁금한 점을 물어볼 수 있습니다.