脚本和安全
edit脚本和安全
editPainless 和 Elasticsearch 实现了多层安全措施,以构建深度防御策略,确保安全运行脚本。
Painless 使用细粒度的允许列表。任何不在允许列表中的内容都会导致编译错误。这一功能是深度防御策略中脚本安全的第一层。
第二层安全机制是Java 安全管理器。作为其启动序列的一部分,Elasticsearch 启用了 Java 安全管理器,以限制代码部分可以执行的操作。Painless 使用 Java 安全管理器作为额外的防御层,以防止脚本执行诸如写入文件和监听套接字等操作。
Elasticsearch 在 Linux 中使用 seccomp, 在 macOS 中使用 Seatbelt, 在 Windows 中使用 ActiveProcessLimit 作为额外的安全层,以防止 Elasticsearch 进行分叉或运行其他进程。
最后,用于 脚本化指标聚合 的脚本可以被限制在定义的脚本列表中,或者完全禁止。 这可以防止用户运行特别慢或资源密集型的聚合查询。
您可以修改以下脚本设置,以限制允许运行的脚本类型,并控制脚本可以运行的可用上下文。为了在您的纵深防御策略中实施额外的层次,请遵循Elasticsearch安全原则。
允许的脚本类型设置
editElasticsearch 支持两种脚本类型:inline 和 stored。默认情况下,Elasticsearch 配置为运行这两种脚本。要限制运行哪种类型的脚本,请将 script.allowed_types 设置为 inline 或 stored。要阻止任何脚本运行,请将 script.allowed_types 设置为 none。
如果你使用 Kibana,将 script.allowed_types 设置为 inline。
一些 Kibana 功能依赖于内联脚本,如果 Elasticsearch 不允许内联脚本,这些功能将无法正常工作。
例如,运行inline脚本但不运行stored脚本:
script.allowed_types: inline
允许的脚本上下文设置
edit默认情况下,所有脚本上下文都是允许的。使用 script.allowed_contexts 设置来指定允许的上下文。要指定不允许任何上下文,请将 script.allowed_contexts 设置为 none。
例如,仅允许脚本在scoring和update上下文中运行:
script.allowed_contexts: score, update
允许在脚本化指标聚合中使用的脚本
edit默认情况下,所有脚本都允许在
脚本化指标聚合中使用。
要限制允许的脚本集,请将
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个特定的存储脚本,并且不允许使用内联脚本:
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
相反,下一个示例允许特定的内联脚本,但不允许存储的脚本:
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: []