assemblyline-core 4.5.0.75__tar.gz → 4.5.0.77__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.

Potentially problematic release.


This version of assemblyline-core might be problematic. Click here for more details.

Files changed (88) hide show
  1. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/PKG-INFO +1 -1
  2. assemblyline_core-4.5.0.77/assemblyline_core/VERSION +1 -0
  3. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/scaler/controllers/docker_ctl.py +2 -2
  4. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +26 -11
  5. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/scaler/scaler_server.py +1 -0
  6. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/updater/run_updater.py +15 -3
  7. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/workflow/run_workflow.py +3 -0
  8. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core.egg-info/PKG-INFO +1 -1
  9. assemblyline_core-4.5.0.75/assemblyline_core/VERSION +0 -1
  10. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/LICENCE.md +0 -0
  11. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/README.md +0 -0
  12. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/__init__.py +0 -0
  13. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/alerter/__init__.py +0 -0
  14. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/alerter/processing.py +0 -0
  15. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/alerter/run_alerter.py +0 -0
  16. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/archiver/__init__.py +0 -0
  17. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/archiver/run_archiver.py +0 -0
  18. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/badlist_client.py +0 -0
  19. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/dispatching/__init__.py +0 -0
  20. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/dispatching/__main__.py +0 -0
  21. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/dispatching/client.py +0 -0
  22. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/dispatching/dispatcher.py +0 -0
  23. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/dispatching/schedules.py +0 -0
  24. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/dispatching/timeout.py +0 -0
  25. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/expiry/__init__.py +0 -0
  26. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/expiry/run_expiry.py +0 -0
  27. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/ingester/__init__.py +0 -0
  28. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/ingester/__main__.py +0 -0
  29. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/ingester/constants.py +0 -0
  30. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/ingester/ingester.py +0 -0
  31. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/metrics/__init__.py +0 -0
  32. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/metrics/es_metrics.py +0 -0
  33. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/metrics/heartbeat_formatter.py +0 -0
  34. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/metrics/helper.py +0 -0
  35. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/metrics/metrics_server.py +0 -0
  36. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
  37. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
  38. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
  39. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/plumber/__init__.py +0 -0
  40. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/plumber/run_plumber.py +0 -0
  41. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/replay/__init__.py +0 -0
  42. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/replay/client.py +0 -0
  43. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/replay/creator/__init__.py +0 -0
  44. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/replay/creator/run.py +0 -0
  45. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/replay/creator/run_worker.py +0 -0
  46. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/replay/loader/__init__.py +0 -0
  47. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/replay/loader/run.py +0 -0
  48. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/replay/loader/run_worker.py +0 -0
  49. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/replay/replay.py +0 -0
  50. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/safelist_client.py +0 -0
  51. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/scaler/__init__.py +0 -0
  52. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/scaler/collection.py +0 -0
  53. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/scaler/controllers/__init__.py +0 -0
  54. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/scaler/controllers/interface.py +0 -0
  55. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/scaler/run_scaler.py +0 -0
  56. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/server_base.py +0 -0
  57. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/signature_client.py +0 -0
  58. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/submission_client.py +0 -0
  59. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/tasking_client.py +0 -0
  60. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/updater/__init__.py +0 -0
  61. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/updater/helper.py +0 -0
  62. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/vacuum/__init__.py +0 -0
  63. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/vacuum/crawler.py +0 -0
  64. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/vacuum/department_map.py +0 -0
  65. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/vacuum/safelist.py +0 -0
  66. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/vacuum/stream_map.py +0 -0
  67. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/vacuum/worker.py +0 -0
  68. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core/workflow/__init__.py +0 -0
  69. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core.egg-info/SOURCES.txt +0 -0
  70. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core.egg-info/dependency_links.txt +0 -0
  71. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core.egg-info/requires.txt +0 -0
  72. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/assemblyline_core.egg-info/top_level.txt +0 -0
  73. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/setup.cfg +0 -0
  74. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/setup.py +0 -0
  75. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_alerter.py +0 -0
  76. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_badlist_client.py +0 -0
  77. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_dispatcher.py +0 -0
  78. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_expiry.py +0 -0
  79. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_plumber.py +0 -0
  80. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_replay.py +0 -0
  81. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_safelist_client.py +0 -0
  82. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_scaler.py +0 -0
  83. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_scheduler.py +0 -0
  84. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_signature_client.py +0 -0
  85. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_simulation.py +0 -0
  86. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_vacuum.py +0 -0
  87. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_worker_ingest.py +0 -0
  88. {assemblyline_core-4.5.0.75 → assemblyline_core-4.5.0.77}/test/test_worker_submit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: assemblyline-core
