tcell_agent 1.1.12 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +5 -5
  2. data/bin/tcell_agent +45 -137
  3. data/lib/tcell_agent.rb +12 -14
  4. data/lib/tcell_agent/agent.rb +108 -97
  5. data/lib/tcell_agent/agent/route_manager.rb +0 -16
  6. data/lib/tcell_agent/agent/static_agent.rb +9 -30
  7. data/lib/tcell_agent/config_initializer.rb +66 -0
  8. data/lib/tcell_agent/configuration.rb +69 -345
  9. data/lib/tcell_agent/hooks/login_fraud.rb +30 -33
  10. data/lib/tcell_agent/instrument_servers.rb +23 -0
  11. data/lib/tcell_agent/instrumentation.rb +12 -10
  12. data/lib/tcell_agent/instrumentation/cmdi.rb +29 -25
  13. data/lib/tcell_agent/instrumentation/lfi.rb +84 -0
  14. data/lib/tcell_agent/instrumentation/monkey_patches/file.rb +25 -0
  15. data/lib/tcell_agent/instrumentation/monkey_patches/io.rb +131 -0
  16. data/lib/tcell_agent/instrumentation/monkey_patches/kernel.rb +102 -0
  17. data/lib/tcell_agent/logger.rb +49 -114
  18. data/lib/tcell_agent/patches.rb +6 -7
  19. data/lib/tcell_agent/policies/appfirewall_policy.rb +26 -0
  20. data/lib/tcell_agent/policies/command_injection_policy.rb +28 -0
  21. data/lib/tcell_agent/policies/dataloss_policy.rb +44 -44
  22. data/lib/tcell_agent/policies/headers_policy.rb +25 -0
  23. data/lib/tcell_agent/policies/http_redirect_policy.rb +13 -79
  24. data/lib/tcell_agent/policies/js_agent_policy.rb +27 -0
  25. data/lib/tcell_agent/policies/local_file_access.rb +28 -0
  26. data/lib/tcell_agent/policies/login_policy.rb +43 -0
  27. data/lib/tcell_agent/policies/patches_policy.rb +27 -0
  28. data/lib/tcell_agent/policies/policies_manager.rb +68 -0
  29. data/lib/tcell_agent/policies/policy_polling.rb +58 -0
  30. data/lib/tcell_agent/policies/policy_types.rb +14 -0
  31. data/lib/tcell_agent/policies/system_enablements.rb +27 -0
  32. data/lib/tcell_agent/rails/auth/authlogic.rb +46 -75
  33. data/lib/tcell_agent/rails/auth/authlogic_helper.rb +20 -0
  34. data/lib/tcell_agent/rails/auth/devise.rb +100 -105
  35. data/lib/tcell_agent/rails/auth/devise_helper.rb +29 -0
  36. data/lib/tcell_agent/rails/auth/doorkeeper.rb +62 -76
  37. data/lib/tcell_agent/{userinfo.rb → rails/auth/userinfo.rb} +0 -0
  38. data/lib/tcell_agent/rails/csrf_exception.rb +2 -10
  39. data/lib/tcell_agent/rails/dlp.rb +35 -23
  40. data/lib/tcell_agent/rails/dlp_handler.rb +1 -2
  41. data/lib/tcell_agent/rails/js_agent_insert.rb +12 -13
  42. data/lib/tcell_agent/rails/middleware/body_filter_middleware.rb +4 -25
  43. data/lib/tcell_agent/rails/middleware/context_middleware.rb +2 -12
  44. data/lib/tcell_agent/rails/middleware/global_middleware.rb +1 -2
  45. data/lib/tcell_agent/rails/middleware/headers_middleware.rb +14 -34
  46. data/lib/tcell_agent/{rails.rb → rails/railties/tcell_agent_railties.rb} +11 -16
  47. data/lib/tcell_agent/rails/railties/tcell_agent_unicorn_railties.rb +8 -0
  48. data/lib/tcell_agent/rails/routes.rb +10 -12
  49. data/lib/tcell_agent/rails/routes/grape.rb +4 -14
  50. data/lib/tcell_agent/rails/routes/route_id.rb +3 -1
  51. data/lib/tcell_agent/rails/settings_reporter.rb +23 -36
  52. data/lib/tcell_agent/rails/tcell_body_proxy.rb +5 -4
  53. data/lib/tcell_agent/rust/agent_config.rb +60 -0
  54. data/lib/tcell_agent/rust/{libtcellagent-alpine-1.3.2.so → libtcellagent-5.0.2.dylib} +0 -0
  55. data/lib/tcell_agent/rust/{libtcellagent-1.3.2.so → libtcellagent-5.0.2.so} +0 -0
  56. data/lib/tcell_agent/rust/libtcellagent-alpine-5.0.2.so +0 -0
  57. data/lib/tcell_agent/rust/models.rb +6 -52
  58. data/lib/tcell_agent/rust/native_agent.rb +549 -0
  59. data/lib/tcell_agent/rust/native_agent_response.rb +42 -0
  60. data/lib/tcell_agent/rust/native_library.rb +69 -0
  61. data/lib/tcell_agent/rust/tcellagent-5.0.2.dll +0 -0
  62. data/lib/tcell_agent/sensor_events/agent_setting_event.rb +12 -0
  63. data/lib/tcell_agent/sensor_events/{app_config.rb → app_config_setting_event.rb} +0 -6
  64. data/lib/tcell_agent/sensor_events/dlp.rb +2 -6
  65. data/lib/tcell_agent/sensor_events/sensor.rb +0 -62
  66. data/lib/tcell_agent/sensor_events/server_agent.rb +13 -18
  67. data/lib/tcell_agent/sensor_events/util/sanitizer_utilities.rb +0 -108
  68. data/lib/tcell_agent/sensor_events/util/utils.rb +0 -2
  69. data/lib/tcell_agent/servers/passenger.rb +1 -28
  70. data/lib/tcell_agent/servers/puma.rb +3 -21
  71. data/lib/tcell_agent/servers/rails_server.rb +1 -2
  72. data/lib/tcell_agent/servers/thin.rb +2 -2
  73. data/lib/tcell_agent/servers/unicorn.rb +19 -80
  74. data/lib/tcell_agent/servers/webrick.rb +1 -2
  75. data/lib/tcell_agent/settings_reporter.rb +11 -90
  76. data/lib/tcell_agent/sinatra.rb +14 -16
  77. data/lib/tcell_agent/tcell_context.rb +40 -14
  78. data/lib/tcell_agent/utils/headers.rb +14 -0
  79. data/lib/tcell_agent/version.rb +1 -1
  80. data/spec/lib/tcell_agent/configuration_spec.rb +55 -346
  81. data/spec/lib/tcell_agent/hooks/login_fraud_spec.rb +46 -173
  82. data/spec/lib/tcell_agent/instrumentation/cmdi/io_cmdi_spec.rb +504 -0
  83. data/spec/lib/tcell_agent/instrumentation/cmdi/kernel_cmdi_spec.rb +435 -0
  84. data/spec/lib/tcell_agent/instrumentation/cmdi_spec.rb +201 -0
  85. data/spec/lib/tcell_agent/instrumentation/lfi/file_lfi_spec.rb +326 -0
  86. data/spec/lib/tcell_agent/instrumentation/lfi/io_lfi_spec.rb +562 -0
  87. data/spec/lib/tcell_agent/instrumentation/lfi/kernel_lfi_spec.rb +264 -0
  88. data/spec/lib/tcell_agent/instrumentation/lfi_spec.rb +150 -0
  89. data/spec/lib/tcell_agent/patches_spec.rb +25 -43
  90. data/spec/lib/tcell_agent/policies/appfirewall_policy_spec.rb +183 -0
  91. data/spec/lib/tcell_agent/policies/clickjacking_policy_spec.rb +57 -0
  92. data/spec/lib/tcell_agent/policies/command_injection_policy_spec.rb +84 -773
  93. data/spec/lib/tcell_agent/policies/content_security_policy_spec.rb +161 -0
  94. data/spec/lib/tcell_agent/policies/dataloss_policy_spec.rb +9 -9
  95. data/spec/lib/tcell_agent/policies/http_redirect_policy_spec.rb +243 -198
  96. data/spec/lib/tcell_agent/policies/js_agent_policy_spec.rb +75 -0
  97. data/spec/lib/tcell_agent/policies/login_policy_spec.rb +165 -33
  98. data/spec/lib/tcell_agent/policies/patches_policy_spec.rb +84 -277
  99. data/spec/lib/tcell_agent/policies/policies_manager_spec.rb +104 -0
  100. data/spec/lib/tcell_agent/policies/policy_polling_spec.rb +6 -0
  101. data/spec/lib/tcell_agent/policies/secure_headers_policy_spec.rb +56 -0
  102. data/spec/lib/tcell_agent/rails/csrf_exception_spec.rb +9 -18
  103. data/spec/lib/tcell_agent/rails/js_agent_insert_spec.rb +13 -30
  104. data/spec/lib/tcell_agent/rails/logger_spec.rb +27 -7
  105. data/spec/lib/tcell_agent/rails/middleware/tcell_body_proxy_spec.rb +17 -12
  106. data/spec/lib/tcell_agent/rails/routes/routes_spec.rb +14 -14
  107. data/spec/lib/tcell_agent/rust/agent_config_spec.rb +27 -0
  108. data/spec/lib/tcell_agent/sensor_events/util/sanitizer_utilities_spec.rb +0 -35
  109. data/spec/lib/tcell_agent/settings_reporter_spec.rb +56 -155
  110. data/spec/spec_helper.rb +1 -1
  111. data/spec/support/builders.rb +103 -0
  112. data/spec/support/force_logger_mocking.rb +38 -0
  113. data/spec/support/resources/lfi_sample_file.txt +2 -0
  114. data/spec/support/static_agent_overrides.rb +0 -15
  115. metadata +72 -83
  116. data/lib/tcell_agent/agent/event_processor.rb +0 -326
  117. data/lib/tcell_agent/agent/fork_pipe_manager.rb +0 -113
  118. data/lib/tcell_agent/agent/policy_manager.rb +0 -219
  119. data/lib/tcell_agent/agent/policy_types.rb +0 -30
  120. data/lib/tcell_agent/api.rb +0 -91
  121. data/lib/tcell_agent/appsensor/injections_reporter.rb +0 -24
  122. data/lib/tcell_agent/authlogic.rb +0 -26
  123. data/lib/tcell_agent/config/child_process_events.rb +0 -8
  124. data/lib/tcell_agent/config/unknown_options.rb +0 -123
  125. data/lib/tcell_agent/devise.rb +0 -35
  126. data/lib/tcell_agent/instrumentation/cmdi/backtick.rb +0 -10
  127. data/lib/tcell_agent/instrumentation/cmdi/exec.rb +0 -14
  128. data/lib/tcell_agent/instrumentation/cmdi/popen.rb +0 -28
  129. data/lib/tcell_agent/instrumentation/cmdi/spawn.rb +0 -11
  130. data/lib/tcell_agent/instrumentation/cmdi/system.rb +0 -11
  131. data/lib/tcell_agent/policies/http_tx_policy.rb +0 -60
  132. data/lib/tcell_agent/policies/login_fraud_policy.rb +0 -45
  133. data/lib/tcell_agent/policies/rust_policies.rb +0 -110
  134. data/lib/tcell_agent/rails/on_start.rb +0 -41
  135. data/lib/tcell_agent/rust/libtcellagent-1.3.2.dylib +0 -0
  136. data/lib/tcell_agent/rust/tcellagent-1.3.2.dll +0 -0
  137. data/lib/tcell_agent/rust/whisperer.rb +0 -308
  138. data/lib/tcell_agent/sensor_events/appsensor_event.rb +0 -52
  139. data/lib/tcell_agent/sensor_events/appsensor_meta_event.rb +0 -45
  140. data/lib/tcell_agent/sensor_events/command_injection.rb +0 -75
  141. data/lib/tcell_agent/sensor_events/honeytokens.rb +0 -16
  142. data/lib/tcell_agent/sensor_events/login_fraud.rb +0 -60
  143. data/lib/tcell_agent/sensor_events/metrics.rb +0 -123
  144. data/lib/tcell_agent/sensor_events/patches.rb +0 -21
  145. data/lib/tcell_agent/start_background_thread.rb +0 -55
  146. data/lib/tcell_agent/system_info.rb +0 -11
  147. data/lib/tcell_agent/utils/io.rb +0 -38
  148. data/lib/tcell_agent/utils/passwords.rb +0 -28
  149. data/lib/tcell_agent/utils/queue_with_timeout.rb +0 -142
  150. data/spec/lib/tcell_agent/agent/fork_pipe_manager_spec.rb +0 -100
  151. data/spec/lib/tcell_agent/agent/policy_manager_spec.rb +0 -535
  152. data/spec/lib/tcell_agent/agent/static_agent_spec.rb +0 -133
  153. data/spec/lib/tcell_agent/api/api_spec.rb +0 -39
  154. data/spec/lib/tcell_agent/appsensor/injections_reporter_spec.rb +0 -187
  155. data/spec/lib/tcell_agent/cmdi_spec.rb +0 -736
  156. data/spec/lib/tcell_agent/config/unknown_options_spec.rb +0 -213
  157. data/spec/lib/tcell_agent/instrumentation_spec.rb +0 -225
  158. data/spec/lib/tcell_agent/policies/appsensor_policy_spec.rb +0 -517
  159. data/spec/lib/tcell_agent/policies/http_tx_policy_spec.rb +0 -22
  160. data/spec/lib/tcell_agent/rails/middleware/appsensor_middleware_spec.rb +0 -293
  161. data/spec/lib/tcell_agent/rails/middleware/dlp_middleware_spec.rb +0 -198
  162. data/spec/lib/tcell_agent/rails/middleware/global_middleware_spec.rb +0 -180
  163. data/spec/lib/tcell_agent/rails/middleware/redirect_middleware_spec.rb +0 -116
  164. data/spec/lib/tcell_agent/rust/models_spec.rb +0 -120
  165. data/spec/lib/tcell_agent/rust/whisperer_spec.rb +0 -704
  166. data/spec/lib/tcell_agent/sensor_events/appsensor_meta_event_spec.rb +0 -45
  167. data/spec/lib/tcell_agent/sensor_events/sessions_metric_spec.rb +0 -272
  168. data/spec/lib/tcell_agent/utils/bounded_queue_spec.rb +0 -52
  169. data/spec/lib/tcell_agent/utils/passwords_spec.rb +0 -143
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6334e154fc67ca343e771118111ed19b4961bcaa
4
- data.tar.gz: a7acb414e6e0cb4506d6abafed4709818fcb720f
2
+ SHA256:
3
+ metadata.gz: 4874ce28005d00849139d7ff1620e5eb0969a6a4626a2b005936ebb429be7064
4
+ data.tar.gz: bb009ff4896aecb87e92ea17c57273a4b9bee02f0ef211a51f45f72ed96dbc04
5
5
  SHA512:
