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 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
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fluent-plugin-masking.gemspec
4
+ gemspec
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
@@ -0,0 +1,7 @@
1
+ # in Rakefile
2
+ require 'rake/testtask'
3
+ Rake::TestTask.new(:test) do |test|
4
+ test.libs << 'lib' << 'test'
5
+ test.pattern = 'test/**/test_*.rb'
6
+ test.verbose = true
7
+ end
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
@@ -0,0 +1,3 @@
1
+ email
2
+ first_name
3
+ last_name
@@ -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: []