assemblyline-core 4.5.1.dev475__tar.gz → 4.5.1.dev479__tar.gz

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 (90) hide show
  1. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/PKG-INFO +1 -1
  2. assemblyline_core-4.5.1.dev479/assemblyline_core/VERSION +1 -0
  3. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/plumber/run_plumber.py +64 -2
  4. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/workflow/run_workflow.py +3 -1
  5. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core.egg-info/PKG-INFO +1 -1
  6. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core.egg-info/SOURCES.txt +2 -1
  7. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_tasking_client.py +0 -2
  8. assemblyline_core-4.5.1.dev479/test/test_workflow.py +45 -0
  9. assemblyline_core-4.5.1.dev475/assemblyline_core/VERSION +0 -1
  10. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/LICENCE.md +0 -0
  11. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/README.md +0 -0
  12. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/__init__.py +0 -0
  13. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/alerter/__init__.py +0 -0
  14. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/alerter/processing.py +0 -0
  15. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/alerter/run_alerter.py +0 -0
  16. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/archiver/__init__.py +0 -0
  17. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/archiver/run_archiver.py +0 -0
  18. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/badlist_client.py +0 -0
  19. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/dispatching/__init__.py +0 -0
  20. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/dispatching/__main__.py +0 -0
  21. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/dispatching/client.py +0 -0
  22. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/dispatching/dispatcher.py +0 -0
  23. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/dispatching/schedules.py +0 -0
  24. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/dispatching/timeout.py +0 -0
  25. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/expiry/__init__.py +0 -0
  26. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/expiry/run_expiry.py +0 -0
  27. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/ingester/__init__.py +0 -0
  28. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/ingester/__main__.py +0 -0
  29. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/ingester/constants.py +0 -0
  30. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/ingester/ingester.py +0 -0
  31. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/metrics/__init__.py +0 -0
  32. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/metrics/es_metrics.py +0 -0
  33. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/metrics/heartbeat_formatter.py +0 -0
  34. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/metrics/helper.py +0 -0
  35. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/metrics/metrics_server.py +0 -0
  36. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
  37. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
  38. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
  39. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/plumber/__init__.py +0 -0
  40. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/replay/__init__.py +0 -0
  41. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/replay/client.py +0 -0
  42. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/replay/creator/__init__.py +0 -0
  43. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/replay/creator/run.py +0 -0
  44. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/replay/creator/run_worker.py +0 -0
  45. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/replay/loader/__init__.py +0 -0
  46. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/replay/loader/run.py +0 -0
  47. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/replay/loader/run_worker.py +0 -0
  48. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/replay/replay.py +0 -0
  49. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/safelist_client.py +0 -0
  50. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/scaler/__init__.py +0 -0
  51. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/scaler/collection.py +0 -0
  52. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/scaler/controllers/__init__.py +0 -0
  53. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/scaler/controllers/docker_ctl.py +0 -0
  54. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/scaler/controllers/interface.py +0 -0
  55. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +0 -0
  56. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/scaler/run_scaler.py +0 -0
  57. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/scaler/scaler_server.py +0 -0
  58. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/server_base.py +0 -0
  59. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/signature_client.py +0 -0
  60. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/submission_client.py +0 -0
  61. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/tasking_client.py +0 -0
  62. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/updater/__init__.py +0 -0
  63. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/updater/helper.py +0 -0
  64. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/updater/run_updater.py +0 -0
  65. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/vacuum/__init__.py +0 -0
  66. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/vacuum/crawler.py +0 -0
  67. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/vacuum/department_map.py +0 -0
  68. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/vacuum/safelist.py +0 -0
  69. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/vacuum/stream_map.py +0 -0
  70. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/vacuum/worker.py +0 -0
  71. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core/workflow/__init__.py +0 -0
  72. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core.egg-info/dependency_links.txt +0 -0
  73. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core.egg-info/requires.txt +0 -0
  74. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/assemblyline_core.egg-info/top_level.txt +0 -0
  75. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/setup.cfg +0 -0
  76. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/setup.py +0 -0
  77. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_alerter.py +0 -0
  78. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_badlist_client.py +0 -0
  79. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_dispatcher.py +0 -0
  80. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_expiry.py +0 -0
  81. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_plumber.py +0 -0
  82. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_replay.py +0 -0
  83. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_safelist_client.py +0 -0
  84. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_scaler.py +0 -0
  85. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_scheduler.py +0 -0
  86. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_signature_client.py +0 -0
  87. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_simulation.py +0 -0
  88. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_vacuum.py +0 -0
  89. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_worker_ingest.py +0 -0
  90. {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev479}/test/test_worker_submit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblyline-core