6
- metadata.gz: 21c687dafdccd3582369ea7aef360201d274f3cc2043479416a35f03af5efac90b649e7621569d83b0d90a6f72d88dab28be3c86c9c1cf27178c7a69ed99eb05
7
- data.tar.gz: 4b176e6bf2625639647e3b82b8b52294e80bebafd73e2d6a6ba8844d4b41ba581a1882077397653e09944db4ebcccb76acbc6b2e74847d4931bd144e01b8358e
6
+ metadata.gz: 960aa5847e382e2ef19f3d5ef615113a3c042a1f567bdc0cbf9231d5662b7bc140275177103de97b7967408329f1ac90d7702e9606adb8c19117e4dee691eb4c
7
+ data.tar.gz: 8ff116f37231cd8d045ecd634b01446250293520318a0aedbe10c79adcb49ae318e966e67c3576df9fa364152c06b71546a6caf35583d82e9f7e0856908a6472
@@ -1,25 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # TODO: so a small bit becames something, larger, rewrite as a real cmdline script
4
-
5
- require 'fileutils'
6
- require 'json'
3
+ require 'tcell_agent'
7
4
  require 'optparse'
8
5
 
6
+ CONFIG_DIR = 'config'.freeze
7
+ CONFIG_FILE = 'config/tcell_agent.config'.freeze
9
8
  options = {}
