tcell_agent 1.1.12 → 2.2.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.
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