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 기준).
Elastic 팀은 다른 회로 차단기를 구현하고 특정 유형의 쿼리 및 집계에 기본 제한을 추가하려고합니다. 그러나 사용자가 모든 쿼리에 대한 전체 액세스 권한을 갖고있는 동안 사용자가 ES를 크래킹하지 않도록하려는 경우 충돌이 발생할 수있는 방법이 있다고 생각합니다.저는 ES와 le을 노출시키지 않을 것입니다. 내 사용자는 그들이 작성한 쿼리를 통해 원하는대로 수행합니다. 특히 ES가 절름발이이거나 클러스터를 무력화시킬 수있는 집계가있는 방법이 있습니다. –
내 질문의 전제가 틀린 것 같습니다. 클라이언트가 보낸 쿼리는 다음과 같이 래핑됩니다. '집계에 대한 쿼리가 없습니다': "{0", "size": 20, "query": { "wrapper": { "query": "json query here"}}}'. 지금까지 집계를 실행할 수 없었습니다. – geraldhumphries
검색 쿼리를 사용하여 ES를 현금으로 바꾸는 다른 방법에 대해 읽을 수있는 장소가 있습니까 (내가 질문에 링크 된 출처는 제외). – geraldhumphries