10
-
11
- subtext = <<HELP
12
- Commonly used command are:
13
- setup : Setup new config file
14
- test : Run diagnostics classes and config
15
- loglevel : Set the loglevel of the tcell agent
16
- enable : Enable the agent
17
- disable : Disable the agent
18
-
19
- See 'tcell_agent COMMAND --help' for more information on a specific command.
20
-
21
- HELP
22
-
23
9
  def yesno(default = true)
24
10
  begin
25
11
  system('stty raw -echo')
@@ -34,74 +20,59 @@ def yesno(default = true)
34
20
  default
35
21
  end
36
22
 
37
- CONFIG_DIR = 'config'.freeze
38
- CONFIG_FILE = 'config/tcell_agent.config'.freeze
23
+ subtext = <<HELP
24
+ Commonly used commands are:
25
+ test : Run diagnostics and test event sending
26
+ HELP
39
27
 
40
28
  global = OptionParser.new do |opts|
41
- opts.banner = 'Usage: tcell_agent [options] [subcommand [options]]'
29
+ opts.banner = 'Usage: tcell_agent [options] [subcommand]'
30
+
42
31
  opts.on('--version', 'Print version') do |_v|
43
- require 'tcell_agent/version'
44
- puts "TCell.io Ruby Agent (Version #{TCellAgent::VERSION})"
32
+ puts "tCell Ruby Agent Version #{TCellAgent::VERSION}"
45
33
  Kernel.exit(1)
