Elastic 集成过滤器插件

编辑

Elastic 集成过滤器插件

编辑
  • 插件版本: v0.1.16
  • 发布日期: 2024-10-30
  • 变更日志

有关其他版本,请参阅版本化插件文档

获取帮助

编辑

有关插件的问题,请在Discuss论坛中开一个主题。对于错误或功能请求,请在Github中开一个 issue。有关 Elastic 支持的插件列表,请参阅Elastic 支持矩阵

描述

编辑

使用此过滤器在 Logstash 中处理由 Elasticsearch Ingest Node 驱动的 Elastic 集成。

当您配置此过滤器以指向 Elasticsearch 集群时,它会检测应为每个事件执行哪个 ingest 管道(如果有),使用明确定义的 pipeline_name 或自动检测事件的数据流及其默认管道。

然后,它从 Elasticsearch 加载该管道的定义,并在 Logstash 中运行该管道,而无需将事件传输到 Elasticsearch。由其 ingest 管道成功处理的事件将 [@metadata][target_ingest_pipeline] 设置为 _none,以便 Logstash 管道中的任何下游 Elasticsearch 输出都将避免在 Elasticsearch 中再次运行事件的默认管道。

某些多管道配置(例如通过 http(s) 的 logstash-to-logstash)不维护 [@metadata] 字段的状态。在这些设置中,您可能需要使用 pipeline => "_none" 显式配置下游管道的 Elasticsearch 输出,以避免重新运行默认管道。

未能进行 ingest 管道处理的事件将被标记为 _ingest_pipeline_failure,并且它们的 [@metadata][_ingest_pipeline_failure] 将填充详细信息作为键/值映射。

此插件需要最低 Java 17 和 Logstash 8.7.0 版本。

filter-elastic_integrationoutput-elasticsearch 一起使用

编辑

Elastic 集成旨在与数据流与 ECS 兼容的输出一起使用。请确保在output-elasticsearch插件中启用这些功能。

请查看output-elasticsearch 插件文档以了解其他设置。

最小配置

编辑

您需要配置此插件以连接到 Elasticsearch,并且可能还需要提供本地 GeoIp 数据库。

filter {
  elastic_integration {
    cloud_id   => "YOUR_CLOUD_ID_HERE"
    cloud_auth => "YOUR_CLOUD_AUTH_HERE"
    geoip_database_directory => "/etc/your/geoip-databases"
  }
}

请继续阅读配置指南,或跳转到配置选项完整列表

连接到 Elasticsearch

编辑