3
- Version: 4.5.0.75
3
+ Version: 4.5.0.77
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.0.77
@@ -189,10 +189,10 @@ class DockerController(ControllerInterface):
189
189
  volumes = {row[0]: {'bind': row[1], 'mode': 'ro'} for row in self.global_mounts}
190
190
 
191
191
  # Define environment variables
192
- env = [f'{_e.name}={_e.value}' for _e in cfg.environment]
193
- env += [f'{name}={os.environ[name]}' for name in INHERITED_VARIABLES if name in os.environ]
192
+ env = [f'{name}={os.environ[name]}' for name in INHERITED_VARIABLES if name in os.environ]
194
193
  env += [f'LOG_LEVEL={self.log_level}', f'AL_SERVICE_NAME={service_name}']
195
194
  env += [f'{_n}={_v}' for _n, _v in self._service_limited_env[service_name].items()]
195
+ env += [f'{_e.name}={_e.value}' for _e in cfg.environment]
196
196
  if prof.privileged:
197
197
  env.append('PRIVILEGED=true')
198
198
  volumes.update({row[0]: {'bind': row[1], 'mode': 'ro'} for row in self.core_mounts})
@@ -26,7 +26,8 @@ from kubernetes.client import V1Deployment, V1DeploymentSpec, V1PodTemplateSpec,
26
26
  V1PersistentVolumeClaimSpec, V1NetworkPolicy, V1NetworkPolicySpec, V1NetworkPolicyEgressRule, V1NetworkPolicyPeer, \
27
27
  V1NetworkPolicyIngressRule, V1Secret, V1SecretVolumeSource, V1LocalObjectReference, V1Service, \
28
28
  V1ServiceSpec, V1ServicePort, V1PodSecurityContext, V1Probe, V1ExecAction, V1SecurityContext, \
29
- V1Affinity, V1NodeAffinity, V1NodeSelector, V1NodeSelectorTerm, V1NodeSelectorRequirement, V1Toleration
29
+ V1Affinity, V1NodeAffinity, V1NodeSelector, V1NodeSelectorTerm, V1NodeSelectorRequirement, V1Toleration, \
30
+ V1Capabilities, V1SeccompProfile
30
31
  from kubernetes.client.rest import ApiException
31
32
  from assemblyline.odm.models.service import DependencyConfig, DockerConfig, PersistentVolume
32
33
 
@@ -45,6 +46,14 @@ SERVICE_LIVENESS_TIMEOUT = int(os.environ.get('SERVICE_LIVENESS_TIMEOUT', 60))
45
46
  UNPRIVILEGED_SERVICE_ACCOUNT_NAME = os.environ.get('UNPRIVILEGED_SERVICE_ACCOUNT_NAME', None)
46
47
  PRIVILEGED_SERVICE_ACCOUNT_NAME = os.environ.get('PRIVILEGED_SERVICE_ACCOUNT_NAME', None)
47
48
  CERTIFICATE_VALIDITY_PERIOD = int(os.environ.get('CERTIFICATE_VALIDITY_PERIOD', '36500'))
49
+ RESTRICTED_POD_SECURITY_CONTEXT = V1SecurityContext(
50
+ run_as_user=1000,
51
+ run_as_group=1000,
52
+ capabilities=V1Capabilities(drop=["ALL"]),
53
+ run_as_non_root=True,
54
+ allow_privilege_escalation=False,
55
+ seccomp_profile=V1SeccompProfile(type="RuntimeDefault")
56
+ )
48
57
 
49
58
  AL_ROOT_CA = os.environ.get('AL_ROOT_CA', '/etc/assemblyline/ssl/al_root-ca.crt')
50
59
  AL_ROOT_CA_PK = os.environ.get('AL_ROOT_CA_PK', '/etc/assemblyline/ssl/al_root-ca.key')
@@ -241,7 +250,8 @@ def parse_cpu(string: str) -> float:
241
250
  class KubernetesController(ControllerInterface):
