スクリプトとセキュリティ

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 つのスクリプトタイプをサポートしています: inlinestored。デフォルトでは、Elasticsearch は両方のタイプのスクリプトを実行するように設定されています。実行されるスクリプトのタイプを制限するには、script.allowed_typesinline または stored に設定します。すべてのスクリプトの実行を防ぐには、script.allowed_typesnone に設定します。

Kibana を使用している場合は、script.allowed_types を両方または inline のみに設定します。一部の Kibana 機能はインラインスクリプトに依存しており、Elasticsearch がインラインスクリプトを許可しない場合、期待通りに機能しません。

たとえば、inline スクリプトを実行するが stored スクリプトを実行しない場合:

Yaml

  1. script.allowed_types: inline

許可されたスクリプトコンテキストの設定

デフォルトでは、すべてのスクリプトコンテキストが許可されています。script.allowed_contexts 設定を使用して、許可されるコンテキストを指定します。許可されるコンテキストがないことを指定するには、script.allowed_contextsnone に設定します。

たとえば、scoringupdate コンテキストでのみスクリプトを実行できるようにするには:

Yaml

  1. script.allowed_contexts: score, update

スクリプト化されたメトリクス集約における許可されたスクリプト

デフォルトでは、すべてのスクリプトが scripted metrics aggregations で許可されています。許可されるスクリプトのセットを制限するには、search.aggs.only_allowed_metric_scriptstrue に設定し、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

  1. search.aggs.only_allowed_metric_scripts: true
  2. search.aggs.allowed_inline_metric_scripts: []
  3. search.aggs.allowed_stored_metric_scripts:
  4. - script_id_1
  5. - script_id_2
  6. - script_id_3
  7. - script_id_4

逆に、次の例では特定のインラインスクリプトは許可されますが、ストアドスクリプトは許可されません:

Yaml

  1. search.aggs.only_allowed_metric_scripts: true
  2. search.aggs.allowed_inline_metric_scripts:
  3. - 'state.transactions = []'
  4. - 'state.transactions.add(doc.some_field.value)'
  5. - 'long sum = 0; for (t in state.transactions) { sum += t } return sum'
  6. - 'long sum = 0; for (a in states) { sum += a } return sum'
  7. search.aggs.allowed_stored_metric_scripts: []