如何从 logstash 中的 ruby 过滤器中调用另一个过滤器



我正在构建logstash,并希望构建消息中指定的匿名字段的功能。

给定以下消息,字段fta是要匿名的字段列表。我只想使用%{fta}并将其传递给匿名过滤器,但这似乎不起作用。

{  "containsPII":"True",  "fta":["f1","f2"],  "f1":"test",  "f2":"5551212" }

我的配置如下

 input {
  stdin { codec => json }
}
filter {
  if [containsPII] {
    anonymize {
      algorithm => "SHA1"
      key => "123456789"
      fields => %{fta}
    }
  }
}
output {
  stdout {
    codec => rubydebug
  }
}

输出为

{
    "containsPII" => "True",
            "fta" => [
        [0] "f1",
        [1] "f2"
    ],
             "f1" => "test",
             "f2" => "5551212",
       "@version" => "1",
     "@timestamp" => "2016-07-13T22:07:04.036Z",
           "host" => "..."
}

有人有什么想法吗?在这一点上,我已经尝试了几种排列,但没有运气。

谢谢-D

编辑:在 Elastic 论坛上发帖后,我发现使用基本日志存储功能无法做到这一点。我将尝试改用红宝石过滤器。那么,为了解决我的问题,如何从 ruby 过滤器中调用另一个过滤器?我尝试了以下方法,但没有运气,老实说,我什至不知道该去哪里看。我对红宝石很陌生。

filter {
 if [containsPII] {
    ruby {
      code => "event['fta'].each { |item| event[item] = LogStash::Filters::Anonymize.execute(event[item],'12345','SHA1') }"
      add_tag => ["Rubyrun"]
    }
 }
}

您可以从 ruby 脚本执行过滤器。步骤将是:

  • 在内联 ruby 脚本的 init 块中创建所需的过滤器实例。
  • 对于每个事件,调用筛选器实例的筛选器方法。
  • 以下是上述问题陈述的示例。它将用其 SHA1 替换my_ip字段。
  • 使用红宝石脚本文件也可以实现相同的目标。
  • 下面是示例配置文件。

    input { stdin { codec => json_lines } }
    filter {
      ruby {
        init => "
          require 'logstash/filters/anonymize'
          # Create instance of filter with applicable parameters
          @anonymize = LogStash::Filters::Anonymize.new({'algorithm' => 'SHA1', 
                                                         'key' => '123456789', 
                                                         'fields' => ['my_ip']})
          # Make sure to call register
          @anonymize.register                                                  
        "
        code => "
          # Invoke the filter
          @anonymize.filter(event)
        "
      }
    }
    output { stdout { codec => rubydebug {metadata => true} } }
    

好吧,我无法弄清楚如何从 ruby 过滤器中调用另一个过滤器,但我确实达到了功能目标。

filter {
 if [fta] {
    ruby {
      init => "require 'openssl'"
      code => "event['fta'].each { |item| event[item] = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA256.new, '123456789', event[item] ) }"
    }
 }
}

如果字段 FTA 存在,它将对该数组中列出的每个字段进行 SHA2 编码。

相关内容

  • 没有找到相关文章

最新更新