logjam_agent 0.38.2 → 0.38.3
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 +4 -4
- data/lib/logjam_agent/obfuscation.rb +40 -0
- data/lib/logjam_agent/rack/logger.rb +4 -9
- data/lib/logjam_agent/version.rb +1 -1
- data/lib/logjam_agent.rb +2 -20
- data/test/obfuscator_test.rb +28 -0
- data/test/sinatra_app.rb +5 -0
- data/test/sinatra_classic_app.rb +3 -0
- data/test/sinatra_classic_test.rb +4 -1
- data/test/sinatra_test.rb +6 -1
- data/test/test_helper.rb +3 -0
- metadata +5 -170
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c18943a93c4707c1d5c8aa2b92925ac997fbd98fc08f9c4c58f9eb485c98f02
|
4
|
+
data.tar.gz: e38d8c87ca688037a860a3b4af69d54f255f575d6cd3d5ca8b31e8bb0ff1639b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f9eead24427fed2fac91181599f75a87a5389b913b5a9a6042b4ebcfb27ffa7af213f76127182d7d05078bde22cbf3e431f414b86ca27ef8490175e761da60c
|
7
|
+
data.tar.gz: f2a10234aea2f2402da52686c9500e2591d852d9757d267032fda58366650aead11b621eb4d0681819acfdfebd3c0d6010329e60758644dbada17f4106c6654b
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module LogjamAgent
|
2
|
+
module Obfuscation
|
3
|
+
|
4
|
+
mattr_accessor :obfuscate_ips
|
5
|
+
self.obfuscate_ips = false
|
6
|
+
|
7
|
+
# TODO: ipv6 obfuscation
|
8
|
+
def ip_obfuscator(ip)
|
9
|
+
obfuscate_ips ? ip.to_s.sub(/\d+\z/, 'XXX') : ip
|
10
|
+
end
|
11
|
+
|
12
|
+
mattr_accessor :obfuscated_cookies
|
13
|
+
self.obfuscated_cookies = [/_session\z/]
|
14
|
+
|
15
|
+
def cookie_obfuscator
|
16
|
+
@cookie_obfuscator ||= ParameterFilter.new(obfuscated_cookies)
|
17
|
+
end
|
18
|
+
|
19
|
+
begin
|
20
|
+
# rails 6.1 and higher
|
21
|
+
require "active_support/parameter_filter"
|
22
|
+
ParameterFilter = ::ActiveSupport::ParameterFilter
|
23
|
+
rescue LoadError
|
24
|
+
# rails 6.0 and older
|
25
|
+
require "action_dispatch/http/parameter_filter"
|
26
|
+
ParameterFilter = ::ActionDispatch::Http::ParameterFilter
|
27
|
+
end
|
28
|
+
|
29
|
+
KEY_RE = '[^&;=\s]+'
|
30
|
+
VAL_RE = '[^&;=]+'
|
31
|
+
PAIR_RE = %r{(#{KEY_RE})=(#{VAL_RE})}
|
32
|
+
|
33
|
+
def filter_pairs(str, filter)
|
34
|
+
str.gsub(PAIR_RE) do |_|
|
35
|
+
filter.filter($1 => $2).first.join("=")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -216,8 +216,7 @@ module LogjamAgent
|
|
216
216
|
CONTENT_LENGTH = 'CONTENT_LENGTH'
|
217
217
|
COOKIE = 'HTTP_COOKIE'
|
218
218
|
|
219
|
-
|
220
|
-
PAIR_RE = %r{(#{KV_RE})=(#{KV_RE})}
|
219
|
+
include Obfuscation
|
221
220
|
|
222
221
|
def extract_headers(request, filter)
|
223
222
|
headers = request.env.reject{|k,v| k =~ HIDDEN_VARIABLES }
|
@@ -225,15 +224,11 @@ module LogjamAgent
|
|
225
224
|
headers = filter.filter(headers)
|
226
225
|
|
227
226
|
if referer = headers[REFERER]
|
228
|
-
headers[REFERER] = referer
|
229
|
-
filter.filter($1 => $2).first.join("=")
|
230
|
-
end
|
227
|
+
headers[REFERER] = filter_pairs(referer, filter)
|
231
228
|
end
|
232
229
|
|
233
|
-
if (cookie = headers[COOKIE]) &&
|
234
|
-
headers[COOKIE] = cookie
|
235
|
-
LogjamAgent.cookie_obfuscator.filter($1 => $2).first.join("=")
|
236
|
-
end
|
230
|
+
if (cookie = headers[COOKIE]) && obfuscated_cookies.present?
|
231
|
+
headers[COOKIE] = filter_pairs(cookie, cookie_obfuscator)
|
237
232
|
end
|
238
233
|
|
239
234
|
headers.keys.each do |k|
|
data/lib/logjam_agent/version.rb
CHANGED
data/lib/logjam_agent.rb
CHANGED
@@ -10,6 +10,7 @@ end
|
|
10
10
|
|
11
11
|
require "logjam_agent/version"
|
12
12
|
require "logjam_agent/util"
|
13
|
+
require "logjam_agent/obfuscation"
|
13
14
|
require "logjam_agent/zmq_forwarder"
|
14
15
|
require "logjam_agent/forwarders"
|
15
16
|
require "logjam_agent/request"
|
@@ -77,26 +78,7 @@ module LogjamAgent
|
|
77
78
|
mattr_accessor :ensure_ping_at_exit
|
78
79
|
self.ensure_ping_at_exit = true
|
79
80
|
|
80
|
-
|
81
|
-
self.obfuscate_ips = false
|
82
|
-
|
83
|
-
# TODO: ipv6 obfuscation
|
84
|
-
def self.ip_obfuscator(ip)
|
85
|
-
obfuscate_ips ? ip.to_s.sub(/\d+\z/, 'XXX') : ip
|
86
|
-
end
|
87
|
-
|
88
|
-
mattr_accessor :obfuscated_cookies
|
89
|
-
self.obfuscated_cookies = [/_session\z/]
|
90
|
-
|
91
|
-
def self.cookie_obfuscator
|
92
|
-
@cookie_obfuscator ||=
|
93
|
-
if defined?(ActiveSupport::ParameterFilter)
|
94
|
-
ActiveSupport::ParameterFilter.new(obfuscated_cookies)
|
95
|
-
else
|
96
|
-
ActionDispatch::Http::ParameterFilter.new(obfuscated_cookies)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
81
|
+
extend Obfuscation
|
100
82
|
extend RequestHandling
|
101
83
|
extend SelectiveLogging
|
102
84
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative "test_helper.rb"
|
2
|
+
|
3
|
+
module LogjamAgent
|
4
|
+
class ObfuscatorTest < MiniTest::Test
|
5
|
+
include Obfuscation
|
6
|
+
|
7
|
+
test "obfuscates session cookie by default" do
|
8
|
+
filter = LogjamAgent.cookie_obfuscator
|
9
|
+
assert_equal "_session=[FILTERED]", filter_pairs("_session=data", filter)
|
10
|
+
assert_equal "my_session=[FILTERED]", filter_pairs("my_session=mdata", filter)
|
11
|
+
assert_equal "blabber=1; _session=[FILTERED]", filter_pairs("blabber=1; _session=data", filter)
|
12
|
+
assert_equal "blabber=1; _session=[FILTERED]; blubber=2", filter_pairs("blabber=1; _session=data; blubber=2", filter)
|
13
|
+
end
|
14
|
+
|
15
|
+
test "obfuscates with complex regex" do
|
16
|
+
filter = ParameterFilter.new([/(login|_session)\z/])
|
17
|
+
assert_equal "_session=[FILTERED]; login=[FILTERED]", filter_pairs("_session=my_session; login=foo", filter)
|
18
|
+
assert_equal "_session=[FILTERED]; my_login=[FILTERED]", filter_pairs("_session=my_session; my_login=foo", filter)
|
19
|
+
end
|
20
|
+
|
21
|
+
test "obfuscates with exact matches" do
|
22
|
+
filter = ParameterFilter.new([/\A(login|.*_session)\z/])
|
23
|
+
assert_equal "_session=[FILTERED]; login=[FILTERED]", filter_pairs("_session=my_session; login=foo", filter)
|
24
|
+
assert_equal "_session=[FILTERED]; my_login=foo", filter_pairs("_session=my_session; my_login=foo", filter)
|
25
|
+
assert_equal "my_session=[FILTERED]; my_login=foo", filter_pairs("my_session=my_session; my_login=foo", filter)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/test/sinatra_app.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
$:.unshift File.expand_path('../../lib', __FILE__)
|
2
2
|
|
3
3
|
require 'logjam_agent/sinatra'
|
4
|
+
require 'sinatra/cookies'
|
4
5
|
|
5
6
|
class SinatraTestApp < Sinatra::Base
|
6
7
|
register LogjamAgent::Sinatra
|
7
8
|
|
8
9
|
use LogjamAgent::Sinatra::Middleware
|
9
10
|
|
11
|
+
helpers Sinatra::Cookies
|
12
|
+
|
10
13
|
configure do
|
11
14
|
set :root, File.expand_path('../..', __FILE__)
|
12
15
|
set :environment, :test
|
@@ -24,6 +27,8 @@ class SinatraTestApp < Sinatra::Base
|
|
24
27
|
end
|
25
28
|
|
26
29
|
get '/index' do
|
30
|
+
cookies[:foo] = 'bar'
|
31
|
+
cookies[:frerks] = "no micro"
|
27
32
|
logger.info 'Hello World!'
|
28
33
|
'Hello World!'
|
29
34
|
end
|
data/test/sinatra_classic_app.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
$:.unshift File.expand_path('../../lib', __FILE__)
|
2
2
|
|
3
3
|
require 'logjam_agent/sinatra'
|
4
|
+
require 'sinatra/cookies'
|
4
5
|
|
5
6
|
use LogjamAgent::Sinatra::Middleware
|
6
7
|
|
@@ -27,5 +28,7 @@ end
|
|
27
28
|
get '/index' do
|
28
29
|
action_name "Simple#index"
|
29
30
|
logger.info 'Hello World!'
|
31
|
+
cookies[:foo] = 'bar'
|
32
|
+
cookies[:frerks] = "no micro"
|
30
33
|
'Hello World!'
|
31
34
|
end
|
@@ -12,7 +12,10 @@ module LogjamAgent
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_root
|
15
|
-
|
15
|
+
cookie_jar = ::Rack::Test::CookieJar.new
|
16
|
+
cookie_jar['foo'] = 'bar'
|
17
|
+
cookie_jar['baz'] = 'gni'
|
18
|
+
get '/index?mumu=1&password=5', {}, 'HTTP_COOKIE' => cookie_jar.for(nil)
|
16
19
|
assert_equal 'Hello World!', last_response.body
|
17
20
|
end
|
18
21
|
|
data/test/sinatra_test.rb
CHANGED
@@ -24,7 +24,10 @@ module LogjamAgent
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def test_root
|
27
|
-
|
27
|
+
cookie_jar = ::Rack::Test::CookieJar.new
|
28
|
+
cookie_jar['foo'] = 'bar'
|
29
|
+
cookie_jar['baz'] = 'gni'
|
30
|
+
get '/index?mumu=1&password=5', {}, 'HTTP_COOKIE' => cookie_jar.for(nil)
|
28
31
|
assert_equal 'Hello World!', last_response.body
|
29
32
|
assert_equal 200, last_response.status
|
30
33
|
|
@@ -49,6 +52,8 @@ module LogjamAgent
|
|
49
52
|
assert_equal method, "GET"
|
50
53
|
assert_equal url, "/index?mumu=1&password=[FILTERED]"
|
51
54
|
assert_equal(query_parameters, { "mumu" => "1", "password" => "[FILTERED]" })
|
55
|
+
assert_match(/baz=gni/, request_info["headers"]["Cookie"])
|
56
|
+
assert_match(/foo=\[FILTERED\]/, request_info["headers"]["Cookie"])
|
52
57
|
end
|
53
58
|
|
54
59
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,183 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logjam_agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.38.
|
4
|
+
version: 0.38.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Kaes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rake
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: i18n
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: snappy
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: lz4-ruby
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: oj
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: byebug
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: minitest
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: mocha
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: sinatra
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: rack-test
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - ">="
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - ">="
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: appraisal
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - ">="
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '0'
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - ">="
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '0'
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: simplecov
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - ">="
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: '0'
|
174
|
-
type: :development
|
175
|
-
prerelease: false
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - ">="
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: '0'
|
181
13
|
- !ruby/object:Gem::Dependency
|
182
14
|
name: activesupport
|
183
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -252,6 +84,7 @@ files:
|
|
252
84
|
- lib/logjam_agent/logging_attributes.rb
|
253
85
|
- lib/logjam_agent/middleware.rb
|
254
86
|
- lib/logjam_agent/monkey_patches/ffi-rzmq-patch.rb
|
87
|
+
- lib/logjam_agent/obfuscation.rb
|
255
88
|
- lib/logjam_agent/rack/logger.rb
|
256
89
|
- lib/logjam_agent/rack/rails_support.rb
|
257
90
|
- lib/logjam_agent/rack/sinatra_request.rb
|
@@ -266,6 +99,7 @@ files:
|
|
266
99
|
- lib/logjam_agent/version.rb
|
267
100
|
- lib/logjam_agent/zmq_forwarder.rb
|
268
101
|
- test/json_logging_test.rb
|
102
|
+
- test/obfuscator_test.rb
|
269
103
|
- test/request_test.rb
|
270
104
|
- test/selective_logging_test.rb
|
271
105
|
- test/sinatra_app.rb
|
@@ -300,6 +134,7 @@ specification_version: 4
|
|
300
134
|
summary: Logjam client library to be used with logjam
|
301
135
|
test_files:
|
302
136
|
- test/json_logging_test.rb
|
137
|
+
- test/obfuscator_test.rb
|
303
138
|
- test/request_test.rb
|
304
139
|
- test/selective_logging_test.rb
|
305
140
|
- test/sinatra_app.rb
|