46
34
  end
47
- opts.on('-v', '--[no-]verbose', 'Run verbosely') do |v|
48
- options[:verbose] = v
35
+
36
+ opts.on('test', 'Run diagnostics and test event sending') do |_v|
49
37
  end
50
38
  opts.separator ''
51
39
  opts.separator subtext
52
40
  end
53
41
 
54
42
  subcommands = {
55
- 'setup' => OptionParser.new do |opts|
56
- opts.banner = 'Usage: setup'
43
+ 'test' => OptionParser.new do |opts|
44
+ opts.banner = 'Usage: test'
57
45
  end,
58
46
  'loglevel' => OptionParser.new do |opts|
59
47
  opts.banner = 'Usage: loglevel [options] error|warn|info|debug'
60
48
  opts.on('-o', '--off', 'turn logging off ') do |v|
61
49
  options[:off] = v
62
50
  end
63
- end,
64
- 'preload' => OptionParser.new do |opts|
65
- opts.banner = 'Usage: loglevel [options] [preload_filename]'
66
- opts.on('-o', '--off', 'turn preloading filename off ') do |v|
67
- options[:off] = v
68
- end
69
- end,
70
- 'demomode' => OptionParser.new do |opts|
71
- opts.banner = 'Usage: loglevel [options]'
72
- opts.on('-o', '--off', 'turn preloading filename off ') do |v|
73
- options[:off] = v
74
- end
75
- end,
76
- 'enable' => OptionParser.new do |opts|
77
- opts.banner = 'Usage: enable'
78
- end,
79
- 'disable' => OptionParser.new do |opts|
80
- opts.banner = 'Usage: disable'
81
- end,
82
- 'test' => OptionParser.new do |opts|
83
- opts.banner = 'Usage: test'
84
- # opts.on("-q", "--[no-]quiet", "quietly run ") do |v|
85
- # options[:quiet] = v
86
- # end
87
- end
51
+ end
88
52
  }
