assemblyline-core 4.5.1.dev475__tar.gz → 4.5.1.dev480__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.
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/PKG-INFO +1 -1
- assemblyline_core-4.5.1.dev480/assemblyline_core/VERSION +1 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/plumber/run_plumber.py +64 -2
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/workflow/run_workflow.py +3 -1
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core.egg-info/PKG-INFO +1 -1
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core.egg-info/SOURCES.txt +2 -1
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_tasking_client.py +0 -2
- assemblyline_core-4.5.1.dev480/test/test_workflow.py +45 -0
- assemblyline_core-4.5.1.dev475/assemblyline_core/VERSION +0 -1
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/LICENCE.md +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/README.md +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/alerter/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/alerter/processing.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/alerter/run_alerter.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/archiver/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/archiver/run_archiver.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/badlist_client.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/dispatching/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/dispatching/__main__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/dispatching/client.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/dispatching/dispatcher.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/dispatching/schedules.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/dispatching/timeout.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/expiry/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/expiry/run_expiry.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/ingester/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/ingester/__main__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/ingester/constants.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/ingester/ingester.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/metrics/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/metrics/es_metrics.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/metrics/heartbeat_formatter.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/metrics/helper.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/metrics/metrics_server.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/plumber/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/replay/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/replay/client.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/replay/creator/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/replay/creator/run.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/replay/creator/run_worker.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/replay/loader/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/replay/loader/run.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/replay/loader/run_worker.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/replay/replay.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/safelist_client.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/scaler/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/scaler/collection.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/scaler/controllers/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/scaler/controllers/docker_ctl.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/scaler/controllers/interface.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/scaler/run_scaler.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/scaler/scaler_server.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/server_base.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/signature_client.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/submission_client.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/tasking_client.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/updater/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/updater/helper.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/updater/run_updater.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/vacuum/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/vacuum/crawler.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/vacuum/department_map.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/vacuum/safelist.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/vacuum/stream_map.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/vacuum/worker.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/workflow/__init__.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core.egg-info/dependency_links.txt +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core.egg-info/requires.txt +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core.egg-info/top_level.txt +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/setup.cfg +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/setup.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_alerter.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_badlist_client.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_dispatcher.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_expiry.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_plumber.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_replay.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_safelist_client.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_scaler.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_scheduler.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_signature_client.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_simulation.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_vacuum.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_worker_ingest.py +0 -0
- {assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_worker_submit.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
4.5.1.dev480
|
@@ -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
|
|
@@ -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
|
File without changes
|
File without changes
|
{assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/replay/client.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/replay/replay.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/server_base.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/assemblyline_core/vacuum/worker.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_badlist_client.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_safelist_client.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_signature_client.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_worker_ingest.py
RENAMED
File without changes
|
{assemblyline_core-4.5.1.dev475 → assemblyline_core-4.5.1.dev480}/test/test_worker_submit.py
RENAMED
File without changes
|