3
- Version: 4.5.1.dev475
3
+ Version: 4.5.1.dev479
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -0,0 +1 @@
1
+ 4.5.1.dev479
@@ -11,15 +11,18 @@ import warnings
11
11
  from typing import Optional
12
12
 
13
13
  from assemblyline.common.constants import service_queue_name
14
- from assemblyline.common.forge import get_service_queue
15
- from assemblyline.common.isotime import now_as_iso
14
+ from assemblyline.common.forge import get_service_queue, get_config
15
+ from assemblyline.common.isotime import DAY_IN_SECONDS, now_as_iso
16
+ from assemblyline.odm.models.apikey import get_apikey_id
16
17
  from assemblyline.odm.models.error import Error
17
18
  from assemblyline.odm.models.service import Service
19
+ from assemblyline.odm.models.user import load_roles, load_roles_form_acls
18
20
  from assemblyline.remote.datatypes import retry_call
19
21
  from assemblyline.remote.datatypes.queues.named import NamedQueue
20
22
  from assemblyline_core.dispatching.client import DispatchClient
21
23
  from assemblyline_core.server_base import CoreBase, ServiceStage
22
24
 
25
+
23
26
  DAY = 60 * 60 * 24
24
27
  TASK_DELETE_CHUNK = 10000
25
28
 
@@ -53,6 +56,8 @@ class Plumber(CoreBase):
53
56
  name="redis_notification_queue_cleanup")
54
57
  nq_thread.start()
55
58
 
59
+ ua_thread = threading.Thread(target=self.user_apikey_cleanup, daemon=True, name="user_apikey_cleanup")
60
+ ua_thread.start()
56
61
  self.service_queue_plumbing()
57
62
 
58
63
  def service_queue_plumbing(self):
@@ -189,6 +194,63 @@ class Plumber(CoreBase):
189
194
  self.log.info(f"Done watching {service_name} service queue")
190
195
 
191
196
 
197
+
198
+ def user_apikey_cleanup(self):
199
+ query = "id:*"
200
+ offset = 0
201
+ rows = 100
202
+ total = 1
203
+ cur_total = 0
204
+
205
+ config = get_config()
206
+ apikey_max_dtl = config.auth.apikey_max_dtl
207
+
208
+ expiry_ts = now_as_iso(apikey_max_dtl * DAY_IN_SECONDS) if apikey_max_dtl is not None else None
209
+
210
+ while cur_total < total:
211
+ result = self.datastore.user.search(query, offset=offset, rows=rows)
212
+ total = result.get('total', 0)
213
+ cur_total = cur_total + (result.get("count", total))
214
+
215
+ # check for API keys in total
216
+ users = result.get('items', [])
217
+
218
+ for u in users:
219
+ uname = u['uname']
220
+ user = self.datastore.user.get(uname)
221
+ apikeys = user.apikeys
222
+
223
+ for key in apikeys:
224
+ old_apikey = apikeys[key]
225
+ key_id = get_apikey_id(key, uname)
226
+
227
+ roles = None
228
+ if old_apikey['acl'] == ["C"]:
229
+
230
+ roles = [r for r in old_apikey['roles']
231
+ if r in load_roles(user['type'], user['roles'])]
232
+
233
+ else:
234
+ roles = [r for r in load_roles_form_acls(old_apikey['acl'], roles)
235
+ if r in load_roles(user['type'], user['roles'])]
236
+ new_apikey = {
237
+ "password": old_apikey['password'],
238
+ "acl": old_apikey['acl'],
239
+ "uname": uname,
240
+ "key_name": key,
241
+ "roles": roles,
242
+ "expiry_ts": expiry_ts
243
+ }
244
+ self.datastore.apikey.save(key_id, new_apikey)
245
+
246
+ user['apikeys'] = {}
247
+ self.datastore.user.save(uname, user)
248
+
249
+
250
+
251
+
252
+
253
+
192
254
  if __name__ == '__main__':