89
53
 
90
54
  global.order!
91
55
  command = ARGV.shift
92
- if command.nil? || subcommands[command].nil?
56
+ deprecated_commands = %w[setup loglevel preload demomode enable disable]
57
+ if command.nil?
58
+ puts global
59
+ Kernel.exit(1)
60
+ elsif subcommands[command]
61
+ subcommands[command].order!
62
+ elsif !deprecated_commands.include?(command)
93
63
  puts global
94
64
  Kernel.exit(1)
95
65
  end
96
- subcommands[command].order!
97
66
 
98
67
  if command == 'setup'
68
+ puts '[WARN] tcell_agent setup is deprecated and will be removed in the future.'
69
+ puts ' Please download the config file from the tCell dashboard'
99
70
  unless File.directory?(CONFIG_DIR)
100
71
  print "Directory 'config' not found, create? [Y/n]"
101
72
  answer = yesno
102
73
  print "\n"
103
74
  unless answer
104
- puts 'ERROR: Could not create config'
75
+ puts '[ERROR] Could not create config'
105
76
  Kernel.exit(1)
106
77
  end
107
78
  FileUtils.mkdir_p CONFIG_DIR
@@ -132,6 +103,7 @@ if command == 'setup'
132
103
  puts 'done.'
133
104
 
134
105
  elsif command == 'loglevel'
106
+ puts '[WARN] tcell_agent loglevel is deprecated and will be removed in the future.'
135
107
  file = File.read(CONFIG_FILE)
136
108
  config_hash = JSON.parse(file)
137
109
  logging_options = config_hash['applications'][0].fetch('logging_options', {})
@@ -158,6 +130,7 @@ elsif command == 'loglevel'
158
130
  puts 'done.'
159
131
 
160
132
  elsif command == 'preload'
133
+ puts '[WARN] tcell_agent preload is deprecated and will be removed in the future.'
161
134
  file = File.read(CONFIG_FILE)
162
135
  config_hash = JSON.parse(file)
163
136
 
@@ -175,6 +148,7 @@ elsif command == 'preload'
175
148
  puts 'done.'
176
149
 
177
150
  elsif command == 'enable'
151
+ puts '[WARN] tcell_agent enable is deprecated and will be removed in the future.'
178
152
  file = File.read(CONFIG_FILE)
179
153
  config_hash = JSON.parse(file)
180
154
  config_hash['applications'][0].delete('enabled')
@@ -182,6 +156,7 @@ elsif command == 'enable'
182
156
  puts 'Enabled, you will need to restart the server.'
183
157
 
184
158
  elsif command == 'disable'
159
+ puts '[WARN] tcell_agent disable is deprecated and will be removed in the future.'
185
160
  file = File.read(CONFIG_FILE)
186
161
  config_hash = JSON.parse(file)
187
162
  config_hash['applications'][0]['enabled'] = false
@@ -189,6 +164,7 @@ elsif command == 'disable'
189
164
  puts 'Disabled, you will need to restart the server.'
190
165
 
191
166
  elsif command == 'demomode'
167
+ puts '[WARN] tcell_agent demomode is deprecated and will be removed in the future.'
192
168
  file = File.read(CONFIG_FILE)
193
169
  config_hash = JSON.parse(file)
194
170
  if options[:off] == true
@@ -200,92 +176,24 @@ elsif command == 'demomode'
200
176
  puts 'done.'
201
177
 
202
178
  elsif command == 'test'
