devsecops-engine-tools 1.7.26__py3-none-any.whl → 1.7.28__py3-none-any.whl

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 devsecops-engine-tools might be problematic. Click here for more details.

@@ -66,7 +66,7 @@ def get_inputs_from_cli(args):
66
66
  )
67
67
  parser.add_argument("-fp", "--folder_path", type=str, required=False, help="Folder Path to scan, only apply engine_iac tool")
68
68
  parser.add_argument("-p",
69
- "--platform", type=parse_choices({"all", "docker", "k8s", "cloudformation"}), required=False, default="all" ,help="Platform to scan, only apply engine_iac tool"
69
+ "--platform", type=parse_choices({"all", "docker", "k8s", "cloudformation", "openapi"}), required=False, default="all" ,help="Platform to scan, only apply engine_iac tool"
70
70
  )
71
71
  parser.add_argument(
72
72
  "--use_secrets_manager",
@@ -4,14 +4,23 @@ from devsecops_engine_tools.engine_sast.engine_iac.src.infrastructure.entry_poin
4
4
  from devsecops_engine_tools.engine_sast.engine_iac.src.infrastructure.driven_adapters.checkov.checkov_tool import (
5
5
  CheckovTool
6
6
  )
7
+ from devsecops_engine_tools.engine_sast.engine_iac.src.infrastructure.driven_adapters.kubescape.kubescape_tool import (
8
+ KubescapeTool
9
+ )
7
10
 
8
11
 
9
12
  def runner_engine_iac(dict_args, tool, secret_tool, devops_platform_gateway, env):
10
13
  try:
11
14
  # Define driven adapters for gateways
12
15
  tool_gateway = None
13
- if (tool == "CHECKOV"):
14
- tool_gateway = CheckovTool()
16
+
17
+ tools = {
18
+ "CHECKOV": CheckovTool(),
19
+ "KUBESCAPE": KubescapeTool(),
20
+ }
21
+
22
+ if tool in tools:
23
+ tool_gateway = tools[tool]
15
24
 
16
25
  return init_engine_sast_rm(
17
26
  devops_platform_gateway=devops_platform_gateway,
@@ -37,8 +37,8 @@ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
37
37
  class CheckovTool(ToolGateway):
38
38
  CHECKOV_CONFIG_FILE = "checkov_config.yaml"
39
39
  TOOL = "CHECKOV"
40
- framework_mapping = {"RULES_DOCKER": "dockerfile", "RULES_K8S": "kubernetes", "RULES_CLOUDFORMATION": "cloudformation"}
41
- framework_external_checks = ["RULES_K8S", "RULES_CLOUDFORMATION","RULES_DOCKER"]
40
+ framework_mapping = {"RULES_DOCKER": "dockerfile", "RULES_K8S": "kubernetes", "RULES_CLOUDFORMATION": "cloudformation", "RULES_OPENAPI": "openapi"}
41
+ framework_external_checks = ["RULES_K8S", "RULES_CLOUDFORMATION","RULES_DOCKER", "RULES_OPENAPI"]
42
42
 
43
43
 
44
44
  def create_config_file(self, checkov_config: CheckovConfig):
@@ -0,0 +1,75 @@
1
+ from devsecops_engine_tools.engine_core.src.domain.model.finding import (
2
+ Category,
3
+ Finding,
4
+ )
5
+ from datetime import datetime
6
+ from dataclasses import dataclass
7
+
8
+
9
+ @dataclass
10
+ class KubescapeDeserealizator:
11
+ def get_list_finding(self, results_scan_list: list) -> "list[Finding]":
12
+ list_open_findings = []
13
+
14
+ for result in results_scan_list:
15
+ finding_open = Finding(
16
+ id=result.get("id"),
17
+ cvss=None,
18
+ where=result.get("where"),
19
+ description=result.get("description"),
20
+ severity=result.get("severity").lower(),
21
+ identification_date=datetime.now().strftime("%d%m%Y"),
22
+ published_date_cve=None,
23
+ module="engine_iac",
24
+ category=Category.VULNERABILITY,
25
+ requirements=None,
26
+ tool="kubescape"
27
+ )
28
+ list_open_findings.append(finding_open)
29
+
30
+ return list_open_findings
31
+
32
+ def extract_failed_controls(self, data):
33
+ result_extracted_data = []
34
+ results = data.get("results", [])
35
+ resources = {resource.get("resourceID"): resource for resource in data.get("resources", [])}
36
+ frameworks = data.get("summaryDetails", {}).get("frameworks", [])
37
+
38
+ for result in results:
39
+ resource_id = result.get("resourceID")
40
+ controls = result.get("controls", [])
41
+
42
+ for control in controls:
43
+ if control.get("status", {}).get("status") == "failed":
44
+ control_id = control.get("controlID")
45
+ name = control.get("name")
46
+ resource = resources.get(resource_id)
47
+
48
+ if resource:
49
+ relative_path = resource.get("source", {}).get("path", "").replace("\\", "/")
50
+ severity_score = self.get_severity_score(frameworks, control_id)
51
+
52
+ result_extracted_data.append({
53
+ "id": control_id,
54
+ "description": name,
55
+ "where": relative_path,
56
+ "severity": severity_score
57
+ })
58
+
59
+ return result_extracted_data
60
+
61
+ def get_severity_score(self, frameworks, control_id):
62
+ classifications = {
63
+ (0.0, 0.0): "none",
64
+ (0.1, 3.9): "low",
65
+ (4.0, 6.9): "medium",
66
+ (7.0, 8.9): "high",
67
+ (9.0, 10.0): "critical"
68
+ }
69
+ for framework in frameworks:
70
+ control_object = framework.get("controls", {}).get(control_id, {})
71
+ if control_object:
72
+ for range_tuple, classification in classifications.items():
73
+ if range_tuple[0] <= control_object.get("scoreFactor", 0.0) <= range_tuple[1]:
74
+ return classification
75
+ return None
@@ -0,0 +1,123 @@
1
+ import json
2
+ import subprocess
3
+ import platform
4
+ import requests
5
+ import distro
6
+ import os
7
+ from devsecops_engine_tools.engine_sast.engine_iac.src.domain.model.gateways.tool_gateway import (
8
+ ToolGateway,
9
+ )
10
+ from devsecops_engine_tools.engine_sast.engine_iac.src.domain.model.config_tool import (
11
+ ConfigTool,
12
+ )
13
+ from devsecops_engine_tools.engine_sast.engine_iac.src.infrastructure.driven_adapters.kubescape.kubescape_deserealizator import (
14
+ KubescapeDeserealizator,
15
+ )
16
+ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
17
+ from devsecops_engine_tools.engine_utilities import settings
18
+
19
+ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
20
+
21
+
22
+ class KubescapeTool(ToolGateway):
23
+
24
+ def download_tool(self, file, url):
25
+ try:
26
+ response = requests.get(url, allow_redirects=True)
27
+ with open(file, "wb") as binary_file:
28
+ binary_file.write(response.content)
29
+ except Exception as e:
30
+ logger.error(f"Error downloading Kubescape: {e}")
31
+
32
+ def install_tool(self, file, url):
33
+ installed = subprocess.run(
34
+ ["which", f"./{file}"],
35
+ stdout=subprocess.PIPE,
36
+ stderr=subprocess.PIPE,
37
+ )
38
+ if installed.returncode == 1:
39
+ try:
40
+ self.download_tool(file, url)
41
+ subprocess.run(["chmod", "+x", f"./{file}"])
42
+
43
+ except Exception as e:
44
+ logger.error(f"Error installing Kubescape: {e}")
45
+
46
+ def install_tool_windows(self, file, url):
47
+ try:
48
+ subprocess.run(
49
+ [f"./{file}", "version"],
50
+ stdout=subprocess.PIPE,
51
+ stderr=subprocess.PIPE,
52
+ )
53
+ except:
54
+ try:
55
+ self.download_tool(file, url)
56
+
57
+ except Exception as e:
58
+ logger.error(f"Error installing Kubescape: {e}")
59
+
60
+ def execute_kubescape(self, folders_to_scan, prefix):
61
+ command = [prefix, "scan"] + folders_to_scan + ["--format", "json", "--format-version", "v2", "--output",
62
+ "results_kubescape.json", "-v"]
63
+ try:
64
+ subprocess.run(command, capture_output=True)
65
+ except subprocess.CalledProcessError as e:
66
+ logger.error(f"Error during Kubescape execution: {e}")
67
+
68
+ def load_json(self, json_name):
69
+ try:
70
+ with open(json_name) as file:
71
+ return json.load(file)
72
+ except FileNotFoundError:
73
+ logger.error(f"The file {json_name} does not exist.")
74
+ except json.JSONDecodeError:
75
+ logger.error("The JSON result is empty.")
76
+ return None
77
+
78
+ def select_operative_system(self, os_platform, folders_to_scan, base_url):
79
+ if os_platform == "Linux":
80
+ distro_name = distro.name()
81
+ if distro_name == "Ubuntu":
82
+ file = "kubescape-ubuntu-latest"
83
+ self.install_tool(file, base_url + file)
84
+ command_prefix = f"./{file}"
85
+ else:
86
+ logger.warning(f"{distro_name} is not supported.")
87
+ return None
88
+ elif os_platform == "Windows":
89
+ file = "kubescape-windows-latest.exe"
90
+ self.install_tool_windows(file, base_url + file)
91
+ command_prefix = f"./{file}"
92
+ elif os_platform == "Darwin":
93
+ file = "kubescape-macos-latest"
94
+ self.install_tool(file, base_url + file)
95
+ command_prefix = f"./{file}"
96
+ else:
97
+ logger.warning(f"{os_platform} is not supported.")
98
+ return [], None
99
+
100
+ self.execute_kubescape(folders_to_scan, command_prefix)
101
+
102
+ def run_tool(self, config_tool: ConfigTool, folders_to_scan, environment, platform_to_scan, secret_tool):
103
+
104
+ if folders_to_scan and "k8s" in platform_to_scan:
105
+
106
+ kubescape_version = config_tool.version
107
+ os_platform = platform.system()
108
+ base_url = f"https://github.com/kubescape/kubescape/releases/download/v{kubescape_version}/"
109
+ self.select_operative_system(os_platform, folders_to_scan, base_url)
110
+
111
+ json_name = "results_kubescape.json"
112
+ data = self.load_json(json_name)
113
+
114
+ if not data:
115
+ return [], None
116
+ else:
117
+ kubescape_deserealizator = KubescapeDeserealizator()
118
+ result_extracted_data = kubescape_deserealizator.extract_failed_controls(data)
119
+ finding_list = kubescape_deserealizator.get_list_finding(result_extracted_data)
120
+ path_results = os.path.abspath(json_name)
121
+ return finding_list, path_results
122
+ else:
123
+ return [], None
@@ -71,4 +71,4 @@ def update_fields(check_result, rules_doc):
71
71
  if "category" in rule_info:
72
72
  check_result["bc_category"] = rule_info["category"]
73
73
 
74
- return check_result
74
+ return check_result
@@ -1 +1 @@
1
- version = '1.7.26'
1
+ version = '1.7.28'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: devsecops-engine-tools
3
- Version: 1.7.26
3
+ Version: 1.7.28
4
4
  Summary: Tool for DevSecOps strategy
5
5
  Home-page: https://github.com/bancolombia/devsecops-engine-tools
6
6
  Author: Bancolombia DevSecOps Team
@@ -1,9 +1,9 @@
1
1
  devsecops_engine_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- devsecops_engine_tools/version.py,sha256=ntcVIGU3rTaTr7jBva_BCEg_M16GEcRd0AGKfA-k8Ew,19
2
+ devsecops_engine_tools/version.py,sha256=Q3PJdDdf_B2gJ6IaUQN395iTa-ObROrwbBzv1uMvPfQ,19
3
3
  devsecops_engine_tools/engine_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  devsecops_engine_tools/engine_core/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  devsecops_engine_tools/engine_core/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- devsecops_engine_tools/engine_core/src/applications/runner_engine_core.py,sha256=4eJwsuSRAD3psUBvWZVWu9XR9rwvagFs6FqnKFz0eEU,5965
6
+ devsecops_engine_tools/engine_core/src/applications/runner_engine_core.py,sha256=qvpDSHuuTamuD_NOgDxyVJjhPRMzpbtp516NF7_-26w,5976
7
7
  devsecops_engine_tools/engine_core/src/deployment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  devsecops_engine_tools/engine_core/src/deployment/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  devsecops_engine_tools/engine_core/src/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -81,7 +81,7 @@ devsecops_engine_tools/engine_sast/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQe
81
81
  devsecops_engine_tools/engine_sast/engine_iac/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
82
  devsecops_engine_tools/engine_sast/engine_iac/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
83
  devsecops_engine_tools/engine_sast/engine_iac/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- devsecops_engine_tools/engine_sast/engine_iac/src/applications/runner_iac_scan.py,sha256=WDHRpcbF80gv6Rv4U0l0HtM85_H4WrY-YCW6JfpuRPo,909
84
+ devsecops_engine_tools/engine_sast/engine_iac/src/applications/runner_iac_scan.py,sha256=6iHwgOQLu3rXyyQrlt7gxAsfOlLwupvyum7ejziX-dg,1151
85
85
  devsecops_engine_tools/engine_sast/engine_iac/src/deployment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
86
  devsecops_engine_tools/engine_sast/engine_iac/src/deployment/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  devsecops_engine_tools/engine_sast/engine_iac/src/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -96,11 +96,14 @@ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters
96
96
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
97
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/checkov_config.py,sha256=qbE6wUO5_WFXF_QolL0JYelaRGEOUakPEZR_6HAKzzI,4355
98
98
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/checkov_deserealizator.py,sha256=gBwnQ20QExHTrN1nvErUUqb_IMHvYKJijqc55XwZHQk,1404
99
- devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/checkov_tool.py,sha256=SrEH7SnPLIMjP4OgSXvuntZJFfttgoTVjaitwLCCGhU,7619
99
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/checkov_tool.py,sha256=ddPjhbOe2w-kQmiBLP6udBPmXZhVZqQLwOEdgvt1r1s,7664
100
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/kubescape_deserealizator.py,sha256=i-hKFmR-OriwiiBg-3E3RKc7hjI1E8jv8Z7dQ8_Q0qE,2885
102
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/kubescape_tool.py,sha256=wcornvTaU5o2MtZj_KkgWvNABW2rCd08sZkaMbbZoTI,4707
100
103
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
104
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/entry_points/entry_point_tool.py,sha256=60iaHYZZp5uTngD7a8vsQaQYsTfBzP_kp0xflfPNnk4,305
102
105
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
- devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/helpers/file_generator_tool.py,sha256=lim8ARYvVT6a2Affqw4QVxhV_wq3aKiGf-2VUskSXII,3083
106
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/helpers/file_generator_tool.py,sha256=stC0z4e20DGRAjKMp7q7cYSYkEXssvnSeGEB0xhbXSo,3084
104
107
  devsecops_engine_tools/engine_sast/engine_secret/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
108
  devsecops_engine_tools/engine_sast/engine_secret/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
109
  devsecops_engine_tools/engine_sast/engine_secret/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -244,8 +247,8 @@ devsecops_engine_tools/engine_utilities/utils/logger_info.py,sha256=4Mz8Bwlm9Mku
244
247
  devsecops_engine_tools/engine_utilities/utils/name_conversion.py,sha256=ADJrRGaxYSDe0ZRh6VHRf53H4sXPcb-vNP_i81PUn3I,307
245
248
  devsecops_engine_tools/engine_utilities/utils/printers.py,sha256=GAslbWaBpwP3mP6fBsgVl07TTBgcCggQTy8h2M9ibeo,612
246
249
  devsecops_engine_tools/engine_utilities/utils/session_manager.py,sha256=yNtlT-8Legz1sHbGPH8LNYjL-LgDUE0zXG2rYjiab7U,290
247
- devsecops_engine_tools-1.7.26.dist-info/METADATA,sha256=gy3XB7jW9FcTnhy_76T90F0YWhGfHoB26UJi2sHhf8Y,4881
248
- devsecops_engine_tools-1.7.26.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
249
- devsecops_engine_tools-1.7.26.dist-info/entry_points.txt,sha256=9IjXF_7Zpgowq_SY6OSmsA9vZze18a8_AeHwkQVrgKk,131
250
- devsecops_engine_tools-1.7.26.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
251
- devsecops_engine_tools-1.7.26.dist-info/RECORD,,
250
+ devsecops_engine_tools-1.7.28.dist-info/METADATA,sha256=Kb4NxYtrqyX7L5poctyomqPCKEj_Ahri9PdWg2R3XVM,4881
251
+ devsecops_engine_tools-1.7.28.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
252
+ devsecops_engine_tools-1.7.28.dist-info/entry_points.txt,sha256=9IjXF_7Zpgowq_SY6OSmsA9vZze18a8_AeHwkQVrgKk,131
253
+ devsecops_engine_tools-1.7.28.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
254
+ devsecops_engine_tools-1.7.28.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (70.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5