193
255
  with Plumber() as server:
194
256
  server.serve_forever()
@@ -59,7 +59,7 @@ class WorkflowManager(ServerBase):
59
59
 
60
60
  return ret_val
61
61
 
62
- def try_run(self):
62
+ def try_run(self, run_once=False):
63
63
  self.datastore.alert.commit()
64
64
  while self.running:
65
65
  self.heartbeat()
@@ -220,6 +220,8 @@ class WorkflowManager(ServerBase):
220
220
  else:
221
221
  self.log.info("Skipping all workflows since there where no new alerts in the specified time period.")
222
222
 
223
+ if run_once:
224
+ break
223
225
  time.sleep(30)
224
226
  self.start_ts = end_ts
225
227
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblyline-core
3
- Version: 4.5.1.dev475
3
+ Version: 4.5.1.dev479
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -84,4 +84,5 @@ test/test_simulation.py
84
84
  test/test_tasking_client.py
85
85
  test/test_vacuum.py
86
86
  test/test_worker_ingest.py
87
- test/test_worker_submit.py
87
+ test/test_worker_submit.py
88
+ test/test_workflow.py
@@ -1,5 +1,3 @@
1
-
2
- import pytest
3
1
  from assemblyline_core.tasking_client import TaskingClient
4
2
 
5
3
  from assemblyline.odm.models.service import Service
@@ -0,0 +1,45 @@
1
+ import pytest
2
+ import random
3
+ from assemblyline_core.workflow.run_workflow import WorkflowManager
4
+
5
+ from assemblyline.common.isotime import now_as_iso
6
+ from assemblyline.odm.models.workflow import Workflow
7
+ from assemblyline.odm.random_data import create_alerts, wipe_alerts, wipe_workflows
8
+ from assemblyline.odm.randomizer import random_minimal_obj
9
+
10
+
11
+ @pytest.fixture(scope="module")
12
+ def manager(datastore_connection):
13
+ try:
14
+ create_alerts(datastore_connection)
15
+ wipe_workflows(datastore_connection)
16
+ datastore_connection.alert.update_by_query("*", [(datastore_connection.alert.UPDATE_SET, 'reporting_ts', now_as_iso())])
17
+ datastore_connection.alert.commit()
18
+ yield WorkflowManager()
19
+ finally:
20
+ wipe_alerts(datastore_connection)
21
+
22
+ def test_workflow(manager, datastore_connection):
23
+ # Create workflow that targets alerts based on YARA rule association
24
+ workflow = random_minimal_obj(Workflow)
25
+
26
+ yara_rule = random.choice(list(datastore_connection.alert.facet("al.yara").keys()))
27
+ workflow.query = f'al.yara:"{yara_rule}"'
28
+ workflow.workflow_id = "AL_TEST"
29
+ workflow.labels = ["AL_TEST"]
30
+ workflow.priority = "LOW"
31
+ workflow.status = "MALICIOUS"
32
+ datastore_connection.workflow.save(workflow.workflow_id, workflow)
33
+ datastore_connection.workflow.commit()
34
+
35
+ # Run Workflow manager to process new workflow against existing alerts
36
+ manager.running = True
37
+ manager.get_last_reporting_ts = lambda x: "now/d+1d"
38
+ manager.try_run(run_once=True)
39
+ datastore_connection.alert.commit()
40
+
41
+ # Assert that custom labels were applied to alerts
42
+ assert datastore_connection.alert.search("label:AL_TEST", track_total_hits=True)['total']
43
+
44
+ # Assert that the change has been record in the alerts' event history
45
+ assert datastore_connection.alert.search(f"events.entity_id:{workflow.workflow_id}", track_total_hits=True)['total']
@@ -1 +0,0 @@
1
- 4.5.1.dev475