203
- puts
204
- printf '%-50s', 'Config file exists... '
205
- unless File.exist?(CONFIG_FILE)
206
- puts 'failed'
207
- Kernel.exit(1)
208
- end
209
- puts 'passed'
210
-
211
- printf '%-50s', 'Config valid json... '
212
- file = File.read(CONFIG_FILE)
213
- config_hash = JSON.parse(file)
214
- puts 'passed'
215
-
216
- printf '%-50s', 'Config file has valid version... '
217
- if config_hash.fetch('version') != 1
218
- puts 'failed'
219
- Kernel.exit(1)
220
- end
221
- puts 'passed'
222
-
223
- printf '%-50s', 'Config file has application...'
224
- if config_hash.fetch('applications').empty?
225
- puts 'failed'
226
- Kernel.exit(1)
227
- end
228
- puts 'passed'
229
-
230
- printf '%-50s', 'Application has app_id... '
231
- tcell_application = config_hash.fetch('applications')[0]
232
- if !tcell_application.key?('app_id') && !ENV['TCELL_AGENT_APP_ID']
233
- puts 'failed'
234
- Kernel.exit(1)
235
- end
236
- puts 'passed'
237
-
238
- printf '%-50s', 'Application has api_key... '
239
- tcell_application = config_hash.fetch('applications')[0]
240
- if !tcell_application.key?('api_key') && !ENV['TCELL_AGENT_API_KEY']
241
- puts 'failed'
242
- Kernel.exit(1)
243
- end
244
- puts 'passed'
245
-
246
- printf '%-50s', 'Check for unknown settings... '
247
- require 'tcell_agent/config/unknown_options'
248
- messages = TCellAgent::Config::Validate.get_unknown_options(config_hash)
249
- unless messages.empty?
250
- puts 'failed'
251
- messages.each do |message|
252
- puts message
179
+ Dir[Dir.pwd + '/config/initializers/*.rb'].sort.each do |f|
180
+ begin
181
+ require f
182
+ rescue NameError # rubocop: disable Lint/HandleExceptions
183
+ rescue StandardError => e
184
+ puts "[ERROR] Loading initializers failed. #{e}"
253
185
  end
254
- Kernel.exit(1)
255
- end
256
- puts 'passed'
257
-
258
- printf '%-50s', 'Requiring configuration library... '
259
- require 'tcell_agent/configuration'
260
- require 'tcell_agent/api'
261
- puts 'passed'
262
-
263
- printf '%-50s', 'Make test API call for policies... '
264
- api = TCellAgent::TCellApi.new
265
- if api.poll_api
266
- puts 'passed'
267
- else
268
- puts 'failed'
269
- Kernel.exit(1)
270
186
  end
271
187
 
272
- printf '%-50s', 'Sending a Test event... '
273
- send_succeeded = api.send_event_set([])
274
- unless send_succeeded
275
- puts 'failed'
276
- Kernel.exit(1)
188
+ require 'tcell_agent/rust/native_library'
189
+ unless TCellAgent::Rust::NativeLibrary.common_lib_available?
190
+ puts '[ERROR] Native Library is unavailable'
191
+ return
277
192
  end
278
- puts 'passed'
279
193
 
280
- printf '%-50s', 'Loading native library... '
281
- require 'tcell_agent/rust/whisperer'
282
- unless TCellAgent::Rust::Wrapper.common_lib_available?
283
- puts 'failed'
284
- Kernel.exit(1)
285
- end
286
- puts 'passed'
287
-
288
- puts
289
- puts 'all tests passed, looks good.'
290
- puts 'done.'
194
+ puts "tCell Ruby Agent Version #{TCellAgent::VERSION}"
195
+ TCellAgent::Rust::NativeAgent.test_agent(
196
+ TCellAgent.initializer_configuration ||
197
+ TCellAgent.configuration
198
+ )
291
199
  end
@@ -1,20 +1,18 @@
1
1
  # See the file "LICENSE" for the full license governing this code.
2
-
3
- require 'tcell_agent/utils/passwords'
4
- require 'tcell_agent/utils/strings'
5
- require 'tcell_agent/utils/io'
6
- require 'tcell_agent/logger'
7
2
  require 'tcell_agent/configuration'
8
3
 
9
- require 'tcell_agent/agent'
4
+ unless TCellAgent.configuration.disable_all
5
+ require 'tcell_agent/logger'
6
+ require 'tcell_agent/utils/strings'
7
+ require 'tcell_agent/agent'
10
8
 
11
- require 'tcell_agent/policies/http_tx_policy'
12
- require 'tcell_agent/policies/http_redirect_policy'
13
- require 'tcell_agent/policies/login_fraud_policy'
14
- require 'tcell_agent/policies/dataloss_policy'
9
+ require 'tcell_agent/sensor_events/util/sanitizer_utilities'
15
10
 
16
- require 'tcell_agent/sensor_events/dlp'
17
- require 'tcell_agent/sensor_events/util/sanitizer_utilities'
11
+ require 'tcell_agent/instrumentation'
18
12
 
19
- require 'tcell_agent/instrumentation'
20
- require 'tcell_agent/start_background_thread'
13
+ require 'tcell_agent/instrument_servers'
14
+ require 'tcell_agent/hooks/login_fraud'
15
+ require 'tcell_agent/rails/railties/tcell_agent_railties' if defined?(Rails)
16
+ # sinatra used to be supported, but dropped support due to no customers using it
17
+ # require 'tcell_agent/sinatra' if defined?(Sinatra)
18
+ end
@@ -2,134 +2,145 @@
2
2
 
3
3
  require 'tcell_agent/logger'
4
4
  require 'tcell_agent/version'
5
- require 'tcell_agent/api'
6
5
  require 'tcell_agent/configuration'
7
6
 
8
7
  require 'tcell_agent/sensor_events/server_agent'
9
- require 'tcell_agent/utils/queue_with_timeout'
10
8
 
