fluent-plugin-masking 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +55 -0
- data/Rakefile +7 -0
- data/fluent-plugin-masking-1.0.0.gem +0 -0
- data/fluent-plugin-masking-1.0.1.gem +0 -0
- data/fluent-plugin-masking.gemspec +25 -0
- data/lib/fluent/plugin/filter_masking.rb +70 -0
- data/test/fields-to-mask +3 -0
- data/test/test_filter_masking.rb +90 -0
- metadata +130 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 737c2cddcc0b796becb417b194c5ac9a8d25dc540125c81c8e9f1f4ae90c67fc
|
4
|
+
data.tar.gz: 15d0092825ca7b06b4d844f9d68042a56d081cf15f70327deddc06e63458c586
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f956ccf1112547d5d1a4a9ef29368c6719cf7b67c5b57e1c2f95540067774e1d06a5fad3d55b5f2282d36ea68a14f1e098dcc7b704e4ba653d5d3a248e081d19
|
7
|
+
data.tar.gz: 71eb6075664087bb1d600b5fedf7be4d9fedea8c8e6f98516f1e8b19661198d7dc44de6aaf5e6e3956a24426b1cc827d909150109c393553d33910aad8508f47
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
fluent-plugin-masking (1.0.0)
|
5
|
+
fluentd (>= 0.14.0, < 2)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
cool.io (1.5.4)
|
11
|
+
dig_rb (1.0.1)
|
12
|
+
fluentd (1.6.3)
|
13
|
+
cool.io (>= 1.4.5, < 2.0.0)
|
14
|
+
dig_rb (~> 1.0.0)
|
15
|
+
http_parser.rb (>= 0.5.1, < 0.7.0)
|
16
|
+
msgpack (>= 0.7.0, < 2.0.0)
|
17
|
+
serverengine (>= 2.0.4, < 3.0.0)
|
18
|
+
sigdump (~> 0.2.2)
|
19
|
+
strptime (>= 0.2.2, < 1.0.0)
|
20
|
+
tzinfo (~> 1.0)
|
21
|
+
tzinfo-data (~> 1.0)
|
22
|
+
yajl-ruby (~> 1.0)
|
23
|
+
http_parser.rb (0.6.0)
|
24
|
+
msgpack (1.3.1)
|
25
|
+
power_assert (1.1.5)
|
26
|
+
rake (12.3.3)
|
27
|
+
rr (1.2.1)
|
28
|
+
serverengine (2.1.1)
|
29
|
+
sigdump (~> 0.2.2)
|
30
|
+
sigdump (0.2.4)
|
31
|
+
strptime (0.2.3)
|
32
|
+
test-unit (3.3.3)
|
33
|
+
power_assert
|
34
|
+
test-unit-rr (1.0.5)
|
35
|
+
rr (>= 1.1.1)
|
36
|
+
test-unit (>= 2.5.2)
|
37
|
+
thread_safe (0.3.6)
|
38
|
+
tzinfo (1.2.5)
|
39
|
+
thread_safe (~> 0.1)
|
40
|
+
tzinfo-data (1.2019.2)
|
41
|
+
tzinfo (>= 1.0.0)
|
42
|
+
yajl-ruby (1.4.1)
|
43
|
+
|
44
|
+
PLATFORMS
|
45
|
+
ruby
|
46
|
+
|
47
|
+
DEPENDENCIES
|
48
|
+
bundler
|
49
|
+
fluent-plugin-masking!
|
50
|
+
rake (~> 12.0)
|
51
|
+
test-unit (>= 3.1.0)
|
52
|
+
test-unit-rr
|
53
|
+
|
54
|
+
BUNDLED WITH
|
55
|
+
2.0.2
|
data/Rakefile
ADDED
Binary file
|
Binary file
|
@@ -0,0 +1,25 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = "fluent-plugin-masking"
|
6
|
+
spec.version = "1.0.2"
|
7
|
+
|
8
|
+
spec.authors = ["Shai Moria", "Niv Lipetz"]
|
9
|
+
spec.email = ["shai.moria@zooz.com", "niv.lipetz@zooz.com"]
|
10
|
+
spec.description = "Fluentd Filter plugin to mask given fields in messages"
|
11
|
+
spec.summary = "Fluentd Filter plugin to mask given fields in messages"
|
12
|
+
spec.homepage = "https://github.com/zooz"
|
13
|
+
|
14
|
+
spec.files = `git ls-files`.split($\)
|
15
|
+
spec.require_paths = ["lib"]
|
16
|
+
spec.license = "Apache-2.0"
|
17
|
+
|
18
|
+
spec.required_ruby_version = '>= 2.1'
|
19
|
+
|
20
|
+
spec.add_runtime_dependency "fluentd", ">= 0.14.0", "< 2"
|
21
|
+
spec.add_development_dependency "bundler"
|
22
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
23
|
+
spec.add_development_dependency "test-unit", ">= 3.1.0"
|
24
|
+
spec.add_development_dependency "test-unit-rr"
|
25
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'fluent/filter'
|
2
|
+
|
3
|
+
module Fluent
|
4
|
+
module Plugin
|
5
|
+
class MaskingFilter < Filter
|
6
|
+
Fluent::Plugin.register_filter("masking", self) # for "@type masking" in configuration
|
7
|
+
|
8
|
+
MASK_STRING = "*******"
|
9
|
+
|
10
|
+
def strToHash(str)
|
11
|
+
eval(str)
|
12
|
+
end
|
13
|
+
|
14
|
+
# returns the masked record
|
15
|
+
# error safe method - if any error occurs
|
16
|
+
# the original record is return
|
17
|
+
def maskRecord(record)
|
18
|
+
maskedRecord = record
|
19
|
+
|
20
|
+
begin
|
21
|
+
recordStr = record.to_s
|
22
|
+
|
23
|
+
@fields_to_mask.each do | fieldToMask |
|
24
|
+
recordStr = recordStr.gsub(/"#{fieldToMask}"=>.+?((?=,\s\")|(?=}{1}$))/m, "\"#{fieldToMask}\"=>\"#{MASK_STRING}\"")
|
25
|
+
end
|
26
|
+
|
27
|
+
maskedRecord = strToHash(recordStr)
|
28
|
+
|
29
|
+
rescue Exception => e
|
30
|
+
$log.error "Failed to mask record: #{e}"
|
31
|
+
end
|
32
|
+
|
33
|
+
maskedRecord
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize
|
37
|
+
super
|
38
|
+
@fields_to_mask = []
|
39
|
+
end
|
40
|
+
|
41
|
+
# this method only called ones (on startup time)
|
42
|
+
def configure(conf)
|
43
|
+
super
|
44
|
+
fieldsToMaskFilePath = conf['fieldsToMaskFilePath']
|
45
|
+
|
46
|
+
File.open(fieldsToMaskFilePath, "r") do |f|
|
47
|
+
f.each_line do |line|
|
48
|
+
|
49
|
+
value = line.to_s # make sure it's string
|
50
|
+
value = value.gsub(/\s+/, "") # remove spaces
|
51
|
+
value = value.gsub('\n', '') # remove line breakers
|
52
|
+
|
53
|
+
@fields_to_mask.push(value)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
puts "black list fields:"
|
58
|
+
puts @fields_to_mask
|
59
|
+
end
|
60
|
+
|
61
|
+
def filter(tag, time, record)
|
62
|
+
# This method implements the filtering logic for individual filters
|
63
|
+
# It is internal to this class and called by filter_stream unless
|
64
|
+
# the user overrides filter_stream.
|
65
|
+
maskRecord(record)
|
66
|
+
end
|
67
|
+
|
68
|
+
end # end of MaskingFilter class definition
|
69
|
+
end
|
70
|
+
end # end of 'module Fluent' definition
|
data/test/fields-to-mask
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# test/plugin/test_filter_your_own.rb
|
2
|
+
|
3
|
+
require "test-unit"
|
4
|
+
require "fluent/test"
|
5
|
+
require "fluent/test/driver/filter"
|
6
|
+
require "fluent/test/helpers"
|
7
|
+
require "/Users/nivlipetz/Documents/sre/logs-infra/fluentd-docker/custom-plugins/filter_masking.rb"
|
8
|
+
|
9
|
+
MASK_STRING = "*******"
|
10
|
+
|
11
|
+
class YourOwnFilterTest < Test::Unit::TestCase
|
12
|
+
def setup
|
13
|
+
Fluent::Test.setup # this is required to setup router and others
|
14
|
+
end
|
15
|
+
|
16
|
+
# default configuration for tests
|
17
|
+
CONFIG = %[
|
18
|
+
fieldsToMaskFilePath test/fields-to-mask
|
19
|
+
]
|
20
|
+
|
21
|
+
def create_driver(conf = CONFIG)
|
22
|
+
Fluent::Test::Driver::Filter.new(Fluent::Plugin::MaskingFilter).configure(conf)
|
23
|
+
end
|
24
|
+
|
25
|
+
def filter(config, messages)
|
26
|
+
d = create_driver(config)
|
27
|
+
d.run(default_tag: "input.access") do
|
28
|
+
messages.each do |message|
|
29
|
+
d.feed(message)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
d.filtered_records
|
33
|
+
end
|
34
|
+
|
35
|
+
# sub_test_case 'configured with invalid configuration' do
|
36
|
+
# test 'empty configuration' do
|
37
|
+
# assert_raise(Fluent::ConfigError) do
|
38
|
+
# create_driver('')
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
|
42
|
+
# test 'param1 should reject too short string' do
|
43
|
+
# conf = %[
|
44
|
+
# param1 a
|
45
|
+
# ]
|
46
|
+
# assert_raise(Fluent::ConfigError) do
|
47
|
+
# create_driver(conf)
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
# # ...
|
51
|
+
# end
|
52
|
+
|
53
|
+
sub_test_case 'plugin will mask all fields that need masking' do
|
54
|
+
test 'mask first_name and last_name' do
|
55
|
+
conf = CONFIG
|
56
|
+
messages = [
|
57
|
+
{ "first_name" => "mickey", "last_name" => "the-dog" }
|
58
|
+
]
|
59
|
+
expected = [
|
60
|
+
{ "first_name" => MASK_STRING, "last_name" => MASK_STRING }
|
61
|
+
]
|
62
|
+
filtered_records = filter(conf, messages)
|
63
|
+
assert_equal(expected, filtered_records)
|
64
|
+
end
|
65
|
+
|
66
|
+
test 'mask only email' do
|
67
|
+
conf = CONFIG
|
68
|
+
messages = [
|
69
|
+
{ "not_masked_field" => "mickey-the-dog", "email" => "mickey-the-dog@zooz.com" }
|
70
|
+
]
|
71
|
+
expected = [
|
72
|
+
{ "not_masked_field" => "mickey-the-dog", "email" => MASK_STRING }
|
73
|
+
]
|
74
|
+
filtered_records = filter(conf, messages)
|
75
|
+
assert_equal(expected, filtered_records)
|
76
|
+
end
|
77
|
+
|
78
|
+
test 'mask nothing' do
|
79
|
+
conf = CONFIG
|
80
|
+
messages = [
|
81
|
+
{ "not_masked_field_1" => "mickey-the-dog", "not_masked_field_2" => "nully_the_carpet" }
|
82
|
+
]
|
83
|
+
expected = [
|
84
|
+
{ "not_masked_field_1" => "mickey-the-dog", "not_masked_field_2" => "nully_the_carpet" }
|
85
|
+
]
|
86
|
+
filtered_records = filter(conf, messages)
|
87
|
+
assert_equal(expected, filtered_records)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
metadata
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-masking
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Shai Moria
|
8
|
+
- Niv Lipetz
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2019-08-14 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: fluentd
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.14.0
|
21
|
+
- - "<"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '2'
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 0.14.0
|
31
|
+
- - "<"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2'
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: bundler
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
type: :development
|
42
|
+
prerelease: false
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rake
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '12.0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '12.0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: test-unit
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 3.1.0
|
69
|
+
type: :development
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 3.1.0
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: test-unit-rr
|
78
|
+
requirement: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
description: Fluentd Filter plugin to mask given fields in messages
|
91
|
+
email:
|
92
|
+
- shai.moria@zooz.com
|
93
|
+
- niv.lipetz@zooz.com
|
94
|
+
executables: []
|
95
|
+
extensions: []
|
96
|
+
extra_rdoc_files: []
|
97
|
+
files:
|
98
|
+
- Gemfile
|
99
|
+
- Gemfile.lock
|
100
|
+
- Rakefile
|
101
|
+
- fluent-plugin-masking-1.0.0.gem
|
102
|
+
- fluent-plugin-masking-1.0.1.gem
|
103
|
+
- fluent-plugin-masking.gemspec
|
104
|
+
- lib/fluent/plugin/filter_masking.rb
|
105
|
+
- test/fields-to-mask
|
106
|
+
- test/test_filter_masking.rb
|
107
|
+
homepage: https://github.com/zooz
|
108
|
+
licenses:
|
109
|
+
- Apache-2.0
|
110
|
+
metadata: {}
|
111
|
+
post_install_message:
|
112
|
+
rdoc_options: []
|
113
|
+
require_paths:
|
114
|
+
- lib
|
115
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '2.1'
|
120
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
requirements: []
|
126
|
+
rubygems_version: 3.0.4
|
127
|
+
signing_key:
|
128
|
+
specification_version: 4
|
129
|
+
summary: Fluentd Filter plugin to mask given fields in messages
|
130
|
+
test_files: []
|