私は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エンドポイントとして公開することができます。
もう1つの方法は、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を公開しないだろうし、私のユーザーは何をしても自分が望むものを何でも作る。特に、集団がESを危機にさらしたり、クラスタを壊滅させたりする方法があります。 –
私の質問の前提が間違っているように見えます。クライアントから送信されたクエリは次のようにラップされます。エラーは ''集計に登録されていません。 ': "{0"、 "size":20、 "query":{"wrapper":{ "query": "json query here"}}} '。私は今まで集合体を動かすことができませんでした。 – geraldhumphries
検索クエリを使用してESを現金化する他の方法について読むことができるように、私はそれらを守ることができる場所(質問にリンクしている出所のほかに)がありますか? – geraldhumphries