スクリプトとセキュリティ
Painless と Elasticsearch は、スクリプトを安全に実行するための深層防御戦略を構築するために、セキュリティの層を実装しています。
Painless は、詳細な許可リストを使用しています。許可リストに含まれないものは、コンパイルエラーになります。この機能は、スクリプトのための深層防御戦略における最初のセキュリティ層です。
セキュリティの第二の層は、Java Security Managerです。Elasticsearch の起動シーケンスの一部として、Java Security Manager を有効にして、コードの一部が実行できるアクションを制限します。Painless は、スクリプトがファイルを書き込んだりソケットをリッスンしたりすることを防ぐための追加の防御層として Java Security Manager を使用します。
Elasticsearch は、Linux では seccomp、macOS では Seatbelt、Windows では ActiveProcessLimit を使用して、Elasticsearch がフォークしたり他のプロセスを実行したりするのを防ぐための追加のセキュリティ層を提供します。
最後に、scripted metrics aggregations で使用されるスクリプトは、定義されたスクリプトのリストに制限するか、完全に禁止することができます。これにより、ユーザーが特に遅いまたはリソースを多く消費する集約クエリを実行するのを防ぐことができます。
スクリプトが実行できるタイプを制限し、スクリプトが実行できる利用可能な contexts を制御するために、以下のスクリプト設定を変更できます。深層防御戦略に追加の層を実装するには、Elasticsearch セキュリティ原則 に従ってください。
許可されたスクリプトタイプの設定
Elasticsearch は、2 つのスクリプトタイプをサポートしています: inline
と stored
。デフォルトでは、Elasticsearch は両方のタイプのスクリプトを実行するように設定されています。実行されるスクリプトのタイプを制限するには、script.allowed_types
を inline
または stored
に設定します。すべてのスクリプトの実行を防ぐには、script.allowed_types
を none
に設定します。
Kibana を使用している場合は、script.allowed_types
を両方または inline
のみに設定します。一部の Kibana 機能はインラインスクリプトに依存しており、Elasticsearch がインラインスクリプトを許可しない場合、期待通りに機能しません。
たとえば、inline
スクリプトを実行するが stored
スクリプトを実行しない場合:
Yaml
script.allowed_types: inline
許可されたスクリプトコンテキストの設定
デフォルトでは、すべてのスクリプトコンテキストが許可されています。script.allowed_contexts
設定を使用して、許可されるコンテキストを指定します。許可されるコンテキストがないことを指定するには、script.allowed_contexts
を none
に設定します。
たとえば、scoring
と update
コンテキストでのみスクリプトを実行できるようにするには:
Yaml
script.allowed_contexts: score, update
スクリプト化されたメトリクス集約における許可されたスクリプト
デフォルトでは、すべてのスクリプトが scripted metrics aggregations で許可されています。許可されるスクリプトのセットを制限するには、search.aggs.only_allowed_metric_scripts
を true
に設定し、search.aggs.allowed_inline_metric_scripts
および/または search.aggs.allowed_stored_metric_scripts
を使用して許可されるスクリプトを提供します。
特定のスクリプトタイプを禁止するには、対応するスクリプトリスト (search.aggs.allowed_inline_metric_scripts
または search.aggs.allowed_stored_metric_scripts
) を省略するか、空の配列に設定します。両方のスクリプトリストが空でない場合、指定されたストアドスクリプトと指定されたインラインスクリプトが許可されます。
以下の例では、特定の 4 つのストアドスクリプトのみが使用を許可され、インラインスクリプトは許可されません:
Yaml
search.aggs.only_allowed_metric_scripts: true
search.aggs.allowed_inline_metric_scripts: []
search.aggs.allowed_stored_metric_scripts:
- script_id_1
- script_id_2
- script_id_3
- script_id_4
逆に、次の例では特定のインラインスクリプトは許可されますが、ストアドスクリプトは許可されません:
Yaml
search.aggs.only_allowed_metric_scripts: true
search.aggs.allowed_inline_metric_scripts:
- 'state.transactions = []'
- 'state.transactions.add(doc.some_field.value)'
- 'long sum = 0; for (t in state.transactions) { sum += t } return sum'
- 'long sum = 0; for (a in states) { sum += a } return sum'
search.aggs.allowed_stored_metric_scripts: []