11
- require 'tcell_agent/agent/event_processor'
12
- require 'tcell_agent/agent/policy_manager'
9
+ require 'tcell_agent/policies/policy_types'
10
+ require 'tcell_agent/policies/policies_manager'
11
+ require 'tcell_agent/policies/policy_polling'
13
12
  require 'tcell_agent/agent/static_agent'
14
- require 'tcell_agent/agent/policy_types'
15
13
  require 'tcell_agent/agent/route_manager'
16
- require 'tcell_agent/agent/fork_pipe_manager'
17
14
 
18
15
  require 'tcell_agent/routes/table'
19
16
 
20
- require 'net/http'
21
- require 'thread'
22
- require 'logger'
17
+ require 'tcell_agent/settings_reporter'
18
+ require 'tcell_agent/rust/native_agent'
19
+
23
20
  require 'json'
24
- require 'monitor'
25
21
 
26
22
  module TCellAgent
27
23
  class Agent
28
- attr_accessor :start_pid
29
- attr_accessor :event_queue
30
-
31
- attr_accessor :fork_event_queue
32
- attr_accessor :fork_event_thread
33
- attr_accessor :fork_event_thread_mutex
34
-
35
- attr_accessor :metrics_event_queue
36
- attr_accessor :metrics_event_thread
37
- attr_accessor :metrics_event_thread_mutex
38
-
39
- attr_accessor :policies
40
- attr_accessor :eventProcessorThread
41
- attr_accessor :response_time_table
42
- attr_accessor :route_table
43
-
44
- attr_accessor :event_processor_thread
45
- attr_accessor :event_processor
46
- attr_accessor :worker_mutex
47
-
48
- attr_accessor :policy_polling_thread
49
- attr_accessor :policy_polling_worker_mutex
50
-
51
- attr_accessor :event_queue_monitor
52
- attr_accessor :event_dispatch_monitor
53
-
54
- attr_accessor :stop_agent
55
- attr_accessor :complete_policy_cache
56
-
57
- def initialize(start_pid = Process.pid)
58
- @start_pid = start_pid
59
- @dispatch_events_timeout = TCellAgent.configuration.event_time_limit_seconds || 55
60
- @dispatch_events_limit = TCellAgent.configuration.event_batch_size_limit || 20
61
- @worker_mutex = Mutex.new
62
- @policy_polling_worker_mutex = Mutex.new
63
- @@policy_tapi = TCellApi.new
64
-
65
- # Agent request thread
66
- @policies = {
67
- TCellAgent::PolicyTypes::RUST => TCellAgent::Policies::RustPolicies.new
68
- }
69
- @lock = Monitor.new
70
-
71
- initialize_processor_variables
72
-
73
- if TCellAgent.configuration.preload_policy_filename
74
- TCellAgent.logger.info('Preloading a policy file')
75
- begin
76
- policy_file = File.open(TCellAgent.configuration.preload_policy_filename).read
77
- policy_jsons = JSON.parse(policy_file)
78
- policy_jsons = policy_jsons['result'] if policy_jsons.key?('result')
79
- process_policy_json(policy_jsons, false)
80
- rescue StandardError => e
81
- TCellAgent.logger.error(e.message)
82
- end
83
- end
84
- cached_policies = policies_from_cachefile
85
- process_policy_json(cached_policies, false) if cached_policies
86
- end
24
+ include TCellAgent::ModuleLoggerAccess
87
25
 
88
- def initialize_processor_variables
89
- @complete_policy_cache = {}
26
+ attr_accessor :route_table,
27
+ :stop_agent
90
28
 
29
+ def initialize
91
30
  @stop_agent = false
31
+ @native_agent = nil
92
32
  @route_table = TCellAgent::Routes::RouteTable.new
33
+ @policies_manager = PoliciesManager.new(nil)
34
+ end
35
+
36
+ def instrument_auth_frameworks
37
+ if defined?(Devise) && TCellAgent.configuration.should_instrument?('devise')
38
+ module_logger.info('Instrumenting Devise authentication framework')
39
+ require 'tcell_agent/rails/auth/devise'
40
+ require 'tcell_agent/rails/auth/devise_helper'
41
+ end
42
+
43
+ if defined?(Authlogic) && TCellAgent.configuration.should_instrument?('authlogic')
44
+ module_logger.info('Instrumenting Authlogic authentication framework')
45
+ require 'tcell_agent/rails/auth/authlogic'
46
+ require 'tcell_agent/rails/auth/authlogic_helper'
47
+ end
48
+
49
+ if defined?(Doorkeeper) && TCellAgent.configuration.should_instrument?('doorkeeper') # rubocop:disable Style/GuardClause
50
+ module_logger.info('Instrumenting Doorkeeper authentication framework')
51
+ require 'tcell_agent/rails/auth/doorkeeper'
52
+ end
53
+ end
54
+
55
+ def instrument_built_ins
56
+ require 'tcell_agent/instrumentation/cmdi'
57
+ require 'tcell_agent/instrumentation/lfi'
58
+
59
+ if TCellAgent.configuration.should_instrument?('io')
60
+ module_logger.info('Instrumenting Ruby Class: IO')
61
+ require 'tcell_agent/instrumentation/monkey_patches/io'
62
+ end
93
63
 