242
251
  def __init__(self, logger, namespace: str, prefix: str, priority: str, dependency_priority: str,
243
252
  cpu_reservation: float, linux_node_selector: Selector, labels=None, log_level="INFO", core_env={},
244
- default_service_account=None, cluster_pod_list=True, default_service_tolerations = [],
253
+ default_service_account=None, cluster_pod_list=True, enable_pod_security=False,
254
+ default_service_tolerations=[],
245
255
  priv_labels=None):
246
256
  # Try loading a kubernetes connection from either the fact that we are running
247
257
  # inside of a cluster, or have a config file that tells us how
@@ -287,6 +297,7 @@ class KubernetesController(ControllerInterface):
287
297
  self._service_limited_env: dict[str, dict[str, str]] = defaultdict(dict)
288
298
  self.default_service_account: Optional[str] = default_service_account
289
299
  self.cluster_pod_list = cluster_pod_list
300
+ self.security_policy = RESTRICTED_POD_SECURITY_CONTEXT if enable_pod_security else None
290
301
  self.default_service_tolerations = [V1Toleration(**toleration.as_primitives()) for toleration in default_service_tolerations]
291
302
 
292
303
  # A record of previously reported events so that we don't report the same message repeatedly, fill it with
@@ -396,7 +407,8 @@ class KubernetesController(ControllerInterface):
396
407
  """Tell the controller about a service profile it needs to manage."""
397
408
  self._create_deployment(profile.name, self._deployment_name(profile.name),
398
409
  profile.container_config, profile.shutdown_seconds, scale,
399
- change_key=profile.config_blob, core_mounts=profile.privileged)
410
+ change_key=profile.config_blob, core_mounts=profile.privileged,
411
+ security_context=self.security_policy),
400
412
  self._external_profiles[profile.name] = profile
401
413
 
402
414
  def _loop_forever(self, function):
@@ -679,7 +691,7 @@ class KubernetesController(ControllerInterface):
679
691
  return self._quota_mem_limit - self._get_pod_used_namespace_ram(), self._quota_mem_limit
680
692
  return self._node_pool_max_ram - self._get_pod_used_ram(), self._node_pool_max_ram
681
693
 
