fluent-plugin-masking 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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: []