94
- @event_queue_monitor = Monitor.new
95
- @event_dispatch_monitor = Monitor.new
96
- @mutex = Monitor.new
64
+ if TCellAgent.configuration.should_instrument?('file')
65
+ module_logger.info('Instrumenting Ruby Class: File')
66
+ require 'tcell_agent/instrumentation/monkey_patches/file'
67
+ end
68
+
69
+ if TCellAgent.configuration.should_instrument?('kernel') # rubocop:disable Style/GuardClause
70
+ module_logger.info('Instrumenting Ruby Module: Kernel')
71
+ require 'tcell_agent/instrumentation/monkey_patches/kernel'
72
+ end
73
+ end
74
+
75
+ def manage_policies
76
+ @policies_manager = PoliciesManager.new(@native_agent)
77
+
78
+ result = {}
79
+ unless TCellAgent.configuration.should_start_policy_poll?
80
+ result = @native_agent.poll_new_policies
81
+ end
97
82
 
98
- @response_time_table = {}
99
- @sessions_metrics = TCellAgent::SensorEvents::SessionsMetric.new
100
- @sessions_metrics_mutex = Monitor.new
83
+ policies_and_enablements = result['new_policies_and_enablements'] || {}
101
84
 
102
- @dispatch_events = []
103
- @event_queue = BoundedQueue.new(200)
85
+ @policies_manager.process_policy_json(
86
+ policies_and_enablements['enablements'],
87
+ policies_and_enablements['policies']
88
+ )
104
89
 
105
- @fork_event_queue = Queue.new
106
- @fork_event_thread_mutex = Monitor.new
90
+ @policy_polling = PolicyPolling.new(@policies_manager, @native_agent)
91
+ end
92
+
93
+ def policies
94
+ @policies_manager.policies
95
+ end
96
+
97
+ def queue_sensor_event(event)
98
+ return unless @native_agent
107
99
 
108
- @metrics_event_queue = Queue.new
109
- @metrics_event_thread_mutex = Monitor.new
100
+ @native_agent.send_sanitized_events(
101
+ [event]
102
+ )
103
+ rescue StandardError => standard_error
104
+ module_logger.error("Error sending event: (#{standard_error.class}) #{standard_error.message}")
105
+ module_logger.exception(standard_error)
110
106
  end
111
107
 
112
- def parent_process?
113
- @start_pid == Process.pid
108
+ def report_metrics(request_time, tcell_context)
109
+ @native_agent.report_metrics(
110
+ request_time, tcell_context
111
+ )
112
+ rescue StandardError => standard_error
113
+ module_logger.error("Error reporting metric: (#{standard_error.class}) #{standard_error.message}")
114
+ module_logger.exception(standard_error)
114
115
  end
115
116
 
116
- def start
117
- if TCellAgent::Utils::Strings.blank?(TCellAgent.configuration.api_key) ||
118
- TCellAgent::Utils::Strings.blank?(TCellAgent.configuration.app_id)
119
- puts ' ********* ********* ********* *********'
120
- puts '* tCell.io *'
121
- puts '* Configuration info is missing, you may *'
122
- puts '* need to download config file and place *'
123
- puts '* it in the config/ directory *'
124
- puts ' ********* ********* ********* *********'
117
+ def start(server_name)
118
+ @native_agent = TCellAgent::Rust::NativeAgent.create_agent(
119
+ TCellAgent.initializer_configuration ||
120
+ TCellAgent.configuration
121
+ )
122
+
123
+ if @native_agent.nil?
125
124
  TCellAgent.configuration.enabled = false
126
125
  return
127
126
  end
128
127
 
129
- TCellAgent.logger.debug('Starting thread agent')
128
+ TCellAgent.native_logger = @native_agent
129
+
130
+ module_logger.info('Rails initializer overriding default agent configuration') unless TCellAgent.initializer_configuration.nil?
131
+
132
+ instrument_auth_frameworks
133
+ instrument_built_ins
134
+ manage_policies
130
135
 
131
- ensure_policy_polling_running
132
- ensure_event_processor_running
136
+ module_logger.info("Started thread agent: #{server_name}")
137
+ TCellAgent.report_settings
138
+ TCellAgent::Instrumentation::Rails.send_framework_info
139
+ TCellAgent::Instrumentation::Rails.send_settings
140
+ rescue StandardError => standard_error
141
+ TCellAgent.configuration.enabled = false
142
+ module_logger.error("Error starting agent: (#{standard_error.class}) #{standard_error.message}")
143
+ module_logger.exception(standard_error)
133
144
  end
134
145
  end
135
146
  end