2016-08-23 2 views
3

Java/Spring Boot API를 사용하여 AngularJS 앱을 개발 중입니다. Spring Data Elasticsearch를 사용하여 Elasticsearch의 검색 API에 대한 액세스를 제공합니다.응용 프로그램의 API를 통해 직접 Elasticsearch Search API를 노출해도 안전합니까?

Page<Address> page = addressSearchRepository.search(simpleQueryStringQuery(query), pageable); 

변수 query가 사용자의 검색 문자열 예를 들면 다음과 같습니다. pageable은 페이지 번호, 페이지 크기 및 정렬을 지정하는 개체입니다. QueryBuilders을 사용하여 다른 Elasticsearch 쿼리를 작성하고이를 다른 API 엔드 포인트로 표시 할 수 있습니다.

또 다른 옵션은 QueryBuilders.wrapperQuery을 사용하고 JavaScript에서 직접 Elasticsearch 쿼리를 보내는 것입니다. 여기 jsonQuery 전체 Elasticsearch 쿼리를 포함하는 문자열이 어디 예입니다

Page<Address> page = addressSearchRepository.search(wrapperQuery(jsonQuery), pageable); 

이 인증 된 사용자 만 액세스 할 수있는 안전한 엔드 포인트가 될 것입니다. 이것은 Elasticsearch 색인의 Search API를 직접 노출하는 것과 같습니다. 인덱스의 모든 데이터가 사용자에게 안전하게 표시된다고 가정하면 이것이 보안 위험입니까? 내 연구에서

지금까지 나는 쿼리를 사용하여 Elasticsearch 충돌하는 것이 가능할 수 있음을 발견했습니다,하지만 최신 버전에서 문제의 큰되지 않습니다 : https://www.elastic.co/blog/found-crash-elasticsearch#arbitrary-large-size-parameter

어쩌면 페이지 크기를 제한하거나 페이지 크기가 매우 클 때 스캔 및 스크롤 API를 사용하면이를 줄일 수 있습니다.

필자는 스크립트 필드를 피해야한다는 것을 알고 있지만 기본적으로 비활성화되어 있습니다 (v1.4.3 기준).

+1

Elastic 팀은 다른 회로 차단기를 구현하고 특정 유형의 쿼리 및 집계에 기본 제한을 추가하려고합니다. 그러나 사용자가 모든 쿼리에 대한 전체 액세스 권한을 갖고있는 동안 사용자가 ES를 크래킹하지 않도록하려는 경우 충돌이 발생할 수있는 방법이 있다고 생각합니다.저는 ES와 le을 노출시키지 않을 것입니다. 내 사용자는 그들이 작성한 쿼리를 통해 원하는대로 수행합니다. 특히 ES가 절름발이이거나 클러스터를 무력화시킬 수있는 집계가있는 방법이 있습니다. –

+0

내 질문의 전제가 틀린 것 같습니다. 클라이언트가 보낸 쿼리는 다음과 같이 래핑됩니다. '집계에 대한 쿼리가 없습니다': "{0", "size": 20, "query": { "wrapper": { "query": "json query here"}}}'. 지금까지 집계를 실행할 수 없었습니다. – geraldhumphries

+0

검색 쿼리를 사용하여 ES를 현금으로 바꾸는 다른 방법에 대해 읽을 수있는 장소가 있습니까 (내가 질문에 링크 된 출처는 제외). – geraldhumphries

답변

3

수행 방법을 알고 있다면 여전히 Elasticsearch를 중단시킬 수 있습니다. 예를 들어, 10 개의 깊게 중첩 된 집계를 작성하기 시작하면 아주 잘 돌아가 휴식을 취할 수 있습니다. 그것은 많은 시간이 걸리거나 매우 비쌉니다. 많은 양의 메모리를 사용하고, JVM이 가비지 콜렉션을 많이 수행하게합니다. (기본적으로 JVM에서 실행되는 다른 모든 스레드는 정지됩니다.) 소량의 메모리를 회수합니다. 이 방법으로 클러스터가 응답하지 않을 수 있습니다.

집계를 가져 와서 10 개의 중첩 된 집계를 만들면 클러스터를 손상시킬 수는 없지만 일반적인 상황에서는 클러스터가 특정 SLA 용으로 구축되고 특정 양의 데이터를 처리합니다. (예 : terms on analyzed 문자열 필드) 노드에 대해 매우 높은 계산량을 갖습니다.

노드가 메모리가 부족하지는 않지만 노드가 거의 응답하지 않을 수 있습니다.

탄성의 팀은 implement other circuit breakersadd default limits to certain types of queries and aggregations (막대한 작업)을 시도하고 있습니다. 그러나 사용자가 모든 쿼리에 대한 전체 액세스 권한을 갖고있는 동안 사용자가 ES를 크래킹하지 않도록하려는 경우 충돌이 발생할 수있는 방법이 있다고 생각합니다. 필자는 개인적으로 ES를 노출시키지 않고 사용자가 작성한 쿼리를 통해 원하는대로 수행 할 것입니다.

당신의 wrapper 구성 방법에 따라, 나는 단지 내 사용자에게 질의/집계의 특정 유형을 허용 것 그리고 사람들을 위해 나는 (그 쿼리 제한을 받아 /aggs 적용) 일부 제한을 둘 것입니다.

관련 문제