此插件与 Elasticsearch 通信以确定应为给定事件运行哪个 ingest 管道,并检索 ingest 管道定义本身。您必须配置此插件以使用以下其中一种方式指向 Elasticsearch

  • Cloud Id(请参阅cloud_id
  • 一个或多个主机 URL 的列表(请参阅hosts

除非您显式配置此插件,否则通信将通过 SSL 安全地进行。

您可能需要配置此插件如何建立对响应的服务器的信任,并且可能需要配置此插件如何呈现其自身的身份或凭据。

SSL 信任配置

编辑

通过 SSL 通信时,此插件使用系统信任存储完全验证 Elasticsearch 提供的身份证明。您可以使用以下其中一种方式提供备用信任源

您还可以配置验证身份证明的哪些方面(请参阅ssl_verification_mode)。

SSL 身份配置

编辑

通过 SSL 通信时,您还可以配置此插件,以使用以下其中一种方式向其连接的 Elasticsearch 集群提供基于证书的身份证明

请求身份

编辑

您可以配置此插件以通过以下几种方式之一向 Elasticsearch 提供身份验证凭据

您的请求凭据的安全性仅与传递它们的连接一样安全。它们本身既不提供隐私也不提供保密,并且在禁用 SSL 时很容易被对手恢复。

最低所需权限

编辑

此插件与 Elasticsearch 通信以将事件解析为管道定义,并且需要使用具有适当权限的凭据进行配置,以便从相关的 API 中读取。在启动阶段,此插件会确认当前用户是否具有足够的权限,包括

权限名称 描述

monitor

用于集群操作(例如集群运行状况或状态)的只读权限。插件在检查 Elasticsearch 许可证时需要它。

read_pipeline

对 ingest 管道的只读获取和模拟访问。当插件读取 Elasticsearch ingest 管道定义时,需要此权限。

manage_index_templates

对索引模板的所有操作权限。当插件根据事件数据流名称解析默认管道时,需要此权限。

当插件连接到已禁用安全功能的 Elasticsearch 集群或用户未提供凭据时,此插件无法确定匿名用户是否具有所需的权限。该插件以不安全模式启动,并显示运行时错误,指示 API 权限不足,并阻止 ingest 管道处理事件。

为了避免这些问题,请设置用户身份验证并确保启用 Elasticsearch 中的安全性(默认)。

支持的 Ingest 处理器

编辑

此过滤器可以运行完全由支持的处理器子集组成的 Elasticsearch Ingest Node 管道。它可以访问 Painless 和 Mustache 脚本引擎(如果适用)

来源 处理器 注意事项

Ingest Common

append

bytes

communityid

convert

csv

date

dateindexname

dissect

dotexpander

drop

fail

fingerprint

foreach

grok

gsub

htmlstrip

join

json

keyvalue

lowercase

networkdirection

pipeline

解析的管道必须完全由支持的处理器组成

registereddomain

remove

rename

reroute

script

lang 必须为 painless(默认)

set

sort

split

trim

uppercase

uri_parts

urldecode

user_agent

不支持侧加载自定义正则表达式文件;处理器将使用 Elasticsearch 处理器定义中指定的默认用户代理定义。

Redact

redact

GeoIp

geoip

需要 MaxMind GeoIP2 数据库,这些数据库可以由 Logstash 的 Geoip 数据库管理提供,或者使用 geoip_database_directory 进行配置

字段映射

编辑

在执行期间,Ingest 管道使用一个称为 ingest 文档的 Logstash 事件的临时可变视图。此视图包含事件中所有结构化的字段,并进行最少的类型转换。

它还包含 ingest 管道处理器所需的其他元数据字段

  • _version: 一个 long 类型整数值,等效于事件的 @version,或一个合理的默认值 1
  • _ingest.timestamp: 一个 ZonedDateTime 类型值,等效于事件的 @timestamp 字段

执行完成后,会对事件进行清理,以确保 Logstash 保留字段具有预期的形状,并为任何缺失的必需字段提供合理的默认值。当 ingest 管道将保留字段设置为无法强制转换的值时,该值将按如下所述在事件的备用位置中提供。

Logstash 字段 类型

@timestamp

时间戳

Ingest 文档的 @timestampevent.created_ingest.timestamp_now 字段的第一个可强制转换的值;或者当前时间戳。当 ingest 文档的 @timestamp 具有无法强制转换的值时,它将在事件的 _@timestamp 字段中提供。

@version

字符串编码的整数

Ingest 文档的 @version_version 字段的第一个可强制转换的值;或者当前时间戳。当 ingest 文档的 @version 具有无法强制转换的值时,它将在事件的 _@version 字段中提供。

@metadata

键/值映射

Ingest 文档的 @metadata;或者一个空映射。当 ingest 文档的 @metadata 具有无法强制转换的值时,它将在事件的 _@metadata 字段中提供。

tags

一个字符串或一个字符串列表

Ingest 文档的 tags。当 ingest 文档的 tags 具有无法强制转换的值时,它将在事件的 _tags 字段中提供。

此外,这些 Elasticsearch IngestDocument 元数据字段只有在管道执行期间设置时才会在生成的事件中提供

Elasticsearch 文档元数据 Logstash 字段

_id

[@metadata][_ingest_document][id]

_index

[@metadata][_ingest_document][index]

_routing

[@metadata][_ingest_document][routing]

_version

[@metadata][_ingest_document][version]

_version_type

[@metadata][_ingest_document][version_type]

_ingest.timestamp

[@metadata][_ingest_document][timestamp]

解析管道定义

编辑

此插件使用 Elasticsearch 将管道名称解析为其管道定义。当配置没有显式的 pipeline_name 时,或者当管道使用重定向处理器时,它还会使用 Elasticsearch 来建立数据流名称与其各自默认管道名称的映射关系。

它使用命中/未命中缓存来避免为每个事件查询 Elasticsearch。它还会努力在这些缓存的映射过期之前更新它们。结果是,当 Elasticsearch 响应迅速时,此插件能够快速获取更改而不会影响其自身的性能,并且它可以承受 Elasticsearch 问题的时期,而不会因继续使用可能过时的映射或定义而中断。

为了实现这一点,映射最多缓存 24 小时,并且缓存的值每 1 分钟重新加载一次,效果如下:

  • 当重新加载的映射为非空,并且与其已缓存的值相同时,它的生存时间会重置,以确保后续事件可以继续使用已确认未更改的值
  • 当重新加载的映射为非空,并且与之前缓存的值不同时,条目会更新,以便后续事件将使用新值
  • 当重新加载的映射为空时,之前的非空映射将替换为一个新的空条目,以便后续事件将使用空值
  • 当映射的重新加载失败时,此插件会发出日志警告,但现有的缓存条目不会更改,并且会更接近其过期时间。

Elastic Integration 过滤器配置选项

编辑

此插件支持以下配置选项以及稍后描述的 通用选项

api_key

编辑
  • 值类型为 密码
  • 此设置没有默认值。

用于向 Elasticsearch 验证此插件的 API 密钥的编码形式。

cloud_auth

编辑
  • 值类型为 密码
  • 此设置没有默认值。

云身份验证字符串(“<username>:<password>”格式)是 username/password 对的替代方案,可以从 Elastic Cloud Web 控制台中获取。

cloud_id

编辑
  • 值类型为 字符串
  • 此设置没有默认值。
  • 不能与 `ssl_enabled⇒false` 组合使用。

云 ID,来自 Elastic Cloud Web 控制台。

使用云 ID 连接时,与 Elasticsearch 的通信将使用 SSL 进行保护。

有关更多详细信息,请查看 Logstash 到云的文档

geoip_database_directory

编辑
  • 值类型为 路径
  • 此设置没有默认值。

在启用 Geoip 数据库管理的 Logstash 进程中运行时,使用 Geoip 处理器的集成将默认使用托管的 Maxmind 数据库。使用托管数据库即表示您接受并同意 MaxMind EULA

您也可以使用包含数据库文件的本地目录的路径配置此插件。

此插件将发现所提供目录中所有带有 .mmdb 后缀的常规文件,并通过其文件名使其在集成管道中的 GeoIp 处理器中可用。它希望找到的文件采用 MaxMind DB 格式,并具有以下数据库类型之一:

  • AnonymousIp
  • ASN
  • City
  • Country
  • ConnectionType
  • Domain
  • Enterprise
  • Isp

大多数集成都依赖于确切命名为以下名称的数据库:

  • GeoLite2-ASN.mmdb,
  • GeoLite2-City.mmdb
  • GeoLite2-Country.mmdb

hosts

编辑
  • 值类型是 uri 的列表
  • 此设置没有默认值。
  • 约束

    • 当任何 URL 包含协议组件时,所有 URL 必须具有彼此相同的协议。
    • https 协议主机使用 HTTPS,不能与 ssl_enabled => false 组合使用。
    • http 协议主机使用不安全的 HTTP,不能与 ssl_enabled => true 组合使用。
    • 当任何 URL 省略端口组件时,将使用默认值 9200
    • 当任何 URL 包含路径组件时,所有 URL 必须具有彼此相同的路径。

要连接的非空 Elasticsearch 主机列表。

示例

  • "127.0.0.1"
  • ["127.0.0.1:9200","127.0.0.2:9200"]
  • ["http://127.0.0.1"]
  • ["https://127.0.0.1:9200"]
  • ["https://127.0.0.1:9200/subpath"](如果在子路径上使用代理)

使用主机列表连接时,除非另行配置,否则与 Elasticsearch 的通信将使用 SSL 进行保护。

禁用 SSL 是危险的

此插件的安全性依赖于 SSL,以避免泄漏凭据并避免运行非法的 ingest 管道定义。

有两种方法可以禁用 SSL

  • 提供一个 http 协议主机列表
  • 设置 <<plugins-{type}s-{plugin}-ssl_enabled>>=>false

password

编辑
  • 值类型为 密码
  • 此设置没有默认值。
  • 当使用 username 配置请求身份验证时,此项为必需项

使用 HTTP 基本身份验证连接到 Elasticsearch 时的密码。

pipeline_name

编辑
  • 值类型为 字符串
  • 此设置没有默认值。
  • 如果存在,则不会从事件的数据流字段自动检测事件的初始管道。
  • 值可以是 sprintf 样式的模板;如果无法解析任何引用的字段,则事件将不会路由到 ingest 管道。

ssl_certificate

编辑

用于向 Elasticsearch 标识此插件的 PEM 编码证书或证书链的路径。

ssl_certificate_authorities

编辑
  • 值类型是 path 的列表
  • 此设置没有默认值。
  • 不能与禁用 SSL 的配置组合使用
  • 不能与 `ssl_verification_mode⇒none` 组合使用。

定义证书颁发机构的一个或多个 PEM 格式文件。

此设置可用于覆盖系统信任存储,以验证 Elasticsearch 提供的 SSL 证书。

ssl_enabled

编辑
  • 值类型为 布尔值
  • 此设置没有默认值。

除非显式禁用,否则启用与 Elasticsearch 的安全 SSL 通信

  • 使用 ssl_enabled => false 显式禁用;或者
  • 通过提供 http 协议的 hosts 隐式禁用。

指定 ssl_enabled => true 可以作为有用的冗余安全措施,以确保此插件无法配置为使用非 SSL 通信。

ssl_key

编辑
  • 值类型为 路径
  • 此设置没有默认值。
  • 当使用 ssl_certificate 配置连接身份时,此项为必需项
  • 不能与禁用 SSL 的配置组合使用

PKCS8 格式的 SSL 证书密钥的路径。

ssl_keystore_password

编辑
  • 值类型为 密码
  • 此设置没有默认值。
  • 当使用 ssl_keystore_path 配置连接身份时,此项为必需项
  • 不能与禁用 SSL 的配置组合使用

ssl_keystore_path 的密码。

ssl_keystore_path

编辑
  • 值类型为 路径
  • 此设置没有默认值。
  • 当存在此项时,ssl_keystore_password 也是必需项。
  • 不能与禁用 SSL 的配置组合使用

用于向 Elasticsearch 标识此插件的 JKS 或 PKCS12 格式的密钥库的路径。

ssl_key_passphrase

编辑
  • 值类型为 密码
  • 此设置没有默认值。
  • 当使用 ssl_certificate 配置连接身份时,此项为必需项
  • 不能与禁用 SSL 的配置组合使用

ssl_key 的密码或口令。

ssl_truststore_path

编辑

JKS 或 PKCS12 格式的密钥库的路径,其中存放受信任的证书。

此设置可用于覆盖系统信任存储,以验证 Elasticsearch 提供的 SSL 证书。

ssl_truststore_password

编辑
  • 值类型为 密码
  • 此设置没有默认值。
  • 当使用 ssl_truststore_path 配置连接信任时,此项为必需项
  • 不能与禁用 SSL 的配置组合使用

ssl_truststore_path 的密码。

ssl_verification_mode

编辑
  • 值类型为 字符串
  • 此设置没有默认值。
  • 不能与禁用 SSL 的配置组合使用

Elasticsearch 提供的证书的验证级别。

默认情况下,将完全验证 Elasticsearch 提供的 SSL 证书。

  • 可用模式

    • none:不执行验证,隐式信任此插件连接的任何服务器(不安全)
    • certificate:验证服务器提供的证书是否由受信任的证书颁发机构签名,以及服务器是否可以证明拥有其关联的私钥(安全性较低)
    • full(默认):执行与 certificate 相同的验证,并验证提供的证书是否具有与我们要尝试连接的服务器匹配的身份声明(最安全)

username

编辑
  • 值类型为 字符串
  • 此设置没有默认值。
  • 当存在此项时,password 也是必需项。

当使用 HTTP 基本身份验证连接到 Elasticsearch 时使用的用户名。

 

通用选项

编辑

所有过滤器插件都支持这些配置选项

add_field

编辑
  • 值类型为 哈希
  • 默认值为 {}

如果此过滤器成功,则将任意字段添加到此事件。字段名称可以是动态的,并使用 %{field} 包含事件的一部分。

示例

    filter {
      elastic_integration {
        add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }
      }
    }
    # You can also add multiple fields at once:
    filter {
      elastic_integration {
        add_field => {
          "foo_%{somefield}" => "Hello world, from %{host}"
          "new_field" => "new_static_value"
        }
      }
    }

如果事件具有字段 "somefield" == "hello",则此过滤器在成功时,如果存在字段 foo_hello,则会添加该字段,其值为上面的值,并且 %{host} 部分将替换为事件中的该值。第二个示例还将添加硬编码的字段。

add_tag

编辑
  • 值类型为 数组
  • 默认值为 []

如果此过滤器成功,则将任意标签添加到事件。标签可以是动态的,并使用 %{field} 语法包含事件的一部分。

示例

    filter {
      elastic_integration {
        add_tag => [ "foo_%{somefield}" ]
      }
    }
    # You can also add multiple tags at once:
    filter {
      elastic_integration {
        add_tag => [ "foo_%{somefield}", "taggedy_tag"]
      }
    }

如果事件具有字段 "somefield" == "hello",则此过滤器在成功时,将添加标签 foo_hello (第二个示例当然会添加 taggedy_tag 标签)。

enable_metric

编辑

禁用或启用此特定插件实例的指标日志记录。默认情况下,我们会记录所有可用的指标,但您可以禁用特定插件的指标收集。

  • 值类型为 字符串
  • 此设置没有默认值。

向插件配置添加唯一的 ID。如果未指定 ID,Logstash 将生成一个。强烈建议在配置中设置此 ID。当您有两个或多个相同类型的插件时,这尤其有用,例如,如果您有 2 个 elastic_integration 过滤器。在这种情况下添加命名 ID 将有助于在使用监控 API 时监控 Logstash。

    filter {
      elastic_integration {
        id => "ABC"
      }
    }

id 字段中的变量替换仅支持环境变量,不支持使用来自秘密存储的值。

periodic_flush

编辑

定期调用过滤器刷新方法。可选。

remove_field

编辑
  • 值类型为 数组
  • 默认值为 []

如果此过滤器成功,则从事件中删除任意字段。字段名称可以是动态的,并使用 %{field} 包含事件的一部分。示例

    filter {
      elastic_integration {
        remove_field => [ "foo_%{somefield}" ]
      }
    }
    # You can also remove multiple fields at once:
    filter {
      elastic_integration {
        remove_field => [ "foo_%{somefield}", "my_extraneous_field" ]
      }
    }

如果事件具有字段 "somefield" == "hello",则此过滤器在成功时,如果存在名称为 foo_hello 的字段,则会删除该字段。第二个示例将删除一个额外的、非动态的字段。

remove_tag

编辑
  • 值类型为 数组
  • 默认值为 []

如果此过滤器成功,则从事件中删除任意标签。标签可以是动态的,并使用 %{field} 语法包含事件的一部分。

示例

    filter {
      elastic_integration {
        remove_tag => [ "foo_%{somefield}" ]
      }
    }
    # You can also remove multiple tags at once:
    filter {
      elastic_integration {
        remove_tag => [ "foo_%{somefield}", "sad_unwanted_tag"]
      }
    }

如果事件具有字段 "somefield" == "hello",则此过滤器在成功时,如果存在标签 foo_hello,则会删除该标签。第二个示例也会删除一个不想要的、令人伤心的标签。