682
- def _create_containers(self, service_name: str, deployment_name: str, container_config, mounts,
694
+ def _create_containers(self, service_name: str, deployment_name: str, container_config, mounts, security_context,
683
695
  core_container=False):
684
696
  cores = container_config.cpu_cores
685
697
  memory = container_config.ram_mb
@@ -701,8 +713,6 @@ class KubernetesController(ControllerInterface):
701
713
  environment_variables += [V1EnvVar(name=_n, value=_v) for _n, _v in self.core_env.items()]
702
714
  environment_variables.extend(self.core_secret_env)
703
715
  environment_variables.append(V1EnvVar(name='PRIVILEGED', value='true'))
704
- # Overwrite them with configured special environment variables
705
- environment_variables += [V1EnvVar(name=_e.name, value=_e.value) for _e in container_config.environment]
706
716
  # Overwrite those with special hard coded variables
707
717
  environment_variables += [
708
718
  V1EnvVar(name='AL_SERVICE_NAME', value=service_name),
@@ -711,6 +721,8 @@ class KubernetesController(ControllerInterface):
711
721
  # Overwrite ones defined dynamically by dependency container launches
712
722
  for name, value in self._service_limited_env[service_name].items():
713
723
  environment_variables.append(V1EnvVar(name=name, value=value))
724
+ # Overwrite them with configured special environment variables
725
+ environment_variables += [V1EnvVar(name=_e.name, value=_e.value) for _e in container_config.environment]
714
726
  image_pull_policy = 'Always' if DEV_MODE else 'IfNotPresent'
715
727
  return [V1Container(
716
728
  name=deployment_name,
@@ -719,6 +731,7 @@ class KubernetesController(ControllerInterface):
719
731
  env=environment_variables,
720
732
  image_pull_policy=image_pull_policy,
721
733
  volume_mounts=mounts,
734
+ security_context=security_context,
722
735
  resources=V1ResourceRequirements(
723
736
  limits={'cpu': cores, 'memory': f'{memory}Mi'},
724
737
  requests={'cpu': cores*self.cpu_reservation, 'memory': f'{min_memory}Mi'},
@@ -731,7 +744,8 @@ class KubernetesController(ControllerInterface):
731
744
  shutdown_seconds: int, scale: int, labels: dict[str, str] = None,
732
745
  volumes: list[V1Volume] = None, mounts: list[V1VolumeMount] = None,
733
746
  core_mounts: bool = False, change_key: str = '', high_priority: bool = False,
734
- deployment_strategy: V1DeploymentStrategy = V1DeploymentStrategy()):
747
+ deployment_strategy: V1DeploymentStrategy = V1DeploymentStrategy(),
748
+ security_context: V1SecurityContext = None):
735
749
  # Build a cache key to check for changes, just trying to only patch what changed
736
750
  # will still potentially result in a lot of restarts due to different kubernetes
737
751
  # systems returning differently formatted data
@@ -742,7 +756,8 @@ class KubernetesController(ControllerInterface):
742
756
  key_labels += sorted(deployment_labels.items())
743
757
  change_key = str(f"n={deployment_name}{change_key}dc={docker_config}ss={shutdown_seconds}"
744
758
  f"l={key_labels}v={volumes}m={mounts}cm={core_mounts}senv={svc_env}"
745
- f"nodes={field_selector or ''}{label_selector or ''}")
759
+ f"nodes={field_selector or ''}{label_selector or ''}"
760
+ f"security_context={security_context or ''}")
746
761
  self.logger.debug(f"{deployment_name} actual change_key: {change_key}")
747
762
  change_key = str(hash(change_key))
748
763
 
@@ -847,7 +862,7 @@ class KubernetesController(ControllerInterface):
847
862
  init_containers=init_containers,
848
863
  volumes=all_volumes,
849
864
  containers=self._create_containers(service_name, deployment_name, docker_config,
850
- all_mounts, core_container=core_mounts),
865
+ all_mounts, security_context, core_container=core_mounts),
851
866
  priority_class_name=self.dependency_priority if high_priority else self.priority,
852
867
  termination_grace_period_seconds=shutdown_seconds,
853
868
  security_context=V1PodSecurityContext(fs_group=1000),
@@ -952,7 +967,7 @@ class KubernetesController(ControllerInterface):
952
967
  def restart(self, service):
953
968
  self._create_deployment(service.name, self._deployment_name(service.name), service.container_config,
954
969
  service.shutdown_seconds, self.get_target(service.name), core_mounts=service.privileged,
955
- change_key=service.config_blob)
970
+ change_key=service.config_blob, security_context=self.security_policy)
956
971
 
957
972
  def get_running_container_names(self):
958
973
  pods = self.api.list_pod_for_all_namespaces(field_selector='status.phase==Running',
@@ -1135,7 +1150,7 @@ class KubernetesController(ControllerInterface):
1135
1150
  self._create_deployment(service_name, deployment_name, spec.container,
1136
1151
  30, 1, labels, volumes=volumes, mounts=mounts, high_priority=True,
1137
1152
  core_mounts=spec.run_as_core, change_key=change_key,
1138
- deployment_strategy=deployment_strategy)
1153
+ deployment_strategy=deployment_strategy, security_context=self.security_policy)
1139
1154
 
1140
1155
  # Setup a service to direct to the deployment
1141
1156
  try:
@@ -319,6 +319,7 @@ class ScalerServer(ThreadedCoreBase):
319
319
  log_level=self.config.logging.log_level,
320
320
  core_env=core_env,
321
321
  cluster_pod_list=self.config.core.scaler.cluster_pod_list,
322
+ enable_pod_security=self.config.core.scaler.enable_pod_security,
322
323
  default_service_account=self.config.services.service_account,
323
324
  default_service_tolerations=service_defaults_config.tolerations,
324
325
  priv_labels=priv_labels
@@ -15,7 +15,8 @@ import docker
15
15
 
16
16
  from kubernetes.client import V1Job, V1ObjectMeta, V1JobSpec, V1PodTemplateSpec, V1PodSpec, V1Volume, \
17
17
  V1VolumeMount, V1EnvVar, V1Container, V1ResourceRequirements, \
