我正在构建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 编码。