tcell_agent 1.1.12 → 2.0.0
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 +5 -5
- data/bin/tcell_agent +26 -14
- data/lib/tcell_agent.rb +16 -10
- data/lib/tcell_agent/agent.rb +78 -97
- data/lib/tcell_agent/agent/route_manager.rb +0 -16
- data/lib/tcell_agent/agent/static_agent.rb +9 -30
- data/lib/tcell_agent/authlogic.rb +3 -6
- data/lib/tcell_agent/config/unknown_options.rb +4 -8
- data/lib/tcell_agent/configuration.rb +38 -119
- data/lib/tcell_agent/devise.rb +25 -27
- data/lib/tcell_agent/hooks/login_fraud.rb +30 -33
- data/lib/tcell_agent/instrument_servers.rb +25 -0
- data/lib/tcell_agent/instrumentation.rb +12 -10
- data/lib/tcell_agent/instrumentation/cmdi.rb +19 -15
- data/lib/tcell_agent/instrumentation/lfi.rb +73 -0
- data/lib/tcell_agent/instrumentation/monkey_patches/file.rb +25 -0
- data/lib/tcell_agent/instrumentation/monkey_patches/io.rb +123 -0
- data/lib/tcell_agent/instrumentation/monkey_patches/kernel.rb +159 -0
- data/lib/tcell_agent/logger.rb +50 -114
- data/lib/tcell_agent/patches.rb +6 -7
- data/lib/tcell_agent/policies/appfirewall_policy.rb +26 -0
- data/lib/tcell_agent/policies/command_injection_policy.rb +28 -0
- data/lib/tcell_agent/policies/dataloss_policy.rb +44 -44
- data/lib/tcell_agent/policies/headers_policy.rb +25 -0
- data/lib/tcell_agent/policies/http_redirect_policy.rb +13 -79
- data/lib/tcell_agent/policies/js_agent_policy.rb +27 -0
- data/lib/tcell_agent/policies/local_file_access.rb +28 -0
- data/lib/tcell_agent/policies/login_policy.rb +43 -0
- data/lib/tcell_agent/policies/patches_policy.rb +27 -0
- data/lib/tcell_agent/policies/policies_manager.rb +68 -0
- data/lib/tcell_agent/policies/policy_polling.rb +58 -0
- data/lib/tcell_agent/policies/policy_types.rb +14 -0
- data/lib/tcell_agent/policies/system_enablements.rb +27 -0
- data/lib/tcell_agent/rails/auth/authlogic.rb +43 -68
- data/lib/tcell_agent/rails/auth/devise.rb +20 -23
- data/lib/tcell_agent/rails/auth/doorkeeper.rb +63 -74
- data/lib/tcell_agent/rails/csrf_exception.rb +2 -2
- data/lib/tcell_agent/rails/dlp.rb +25 -15
- data/lib/tcell_agent/rails/dlp_handler.rb +1 -2
- data/lib/tcell_agent/rails/js_agent_insert.rb +12 -13
- data/lib/tcell_agent/rails/middleware/body_filter_middleware.rb +4 -25
- data/lib/tcell_agent/rails/middleware/context_middleware.rb +2 -12
- data/lib/tcell_agent/rails/middleware/global_middleware.rb +0 -1
- data/lib/tcell_agent/rails/middleware/headers_middleware.rb +14 -34
- data/lib/tcell_agent/rails/on_start.rb +32 -31
- data/lib/tcell_agent/rails/routes.rb +7 -6
- data/lib/tcell_agent/rails/routes/grape.rb +1 -3
- data/lib/tcell_agent/rails/routes/route_id.rb +3 -1
- data/lib/tcell_agent/rails/settings_reporter.rb +23 -36
- data/lib/tcell_agent/rails/start_agent_after_initializers.rb +12 -0
- data/lib/tcell_agent/rails/tcell_body_proxy.rb +6 -4
- data/lib/tcell_agent/rust/agent_config.rb +49 -0
- data/lib/tcell_agent/rust/{libtcellagent-alpine-1.3.2.so → libtcellagent-4.14.0.dylib} +0 -0
- data/lib/tcell_agent/rust/libtcellagent-4.14.0.so +0 -0
- data/lib/tcell_agent/rust/{libtcellagent-1.3.2.so → libtcellagent-alpine-4.14.0.so} +0 -0
- data/lib/tcell_agent/rust/models.rb +0 -55
- data/lib/tcell_agent/rust/native_agent.rb +531 -0
- data/lib/tcell_agent/rust/native_agent_response.rb +42 -0
- data/lib/tcell_agent/rust/native_library.rb +68 -0
- data/lib/tcell_agent/rust/tcellagent-4.14.0.dll +0 -0
- data/lib/tcell_agent/sensor_events/agent_setting_event.rb +12 -0
- data/lib/tcell_agent/sensor_events/{app_config.rb → app_config_setting_event.rb} +0 -6
- data/lib/tcell_agent/sensor_events/dlp.rb +2 -6
- data/lib/tcell_agent/sensor_events/sensor.rb +0 -62
- data/lib/tcell_agent/sensor_events/server_agent.rb +13 -18
- data/lib/tcell_agent/sensor_events/util/sanitizer_utilities.rb +0 -108
- data/lib/tcell_agent/sensor_events/util/utils.rb +0 -2
- data/lib/tcell_agent/servers/passenger.rb +1 -28
- data/lib/tcell_agent/servers/puma.rb +3 -21
- data/lib/tcell_agent/servers/rails_server.rb +1 -1
- data/lib/tcell_agent/servers/thin.rb +2 -2
- data/lib/tcell_agent/servers/unicorn.rb +19 -80
- data/lib/tcell_agent/servers/webrick.rb +1 -1
- data/lib/tcell_agent/settings_reporter.rb +24 -24
- data/lib/tcell_agent/sinatra.rb +14 -16
- data/lib/tcell_agent/tcell_context.rb +40 -14
- data/lib/tcell_agent/utils/headers.rb +14 -0
- data/lib/tcell_agent/version.rb +1 -1
- data/spec/lib/tcell_agent/cmdi_spec.rb +0 -585
- data/spec/lib/tcell_agent/config/unknown_options_spec.rb +0 -18
- data/spec/lib/tcell_agent/configuration_spec.rb +4 -140
- data/spec/lib/tcell_agent/hooks/login_fraud_spec.rb +46 -173
- data/spec/lib/tcell_agent/instrumentation/cmdi/io_cmdi_spec.rb +504 -0
- data/spec/lib/tcell_agent/instrumentation/cmdi/kernel_cmdi_spec.rb +435 -0
- data/spec/lib/tcell_agent/instrumentation/lfi/file_lfi_spec.rb +326 -0
- data/spec/lib/tcell_agent/instrumentation/lfi/io_lfi_spec.rb +556 -0
- data/spec/lib/tcell_agent/instrumentation/lfi/kernel_lfi_spec.rb +249 -0
- data/spec/lib/tcell_agent/instrumentation/lfi_spec.rb +105 -0
- data/spec/lib/tcell_agent/patches_spec.rb +25 -43
- data/spec/lib/tcell_agent/policies/appfirewall_policy_spec.rb +183 -0
- data/spec/lib/tcell_agent/policies/clickjacking_policy_spec.rb +57 -0
- data/spec/lib/tcell_agent/policies/command_injection_policy_spec.rb +84 -773
- data/spec/lib/tcell_agent/policies/content_security_policy_spec.rb +161 -0
- data/spec/lib/tcell_agent/policies/dataloss_policy_spec.rb +9 -9
- data/spec/lib/tcell_agent/policies/http_redirect_policy_spec.rb +243 -198
- data/spec/lib/tcell_agent/policies/js_agent_policy_spec.rb +75 -0
- data/spec/lib/tcell_agent/policies/login_policy_spec.rb +165 -33
- data/spec/lib/tcell_agent/policies/patches_policy_spec.rb +84 -277
- data/spec/lib/tcell_agent/policies/policies_manager_spec.rb +104 -0
- data/spec/lib/tcell_agent/policies/policy_polling_spec.rb +6 -0
- data/spec/lib/tcell_agent/policies/secure_headers_policy_spec.rb +56 -0
- data/spec/lib/tcell_agent/rails/csrf_exception_spec.rb +9 -18
- data/spec/lib/tcell_agent/rails/js_agent_insert_spec.rb +13 -30
- data/spec/lib/tcell_agent/rails/logger_spec.rb +27 -7
- data/spec/lib/tcell_agent/rails/middleware/tcell_body_proxy_spec.rb +17 -12
- data/spec/lib/tcell_agent/rails/routes/routes_spec.rb +14 -14
- data/spec/lib/tcell_agent/sensor_events/util/sanitizer_utilities_spec.rb +0 -35
- data/spec/lib/tcell_agent/settings_reporter_spec.rb +127 -153
- data/spec/spec_helper.rb +1 -1
- data/spec/support/builders.rb +104 -0
- data/spec/support/force_logger_mocking.rb +38 -0
- data/spec/support/resources/lfi_sample_file.txt +2 -0
- data/spec/support/static_agent_overrides.rb +0 -15
- metadata +63 -74
- data/lib/tcell_agent/agent/event_processor.rb +0 -326
- data/lib/tcell_agent/agent/fork_pipe_manager.rb +0 -113
- data/lib/tcell_agent/agent/policy_manager.rb +0 -219
- data/lib/tcell_agent/agent/policy_types.rb +0 -30
- data/lib/tcell_agent/api.rb +0 -91
- data/lib/tcell_agent/appsensor/injections_reporter.rb +0 -24
- data/lib/tcell_agent/config/child_process_events.rb +0 -8
- data/lib/tcell_agent/instrumentation/cmdi/backtick.rb +0 -10
- data/lib/tcell_agent/instrumentation/cmdi/exec.rb +0 -14
- data/lib/tcell_agent/instrumentation/cmdi/popen.rb +0 -28
- data/lib/tcell_agent/instrumentation/cmdi/spawn.rb +0 -11
- data/lib/tcell_agent/instrumentation/cmdi/system.rb +0 -11
- data/lib/tcell_agent/policies/http_tx_policy.rb +0 -60
- data/lib/tcell_agent/policies/login_fraud_policy.rb +0 -45
- data/lib/tcell_agent/policies/rust_policies.rb +0 -110
- data/lib/tcell_agent/rails.rb +0 -40
- data/lib/tcell_agent/rust/libtcellagent-1.3.2.dylib +0 -0
- data/lib/tcell_agent/rust/tcellagent-1.3.2.dll +0 -0
- data/lib/tcell_agent/rust/whisperer.rb +0 -308
- data/lib/tcell_agent/sensor_events/appsensor_event.rb +0 -52
- data/lib/tcell_agent/sensor_events/appsensor_meta_event.rb +0 -45
- data/lib/tcell_agent/sensor_events/command_injection.rb +0 -75
- data/lib/tcell_agent/sensor_events/honeytokens.rb +0 -16
- data/lib/tcell_agent/sensor_events/login_fraud.rb +0 -60
- data/lib/tcell_agent/sensor_events/metrics.rb +0 -123
- data/lib/tcell_agent/sensor_events/patches.rb +0 -21
- data/lib/tcell_agent/start_background_thread.rb +0 -55
- data/lib/tcell_agent/system_info.rb +0 -11
- data/lib/tcell_agent/utils/io.rb +0 -38
- data/lib/tcell_agent/utils/passwords.rb +0 -28
- data/lib/tcell_agent/utils/queue_with_timeout.rb +0 -142
- data/spec/lib/tcell_agent/agent/fork_pipe_manager_spec.rb +0 -100
- data/spec/lib/tcell_agent/agent/policy_manager_spec.rb +0 -535
- data/spec/lib/tcell_agent/agent/static_agent_spec.rb +0 -133
- data/spec/lib/tcell_agent/api/api_spec.rb +0 -39
- data/spec/lib/tcell_agent/appsensor/injections_reporter_spec.rb +0 -187
- data/spec/lib/tcell_agent/instrumentation_spec.rb +0 -225
- data/spec/lib/tcell_agent/policies/appsensor_policy_spec.rb +0 -517
- data/spec/lib/tcell_agent/policies/http_tx_policy_spec.rb +0 -22
- data/spec/lib/tcell_agent/rails/middleware/appsensor_middleware_spec.rb +0 -293
- data/spec/lib/tcell_agent/rails/middleware/dlp_middleware_spec.rb +0 -198
- data/spec/lib/tcell_agent/rails/middleware/global_middleware_spec.rb +0 -180
- data/spec/lib/tcell_agent/rails/middleware/redirect_middleware_spec.rb +0 -116
- data/spec/lib/tcell_agent/rust/models_spec.rb +0 -120
- data/spec/lib/tcell_agent/rust/whisperer_spec.rb +0 -704
- data/spec/lib/tcell_agent/sensor_events/appsensor_meta_event_spec.rb +0 -45
- data/spec/lib/tcell_agent/sensor_events/sessions_metric_spec.rb +0 -272
- data/spec/lib/tcell_agent/utils/bounded_queue_spec.rb +0 -52
- data/spec/lib/tcell_agent/utils/passwords_spec.rb +0 -143
data/lib/tcell_agent/logger.rb
CHANGED
@@ -2,149 +2,85 @@
|
|
2
2
|
|
3
3
|
require 'logger'
|
4
4
|
require 'tcell_agent/configuration'
|
5
|
-
require 'tcell_agent/utils/io'
|
6
5
|
|
7
6
|
module TCellAgent
|
8
|
-
class TaggedLogger
|
9
|
-
def initialize(tag, logger)
|
10
|
-
@tag = tag
|
11
|
-
@logger = logger
|
12
|
-
end
|
13
|
-
|
14
|
-
def debug(msg)
|
15
|
-
@logger.tagged(@tag) { @logger.debug(msg) }
|
16
|
-
end
|
17
|
-
|
18
|
-
def info(msg)
|
19
|
-
@logger.tagged(@tag) { @logger.info(msg) }
|
20
|
-
end
|
21
|
-
|
22
|
-
def warn(msg)
|
23
|
-
@logger.tagged(@tag) { @logger.warn(msg) }
|
24
|
-
end
|
25
|
-
|
26
|
-
def error(msg)
|
27
|
-
@logger.tagged(@tag) { @logger.error(msg) }
|
28
|
-
end
|
29
|
-
|
30
|
-
def fatal(msg)
|
31
|
-
@logger.tagged(@tag) { @logger.fatal(msg) }
|
32
|
-
end
|
33
|
-
|
34
|
-
def unknown(msg)
|
35
|
-
@logger.tagged(@tag) { @logger.unknown(msg) }
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
7
|
class NullLoger < Logger
|
40
8
|
def initialize(*args); end
|
41
9
|
|
42
10
|
def add(*args, &block); end
|
43
11
|
end
|
44
12
|
|
45
|
-
class
|
46
|
-
def
|
47
|
-
|
48
|
-
|
49
|
-
TCellAgent
|
13
|
+
class ModuleLogger
|
14
|
+
def initialize(logger, module_name)
|
15
|
+
@logger = logger
|
16
|
+
@module_name = module_name
|
17
|
+
@module_name = "#{TCellAgent.configuration.log_tag} #{module_name}" if TCellAgent.configuration.log_tag
|
18
|
+
end
|
50
19
|
|
51
|
-
|
20
|
+
%i[exception debug info warn error].each do |method_name|
|
21
|
+
define_method(method_name) do |msg|
|
22
|
+
@logger.send(method_name, @module_name, msg)
|
23
|
+
end
|
52
24
|
end
|
53
25
|
end
|
54
26
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
return Logger::INFO if level_string == 'INFO'
|
62
|
-
return Logger::ERROR if level_string == 'ERROR'
|
63
|
-
return Logger::FATAL if level_string == 'FATAL'
|
64
|
-
|
65
|
-
Logger::INFO
|
27
|
+
module ModuleLoggerAccess
|
28
|
+
def module_logger
|
29
|
+
@module_logger ||= ModuleLogger.new(
|
30
|
+
TCellAgent.logger, self.class.name
|
31
|
+
)
|
32
|
+
end
|
66
33
|
end
|
67
34
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
35
|
+
# Note: since the agent waits until native agent
|
36
|
+
# is available, this is only used in errors
|
37
|
+
# throwned while the agent is instrumenting or starting up
|
38
|
+
# so it's ok to send those to STDOUT always
|
39
|
+
class RubyLogger
|
40
|
+
def initialize
|
41
|
+
@logger = Logger.new(STDOUT)
|
73
42
|
end
|
74
43
|
|
75
|
-
|
76
|
-
@
|
77
|
-
@payloads_logger = TCellAgent.configuration.appfirewall_payloads_logger
|
78
|
-
return @payloads_logger
|
44
|
+
def exception(module_name, exception)
|
45
|
+
@logger.debug("#{module_name} #{exception.backtrace.join("\n")}")
|
79
46
|
end
|
80
47
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
log_device = TCellLogDevice.new(
|
87
|
-
TCellAgent.configuration.appfirewall_payloads_log_filename,
|
88
|
-
:shift_age => 9, :shift_size => 5_242_880
|
89
|
-
)
|
90
|
-
@payloads_logger = Logger.new(log_device)
|
91
|
-
@payloads_logger.level = Logger::INFO
|
92
|
-
@payloads_logger.formatter = proc do |_severity, datetime, _progname, msg|
|
93
|
-
date_format = datetime.strftime('%Y-%m-%dT%H:%M:%S.%L%:z')
|
94
|
-
"#{date_format} - #{msg}\n"
|
48
|
+
%i[debug info warn error].each do |method_name|
|
49
|
+
define_method(method_name) do |module_name, msg|
|
50
|
+
@logger.send(method_name, "#{module_name} #{msg}")
|
51
|
+
end
|
95
52
|
end
|
96
|
-
|
97
|
-
@payloads_logger
|
98
53
|
end
|
99
54
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
return @logger if defined?(@logger) && @logger_pid == Process.pid
|
104
|
-
|
105
|
-
if TCellAgent.configuration.logger
|
106
|
-
@logger_pid = Process.pid
|
107
|
-
@logger = if TCellAgent.configuration.log_tag
|
108
|
-
TCellAgent::TaggedLogger.new(TCellAgent.configuration.log_tag, TCellAgent.configuration.logger)
|
109
|
-
else
|
110
|
-
TCellAgent.configuration.logger
|
111
|
-
end
|
112
|
-
|
113
|
-
return @logger
|
55
|
+
class NativeLogger
|
56
|
+
def initialize(native_agent)
|
57
|
+
@native_agent = native_agent
|
114
58
|
end
|
115
59
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
if use_default_setting || logging_options[:enabled] || logging_options['enabled']
|
122
|
-
logging_file = TCellAgent.configuration.log_filename
|
123
|
-
logging_directory = File.dirname(logging_file)
|
124
|
-
TCellAgent::Utils::IO.create_directory(logging_directory, TCellAgent.configuration.agent_home_owner.to_s)
|
125
|
-
|
126
|
-
log_device = TCellLogDevice.new(logging_file, :shift_age => 9, :shift_size => 5_242_880)
|
60
|
+
def exception(module_name, exception)
|
61
|
+
@native_agent.log_message(
|
62
|
+
'debug', exception.backtrace.join("\n"), module_name
|
63
|
+
)
|
64
|
+
end
|
127
65
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
# ISO 8601 format
|
134
|
-
date_format = datetime.strftime('%Y-%m-%dT%H:%M:%S.%L%:z')
|
135
|
-
"#{date_format} - [#{TCellAgent::VERSION}] - #{severity}[#{@logger_pid}]: #{msg}\n"
|
66
|
+
%i[debug info warn error].each do |method_name|
|
67
|
+
define_method(method_name) do |module_name, msg|
|
68
|
+
@native_agent.log_message(
|
69
|
+
method_name.to_s, msg, module_name
|
70
|
+
)
|
136
71
|
end
|
72
|
+
end
|
73
|
+
end
|
137
74
|
|
138
|
-
|
75
|
+
@@ruby_logger = RubyLogger.new
|
139
76
|
|
140
|
-
|
141
|
-
|
142
|
-
end
|
77
|
+
def self.logger
|
78
|
+
return @@ruby_logger unless defined?(@native_logger)
|
143
79
|
|
144
|
-
@
|
80
|
+
@native_logger
|
145
81
|
end
|
146
82
|
|
147
|
-
def self.
|
148
|
-
@
|
83
|
+
def self.native_agent=(native_agent)
|
84
|
+
@native_logger = NativeLogger.new(native_agent)
|
149
85
|
end
|
150
86
|
end
|
data/lib/tcell_agent/patches.rb
CHANGED
@@ -5,15 +5,14 @@ module TCellAgent
|
|
5
5
|
module Patches
|
6
6
|
def self.block?(request)
|
7
7
|
TCellAgent::Instrumentation.safe_block('Checking patches blocking') do
|
8
|
-
|
8
|
+
patches_policy = TCellAgent.policy(TCellAgent::PolicyTypes::PATCHES)
|
9
|
+
return false unless patches_policy.enabled
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
request.env[TCellAgent::Instrumentation::TCELL_ID].patches_blocking_triggered = block_request
|
11
|
+
meta_data = TCellAgent::MetaData.for_patches(request)
|
12
|
+
block_request = patches_policy.block_request?(meta_data)
|
13
|
+
request.env[TCellAgent::Instrumentation::TCELL_ID].patches_blocking_triggered = block_request
|
14
14
|
|
15
|
-
|
16
|
-
end
|
15
|
+
return block_request
|
17
16
|
end
|
18
17
|
|
19
18
|
false
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'tcell_agent/policies/policy'
|
2
|
+
|
3
|
+
module TCellAgent
|
4
|
+
module Policies
|
5
|
+
class AppfirewallPolicy < Policy
|
6
|
+
def self.api_identifier
|
7
|
+
'appsensor'
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :enabled
|
11
|
+
|
12
|
+
def initialize(native_agent, enablements)
|
13
|
+
@native_agent = native_agent
|
14
|
+
@enabled = enablements['appfirewall'] || false
|
15
|
+
end
|
16
|
+
|
17
|
+
def check_appfirewall_injections(appsensor_meta)
|
18
|
+
return unless @enabled
|
19
|
+
|
20
|
+
TCellAgent::Instrumentation.safe_block('AppFirewall inspection') do
|
21
|
+
@native_agent.apply_appfirewall(appsensor_meta)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'tcell_agent/policies/policy'
|
2
|
+
|
3
|
+
module TCellAgent
|
4
|
+
module Policies
|
5
|
+
class CommandInjectionPolicy < Policy
|
6
|
+
def self.api_identifier
|
7
|
+
'cmdi'
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :enabled
|
11
|
+
|
12
|
+
def initialize(native_agent, enablements)
|
13
|
+
@native_agent = native_agent
|
14
|
+
@enabled = enablements['cmdi'] || false
|
15
|
+
end
|
16
|
+
|
17
|
+
def block_command?(command, tcell_context)
|
18
|
+
return false unless @enabled
|
19
|
+
|
20
|
+
response = @native_agent.apply_cmdi(
|
21
|
+
command, tcell_context
|
22
|
+
)
|
23
|
+
|
24
|
+
!response['blocked'].nil? && response['blocked']
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -4,6 +4,10 @@ require 'tcell_agent/policies/policy'
|
|
4
4
|
module TCellAgent
|
5
5
|
module Policies
|
6
6
|
class DataLossPolicy < Policy # rubocop:disable Metrics/ClassLength
|
7
|
+
def self.api_identifier
|
8
|
+
'dlp'
|
9
|
+
end
|
10
|
+
|
7
11
|
class FilterActions
|
8
12
|
attr_accessor :body_event
|
9
13
|
attr_accessor :body_redact
|
@@ -38,8 +42,9 @@ module TCellAgent
|
|
38
42
|
attr_accessor :field_redact_body
|
39
43
|
attr_accessor :field_alerts
|
40
44
|
|
41
|
-
def initialize
|
45
|
+
def initialize(policies_json)
|
42
46
|
init_options
|
47
|
+
from_json(policies_json) unless policies_json.nil? || policies_json.empty?
|
43
48
|
end
|
44
49
|
|
45
50
|
def init_options
|
@@ -192,19 +197,18 @@ module TCellAgent
|
|
192
197
|
actions
|
193
198
|
end
|
194
199
|
|
195
|
-
def
|
196
|
-
return
|
200
|
+
def from_json(policy_json)
|
201
|
+
return unless policy_json
|
197
202
|
|
198
|
-
|
199
|
-
|
200
|
-
raise 'Policy ID missing' unless policy.policy_id
|
203
|
+
@policy_id = policy_json['policy_id']
|
204
|
+
raise 'Policy ID missing' unless @policy_id
|
201
205
|
|
202
206
|
data_json = (policy_json['data'] || {})
|
203
207
|
|
204
208
|
if data_json.key?('data_discovery')
|
205
209
|
data_discovery_json = data_json['data_discovery']
|
206
|
-
|
207
|
-
|
210
|
+
@database_discovery_enabled = data_discovery_json.fetch('database_enabled', false)
|
211
|
+
@enabled = @database_discovery_enabled
|
208
212
|
end
|
209
213
|
|
210
214
|
if data_json.key?('session_id_protections')
|
@@ -212,9 +216,9 @@ module TCellAgent
|
|
212
216
|
rule_id = session_id_protection.fetch('id', nil)
|
213
217
|
filter_actions = DataLossPolicy.actions_from_json(session_id_protection)
|
214
218
|
unless filter_actions.nil?
|
215
|
-
|
219
|
+
@enabled = true
|
216
220
|
filter_actions.action_id = rule_id
|
217
|
-
|
221
|
+
@session_id_filter_actions = filter_actions
|
218
222
|
end
|
219
223
|
end
|
220
224
|
|
@@ -235,62 +239,58 @@ module TCellAgent
|
|
235
239
|
next
|
236
240
|
end
|
237
241
|
|
238
|
-
next unless context &&
|
242
|
+
next unless context && @request_filter_actions.key?(context) && variables && options
|
239
243
|
filter_actions = DataLossPolicy.actions_from_json(options)
|
240
244
|
next if filter_actions.nil?
|
241
|
-
|
245
|
+
@enabled = true
|
242
246
|
filter_actions.action_id = rule_id
|
243
247
|
variables.each do |variable|
|
244
248
|
route_ids.each do |route_id|
|
245
249
|
if context == RequestProtectionManager::COOKIE
|
246
250
|
# Case sensitive variable name
|
247
|
-
|
251
|
+
@request_filter_actions[context][route_id][variable].add(filter_actions)
|
248
252
|
else
|
249
|
-
|
253
|
+
@request_filter_actions[context][route_id][variable.downcase].add(filter_actions)
|
250
254
|
end
|
251
255
|
end
|
252
256
|
end
|
253
257
|
end
|
254
258
|
end
|
255
259
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
260
|
+
return unless data_json.key?('db_protections')
|
261
|
+
protections = data_json['db_protections']
|
262
|
+
return unless protections
|
263
|
+
protections.each do |protection_json|
|
264
|
+
scope = protection_json.fetch('scope', nil)
|
265
|
+
databases = protection_json.fetch('databases', ['*'])
|
266
|
+
schemas = protection_json.fetch('schemas', ['*'])
|
267
|
+
tables = protection_json.fetch('tables', ['*'])
|
268
|
+
fields = protection_json.fetch('fields', nil)
|
269
|
+
rule_id = protection_json.fetch('id', nil)
|
270
|
+
actions = protection_json.fetch('actions', {})
|
271
|
+
filter_actions = DataLossPolicy.actions_from_json(actions)
|
272
|
+
route_ids = ['*']
|
273
|
+
|
274
|
+
if !scope.nil? && scope != 'global' && scope == 'route'
|
275
|
+
route_ids = protection_json.fetch('route_ids', [])
|
276
|
+
end
|
269
277
|
|
270
|
-
|
271
|
-
route_ids = protection_json.fetch('route_ids', [])
|
272
|
-
end
|
278
|
+
next if fields.nil? || filter_actions.nil?
|
273
279
|
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
route_ids.each do |route_id|
|
283
|
-
policy.database_actions[database][schema][table][field][route_id].add(filter_actions)
|
284
|
-
end
|
285
|
-
end
|
280
|
+
@enabled = true
|
281
|
+
filter_actions.action_id = rule_id
|
282
|
+
databases.each do |database|
|
283
|
+
schemas.each do |schema|
|
284
|
+
tables.each do |table|
|
285
|
+
fields.each do |field|
|
286
|
+
route_ids.each do |route_id|
|
287
|
+
@database_actions[database][schema][table][field][route_id].add(filter_actions)
|
286
288
|
end
|
287
289
|
end
|
288
290
|
end
|
289
291
|
end
|
290
292
|
end
|
291
293
|
end
|
292
|
-
|
293
|
-
policy
|
294
294
|
end
|
295
295
|
end
|
296
296
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'tcell_agent/policies/policy'
|
2
|
+
|
3
|
+
module TCellAgent
|
4
|
+
module Policies
|
5
|
+
class HeadersPolicy < Policy
|
6
|
+
def self.api_identifier
|
7
|
+
'headers'
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :enabled
|
11
|
+
|
12
|
+
def initialize(native_agent, enablements)
|
13
|
+
@native_agent = native_agent
|
14
|
+
@enabled = enablements['headers'] || false
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_headers(tcell_context)
|
18
|
+
return [] unless @enabled
|
19
|
+
|
20
|
+
response = @native_agent.get_headers(tcell_context)
|
21
|
+
response['headers'] || []
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|