18
- V1ConfigMapVolumeSource, V1Secret, V1SecretVolumeSource, V1LocalObjectReference, V1Toleration
18
+ V1ConfigMapVolumeSource, V1Secret, V1SecretVolumeSource, V1LocalObjectReference, V1Toleration, V1SecurityContext, \
19
+ V1Capabilities, V1SeccompProfile
19
20
  from kubernetes import client, config
20
21
  from kubernetes.client.rest import ApiException
21
22
 
@@ -44,6 +45,14 @@ INHERITED_VARIABLES: list[str] = ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY', 'http
44
45
  CONFIGURATION_HOST_PATH = os.getenv('CONFIGURATION_HOST_PATH', 'service_config')
45
46
  CONFIGURATION_CONFIGMAP = os.getenv('KUBERNETES_AL_CONFIG', None)
46
47
  AL_CORE_NETWORK = os.environ.get("AL_CORE_NETWORK", 'core')
48
+ RESTRICTED_POD_SECUTITY_CONTEXT = V1SecurityContext(
49
+ run_as_user=1000,
50
+ run_as_group=1000,
51
+ capabilities=V1Capabilities(drop=["ALL"]),
52
+ run_as_non_root=True,
53
+ allow_privilege_escalation=False,
54
+ seccomp_profile=V1SeccompProfile(type="RuntimeDefault")
55
+ )
47
56
 
48
57
  SERVICE_API_HOST = os.getenv('SERVICE_API_HOST')
49
58
  RELEASE_NAME = os.getenv('RELEASE_NAME')
@@ -148,7 +157,7 @@ class DockerUpdateInterface:
148
157
 
149
158
  class KubernetesUpdateInterface:
150
159
  def __init__(self, logger, prefix, namespace, priority_class, extra_labels, linux_node_selector: Selector,
151
- log_level="INFO", default_service_account=None, default_service_tolerations=[]):
160
+ log_level="INFO", default_service_account=None, default_service_tolerations=[], enable_pod_security=False):
152
161
  # Try loading a kubernetes connection from either the fact that we are running
153
162
  # inside of a cluster, or we have a configuration in the normal location
154
163
  try:
@@ -182,6 +191,7 @@ class KubernetesUpdateInterface:
182
191
  self.secret_env = []
183
192
  self.linux_node_selector = linux_node_selector
184
193
  self.default_service_tolerations = [V1Toleration(**toleration.as_primitives()) for toleration in default_service_tolerations]
194
+ self.security_policy = RESTRICTED_POD_SECUTITY_CONTEXT if enable_pod_security else None
185
195
 
186
196
 
187
197
  # Get the deployment of this process. Use that information to fill out the secret info
@@ -324,6 +334,7 @@ class KubernetesUpdateInterface:
324
334
  env=environment_variables,
325
335
  image_pull_policy='Always',
326
336
  volume_mounts=volume_mounts,
337
+ security_context=self.security_policy,
327
338
  resources=V1ResourceRequirements(
328
339
  limits={'cpu': cores, 'memory': f'{memory}Mi'},
329
340
  requests={'cpu': cores / 4, 'memory': f'{memory_min}Mi'},
@@ -478,7 +489,8 @@ class ServiceUpdater(ThreadedCoreBase):
478
489
  log_level=self.config.logging.log_level,
479
490
  default_service_account=self.config.services.service_account,
480
491
  linux_node_selector=self.config.core.scaler.linux_node_selector,
481
- default_service_tolerations=self.config.core.scaler.service_defaults.tolerations)
492
+ default_service_tolerations=self.config.core.scaler.service_defaults.tolerations,
493
+ enable_pod_security=self.config.core.scaler.enable_pod_security)
482
494
  # Add all additional mounts to privileged services
483
495
  self.mounts = self.config.core.scaler.service_defaults.mounts
484
496
  else:
@@ -109,6 +109,9 @@ class WorkflowManager(ServerBase):
109
109
  if not workflow.enabled:
110
110
  continue
111
111
 
112
+ # Trigger a heartbeat to let the system know the workflow manager is still alive between tasks
113
+ self.heartbeat()
114
+
112
115
  # Start of transaction
113
116
  if self.apm_client:
114
117
  self.apm_client.begin_transaction("Execute workflows")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: assemblyline-core
3
- Version: 4.5.0.75
3
+ Version: 4.5.0.77
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -1 +0,0 @@
1
- 4.5.0.75