sraverify 0.1.0__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.
- sraverify/__init__.py +36 -0
- sraverify/checks/__init__.py +56 -0
- sraverify/checks/accessanalyzer/SRA_IAA_1.py +188 -0
- sraverify/checks/accessanalyzer/SRA_IAA_2.py +162 -0
- sraverify/checks/accessanalyzer/SRA_IAA_3.py +260 -0
- sraverify/checks/accessanalyzer/SRA_IAA_4.py +207 -0
- sraverify/checks/accessanalyzer/__init__.py +3 -0
- sraverify/checks/cloudtrail/SRA-CT-1.py +220 -0
- sraverify/checks/cloudtrail/SRA-CT-10.py +229 -0
- sraverify/checks/cloudtrail/SRA-CT-11.py +242 -0
- sraverify/checks/cloudtrail/SRA-CT-12.py +163 -0
- sraverify/checks/cloudtrail/SRA-CT-13.py +279 -0
- sraverify/checks/cloudtrail/SRA-CT-2.py +218 -0
- sraverify/checks/cloudtrail/SRA-CT-3.py +196 -0
- sraverify/checks/cloudtrail/SRA-CT-4.py +161 -0
- sraverify/checks/cloudtrail/SRA-CT-5.py +200 -0
- sraverify/checks/cloudtrail/SRA-CT-6.py +161 -0
- sraverify/checks/cloudtrail/SRA-CT-7.py +194 -0
- sraverify/checks/cloudtrail/SRA-CT-8.py +226 -0
- sraverify/checks/cloudtrail/SRA-CT-9.py +226 -0
- sraverify/checks/cloudtrail/__init__.py +3 -0
- sraverify/checks/config/SRA-CONFIG-1.py +197 -0
- sraverify/checks/config/__init__.py +3 -0
- sraverify/core/__init__.py +3 -0
- sraverify/core/check.py +227 -0
- sraverify/core/logging.py +37 -0
- sraverify/core/session.py +47 -0
- sraverify/lib/__init__.py +4 -0
- sraverify/lib/audit_info.py +37 -0
- sraverify/lib/banner.py +42 -0
- sraverify/lib/check_loader.py +80 -0
- sraverify/lib/org_mgmt_checker.py +86 -0
- sraverify/lib/outputs.py +46 -0
- sraverify/lib/progress.py +75 -0
- sraverify/lib/regions.py +27 -0
- sraverify/lib/session.py +23 -0
- sraverify/main.py +350 -0
- sraverify/services/__init__.py +3 -0
- sraverify/services/accessanalyzer/__init__.py +15 -0
- sraverify/services/accessanalyzer/base.py +123 -0
- sraverify/services/accessanalyzer/checks/__init__.py +3 -0
- sraverify/services/accessanalyzer/checks/sra_accessanalyzer_01.py +82 -0
- sraverify/services/accessanalyzer/checks/sra_accessanalyzer_02.py +82 -0
- sraverify/services/accessanalyzer/checks/sra_accessanalyzer_03.py +103 -0
- sraverify/services/accessanalyzer/checks/sra_accessanalyzer_04.py +139 -0
- sraverify/services/accessanalyzer/client.py +123 -0
- sraverify/services/account/__init__.py +9 -0
- sraverify/services/account/base.py +56 -0
- sraverify/services/account/checks/__init__.py +1 -0
- sraverify/services/account/checks/sra_account_01.py +65 -0
- sraverify/services/account/checks/sra_account_02.py +63 -0
- sraverify/services/account/checks/sra_account_03.py +63 -0
- sraverify/services/account/client.py +51 -0
- sraverify/services/auditmanager/__init__.py +10 -0
- sraverify/services/auditmanager/base.py +72 -0
- sraverify/services/auditmanager/checks/__init__.py +1 -0
- sraverify/services/auditmanager/checks/sra_auditmanager_01.py +58 -0
- sraverify/services/auditmanager/checks/sra_auditmanager_02.py +80 -0
- sraverify/services/auditmanager/client.py +58 -0
- sraverify/services/cloudtrail/__init__.py +33 -0
- sraverify/services/cloudtrail/base.py +167 -0
- sraverify/services/cloudtrail/checks/__init__.py +1 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_01.py +83 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_02.py +99 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_03.py +94 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_04.py +92 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_05.py +106 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_06.py +93 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_07.py +96 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_08.py +145 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_09.py +167 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_10.py +162 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_11.py +178 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_12.py +77 -0
- sraverify/services/cloudtrail/checks/sra_cloudtrail_13.py +120 -0
- sraverify/services/cloudtrail/client.py +118 -0
- sraverify/services/config/__init__.py +25 -0
- sraverify/services/config/base.py +249 -0
- sraverify/services/config/checks/__init__.py +1 -0
- sraverify/services/config/checks/sra_config_01.py +123 -0
- sraverify/services/config/checks/sra_config_02.py +156 -0
- sraverify/services/config/checks/sra_config_03.py +149 -0
- sraverify/services/config/checks/sra_config_04.py +104 -0
- sraverify/services/config/checks/sra_config_05.py +104 -0
- sraverify/services/config/checks/sra_config_06.py +194 -0
- sraverify/services/config/checks/sra_config_07.py +162 -0
- sraverify/services/config/checks/sra_config_08.py +185 -0
- sraverify/services/config/checks/sra_config_09.py +177 -0
- sraverify/services/config/client.py +264 -0
- sraverify/services/ec2/__init__.py +8 -0
- sraverify/services/ec2/base.py +75 -0
- sraverify/services/ec2/checks/__init__.py +1 -0
- sraverify/services/ec2/checks/sra_ec2_01.py +83 -0
- sraverify/services/ec2/client.py +63 -0
- sraverify/services/firewallmanager/__init__.py +23 -0
- sraverify/services/firewallmanager/base.py +48 -0
- sraverify/services/firewallmanager/checks/__init__.py +1 -0
- sraverify/services/firewallmanager/checks/sra_firewallmanager_01.py +75 -0
- sraverify/services/firewallmanager/checks/sra_firewallmanager_02.py +57 -0
- sraverify/services/firewallmanager/checks/sra_firewallmanager_03.py +51 -0
- sraverify/services/firewallmanager/checks/sra_firewallmanager_04.py +51 -0
- sraverify/services/firewallmanager/checks/sra_firewallmanager_05.py +51 -0
- sraverify/services/firewallmanager/checks/sra_firewallmanager_06.py +51 -0
- sraverify/services/firewallmanager/checks/sra_firewallmanager_07.py +51 -0
- sraverify/services/firewallmanager/checks/sra_firewallmanager_08.py +61 -0
- sraverify/services/firewallmanager/checks/sra_firewallmanager_09.py +61 -0
- sraverify/services/firewallmanager/checks/sra_firewallmanager_10.py +71 -0
- sraverify/services/firewallmanager/client.py +40 -0
- sraverify/services/guardduty/__init__.py +58 -0
- sraverify/services/guardduty/base.py +207 -0
- sraverify/services/guardduty/checks/__init__.py +3 -0
- sraverify/services/guardduty/checks/sra_guardduty_01.py +51 -0
- sraverify/services/guardduty/checks/sra_guardduty_02.py +80 -0
- sraverify/services/guardduty/checks/sra_guardduty_03.py +77 -0
- sraverify/services/guardduty/checks/sra_guardduty_04.py +84 -0
- sraverify/services/guardduty/checks/sra_guardduty_05.py +84 -0
- sraverify/services/guardduty/checks/sra_guardduty_06.py +84 -0
- sraverify/services/guardduty/checks/sra_guardduty_07.py +85 -0
- sraverify/services/guardduty/checks/sra_guardduty_08.py +83 -0
- sraverify/services/guardduty/checks/sra_guardduty_09.py +84 -0
- sraverify/services/guardduty/checks/sra_guardduty_10.py +83 -0
- sraverify/services/guardduty/checks/sra_guardduty_11.py +93 -0
- sraverify/services/guardduty/checks/sra_guardduty_12.py +83 -0
- sraverify/services/guardduty/checks/sra_guardduty_13.py +90 -0
- sraverify/services/guardduty/checks/sra_guardduty_14.py +136 -0
- sraverify/services/guardduty/checks/sra_guardduty_15.py +94 -0
- sraverify/services/guardduty/checks/sra_guardduty_16.py +94 -0
- sraverify/services/guardduty/checks/sra_guardduty_17.py +91 -0
- sraverify/services/guardduty/checks/sra_guardduty_18.py +91 -0
- sraverify/services/guardduty/checks/sra_guardduty_19.py +91 -0
- sraverify/services/guardduty/checks/sra_guardduty_20.py +111 -0
- sraverify/services/guardduty/checks/sra_guardduty_21.py +112 -0
- sraverify/services/guardduty/checks/sra_guardduty_22.py +111 -0
- sraverify/services/guardduty/checks/sra_guardduty_23.py +154 -0
- sraverify/services/guardduty/checks/sra_guardduty_24.py +111 -0
- sraverify/services/guardduty/checks/sra_guardduty_25.py +111 -0
- sraverify/services/guardduty/client.py +107 -0
- sraverify/services/inspector/__init__.py +29 -0
- sraverify/services/inspector/base.py +233 -0
- sraverify/services/inspector/checks/__init__.py +3 -0
- sraverify/services/inspector/checks/sra_inspector_01.py +69 -0
- sraverify/services/inspector/checks/sra_inspector_02.py +68 -0
- sraverify/services/inspector/checks/sra_inspector_03.py +68 -0
- sraverify/services/inspector/checks/sra_inspector_04.py +70 -0
- sraverify/services/inspector/checks/sra_inspector_05.py +69 -0
- sraverify/services/inspector/checks/sra_inspector_06.py +115 -0
- sraverify/services/inspector/checks/sra_inspector_07.py +109 -0
- sraverify/services/inspector/checks/sra_inspector_08.py +69 -0
- sraverify/services/inspector/checks/sra_inspector_09.py +69 -0
- sraverify/services/inspector/checks/sra_inspector_10.py +69 -0
- sraverify/services/inspector/checks/sra_inspector_11.py +69 -0
- sraverify/services/inspector/client.py +99 -0
- sraverify/services/macie/__init__.py +27 -0
- sraverify/services/macie/base.py +271 -0
- sraverify/services/macie/checks/__init__.py +1 -0
- sraverify/services/macie/checks/sra_macie_01.py +100 -0
- sraverify/services/macie/checks/sra_macie_02.py +102 -0
- sraverify/services/macie/checks/sra_macie_03.py +152 -0
- sraverify/services/macie/checks/sra_macie_04.py +120 -0
- sraverify/services/macie/checks/sra_macie_05.py +85 -0
- sraverify/services/macie/checks/sra_macie_06.py +124 -0
- sraverify/services/macie/checks/sra_macie_07.py +138 -0
- sraverify/services/macie/checks/sra_macie_08.py +82 -0
- sraverify/services/macie/checks/sra_macie_09.py +103 -0
- sraverify/services/macie/checks/sra_macie_10.py +81 -0
- sraverify/services/macie/client.py +220 -0
- sraverify/services/s3/__init__.py +16 -0
- sraverify/services/s3/base.py +69 -0
- sraverify/services/s3/checks/__init__.py +1 -0
- sraverify/services/s3/checks/sra_s3_01.py +89 -0
- sraverify/services/s3/checks/sra_s3_02.py +89 -0
- sraverify/services/s3/checks/sra_s3_03.py +88 -0
- sraverify/services/s3/checks/sra_s3_04.py +88 -0
- sraverify/services/s3/client.py +52 -0
- sraverify/services/securityhub/__init__.py +27 -0
- sraverify/services/securityhub/base.py +349 -0
- sraverify/services/securityhub/checks/__init__.py +1 -0
- sraverify/services/securityhub/checks/sra_securityhub_01.py +115 -0
- sraverify/services/securityhub/checks/sra_securityhub_02.py +114 -0
- sraverify/services/securityhub/checks/sra_securityhub_03.py +136 -0
- sraverify/services/securityhub/checks/sra_securityhub_04.py +75 -0
- sraverify/services/securityhub/checks/sra_securityhub_05.py +102 -0
- sraverify/services/securityhub/checks/sra_securityhub_06.py +113 -0
- sraverify/services/securityhub/checks/sra_securityhub_07.py +121 -0
- sraverify/services/securityhub/checks/sra_securityhub_08.py +113 -0
- sraverify/services/securityhub/checks/sra_securityhub_09.py +100 -0
- sraverify/services/securityhub/checks/sra_securityhub_10.py +94 -0
- sraverify/services/securityhub/checks/sra_securityhub_11.py +73 -0
- sraverify/services/securityhub/client.py +249 -0
- sraverify/services/securityincidentresponse/__init__.py +13 -0
- sraverify/services/securityincidentresponse/base.py +95 -0
- sraverify/services/securityincidentresponse/checks/__init__.py +1 -0
- sraverify/services/securityincidentresponse/checks/sra_securityincidentresponse_01.py +77 -0
- sraverify/services/securityincidentresponse/checks/sra_securityincidentresponse_02.py +72 -0
- sraverify/services/securityincidentresponse/checks/sra_securityincidentresponse_03.py +86 -0
- sraverify/services/securityincidentresponse/checks/sra_securityincidentresponse_04.py +117 -0
- sraverify/services/securityincidentresponse/checks/sra_securityincidentresponse_05.py +55 -0
- sraverify/services/securityincidentresponse/client.py +71 -0
- sraverify/services/securitylake/__init__.py +39 -0
- sraverify/services/securitylake/base.py +461 -0
- sraverify/services/securitylake/checks/__init__.py +1 -0
- sraverify/services/securitylake/checks/sra_securitylake_01.py +98 -0
- sraverify/services/securitylake/checks/sra_securitylake_02.py +133 -0
- sraverify/services/securitylake/checks/sra_securitylake_03.py +116 -0
- sraverify/services/securitylake/checks/sra_securitylake_04.py +72 -0
- sraverify/services/securitylake/checks/sra_securitylake_05.py +116 -0
- sraverify/services/securitylake/checks/sra_securitylake_06.py +104 -0
- sraverify/services/securitylake/checks/sra_securitylake_07.py +108 -0
- sraverify/services/securitylake/checks/sra_securitylake_08.py +107 -0
- sraverify/services/securitylake/checks/sra_securitylake_09.py +107 -0
- sraverify/services/securitylake/checks/sra_securitylake_10.py +106 -0
- sraverify/services/securitylake/checks/sra_securitylake_11.py +109 -0
- sraverify/services/securitylake/checks/sra_securitylake_12.py +108 -0
- sraverify/services/securitylake/checks/sra_securitylake_13.py +108 -0
- sraverify/services/securitylake/checks/sra_securitylake_14.py +72 -0
- sraverify/services/securitylake/checks/sra_securitylake_15.py +120 -0
- sraverify/services/securitylake/checks/sra_securitylake_16.py +104 -0
- sraverify/services/securitylake/checks/sra_securitylake_17.py +103 -0
- sraverify/services/securitylake/client.py +247 -0
- sraverify/services/shield/__init__.py +33 -0
- sraverify/services/shield/base.py +199 -0
- sraverify/services/shield/checks/__init__.py +1 -0
- sraverify/services/shield/checks/sra_shield_01.py +68 -0
- sraverify/services/shield/checks/sra_shield_02.py +77 -0
- sraverify/services/shield/checks/sra_shield_03.py +84 -0
- sraverify/services/shield/checks/sra_shield_04.py +84 -0
- sraverify/services/shield/checks/sra_shield_05.py +84 -0
- sraverify/services/shield/checks/sra_shield_06.py +84 -0
- sraverify/services/shield/checks/sra_shield_07.py +84 -0
- sraverify/services/shield/checks/sra_shield_08.py +69 -0
- sraverify/services/shield/checks/sra_shield_09.py +86 -0
- sraverify/services/shield/checks/sra_shield_10.py +100 -0
- sraverify/services/shield/checks/sra_shield_11.py +71 -0
- sraverify/services/shield/checks/sra_shield_12.py +130 -0
- sraverify/services/shield/checks/sra_shield_13.py +112 -0
- sraverify/services/shield/checks/sra_shield_14.py +111 -0
- sraverify/services/shield/client.py +214 -0
- sraverify/services/waf/__init__.py +21 -0
- sraverify/services/waf/base.py +100 -0
- sraverify/services/waf/checks/__init__.py +1 -0
- sraverify/services/waf/checks/sra_waf_01.py +63 -0
- sraverify/services/waf/checks/sra_waf_02.py +82 -0
- sraverify/services/waf/checks/sra_waf_03.py +123 -0
- sraverify/services/waf/checks/sra_waf_04.py +94 -0
- sraverify/services/waf/checks/sra_waf_05.py +94 -0
- sraverify/services/waf/checks/sra_waf_06.py +91 -0
- sraverify/services/waf/checks/sra_waf_07.py +94 -0
- sraverify/services/waf/checks/sra_waf_08.py +66 -0
- sraverify/services/waf/checks/sra_waf_09.py +95 -0
- sraverify/services/waf/client.py +109 -0
- sraverify/utils/__init__.py +3 -0
- sraverify/utils/banner.py +65 -0
- sraverify/utils/outputs.py +57 -0
- sraverify/utils/progress.py +97 -0
- sraverify-0.1.0.dist-info/LICENSE +175 -0
- sraverify-0.1.0.dist-info/METADATA +516 -0
- sraverify-0.1.0.dist-info/NOTICE +1 -0
- sraverify-0.1.0.dist-info/RECORD +261 -0
- sraverify-0.1.0.dist-info/WHEEL +5 -0
- sraverify-0.1.0.dist-info/entry_points.txt +2 -0
- sraverify-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check if GuardDuty has VPC flow logs enabled as a log source.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any
|
|
5
|
+
from sraverify.services.guardduty.base import GuardDutyCheck
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SRA_GUARDDUTY_05(GuardDutyCheck):
|
|
9
|
+
"""Check if GuardDuty has VPC flow logs enabled as a log source."""
|
|
10
|
+
|
|
11
|
+
def __init__(self):
|
|
12
|
+
"""Initialize GuardDuty VPC flow logs check."""
|
|
13
|
+
super().__init__()
|
|
14
|
+
self.check_id = "SRA-GUARDDUTY-05"
|
|
15
|
+
self.check_name = "GuardDuty VPC flow logs enabled"
|
|
16
|
+
self.description = ("This check verifies that GuardDuty has VPC flow logs as one of the log sources, "
|
|
17
|
+
"enabled.GuardDuty analyzes your VPC flow logs from Amazon EC2 instances within your account. "
|
|
18
|
+
"It consumes VPC flow log events directly from the VPC Flow Logs feature through an independent "
|
|
19
|
+
"and duplicated stream of flow logs.")
|
|
20
|
+
self.severity = "MEDIUM"
|
|
21
|
+
self.check_logic = "Get detector details in each Region. Check if VPC Flow logs are enabled in the Features array."
|
|
22
|
+
|
|
23
|
+
def execute(self) -> List[Dict[str, Any]]:
|
|
24
|
+
"""
|
|
25
|
+
Execute the check.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
List of findings
|
|
29
|
+
"""
|
|
30
|
+
findings = []
|
|
31
|
+
# Check all regions
|
|
32
|
+
for region in self.regions:
|
|
33
|
+
detector_id = self.get_detector_id(region)
|
|
34
|
+
|
|
35
|
+
# Handle regions where we can't access GuardDuty
|
|
36
|
+
if not detector_id:
|
|
37
|
+
findings.append(self.create_finding(
|
|
38
|
+
status="ERROR",
|
|
39
|
+
region=region,
|
|
40
|
+
resource_id=f"guardduty:{region}",
|
|
41
|
+
actual_value="Unable to access GuardDuty in this region",
|
|
42
|
+
remediation="Check permissions or if GuardDuty is supported in this region"
|
|
43
|
+
))
|
|
44
|
+
continue
|
|
45
|
+
|
|
46
|
+
# Get detector details
|
|
47
|
+
detector_details = self.get_detector_details(region)
|
|
48
|
+
|
|
49
|
+
if detector_details:
|
|
50
|
+
# Check if VPC flow logs are enabled in the Features array
|
|
51
|
+
vpc_logs_enabled = False
|
|
52
|
+
features = detector_details.get('Features', [])
|
|
53
|
+
|
|
54
|
+
for feature in features:
|
|
55
|
+
if feature.get('Name') == 'FLOW_LOGS' and feature.get('Status') == 'ENABLED':
|
|
56
|
+
vpc_logs_enabled = True
|
|
57
|
+
break
|
|
58
|
+
|
|
59
|
+
if vpc_logs_enabled:
|
|
60
|
+
findings.append(self.create_finding(
|
|
61
|
+
status="PASS",
|
|
62
|
+
region=region,
|
|
63
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
64
|
+
actual_value="VPC flow logs are enabled as a data source",
|
|
65
|
+
remediation=""
|
|
66
|
+
))
|
|
67
|
+
else:
|
|
68
|
+
findings.append(self.create_finding(
|
|
69
|
+
status="FAIL",
|
|
70
|
+
region=region,
|
|
71
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
72
|
+
actual_value="VPC flow logs are not enabled as a data source",
|
|
73
|
+
remediation=f"Enable VPC flow logs as a data source for GuardDuty in {region}"
|
|
74
|
+
))
|
|
75
|
+
else:
|
|
76
|
+
findings.append(self.create_finding(
|
|
77
|
+
status="FAIL",
|
|
78
|
+
region=region,
|
|
79
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
80
|
+
actual_value="Unable to retrieve detector details",
|
|
81
|
+
remediation="Check GuardDuty permissions and configuration"
|
|
82
|
+
))
|
|
83
|
+
|
|
84
|
+
return findings
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check if GuardDuty has S3 protection enabled.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any
|
|
5
|
+
from sraverify.services.guardduty.base import GuardDutyCheck
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SRA_GUARDDUTY_06(GuardDutyCheck):
|
|
9
|
+
"""Check if GuardDuty has S3 protection enabled."""
|
|
10
|
+
|
|
11
|
+
def __init__(self):
|
|
12
|
+
"""Initialize GuardDuty S3 protection check."""
|
|
13
|
+
super().__init__()
|
|
14
|
+
self.check_id = "SRA-GUARDDUTY-06"
|
|
15
|
+
self.check_name = "GuardDuty S3 protection enabled"
|
|
16
|
+
self.description = ("This check verifies that GuardDuty has S3 protection enabled. "
|
|
17
|
+
"GuardDuty provides enhanced visibility through S3 protection. "
|
|
18
|
+
"GuardDuty monitors both AWS CloudTrail management events and AWS CloudTrail "
|
|
19
|
+
"S3 data events to identify potential threats in your Amazon S3 resources.")
|
|
20
|
+
self.severity = "HIGH"
|
|
21
|
+
self.check_logic = "Get detector details in each Region. Check if S3 protection is enabled in the Features array."
|
|
22
|
+
|
|
23
|
+
def execute(self) -> List[Dict[str, Any]]:
|
|
24
|
+
"""
|
|
25
|
+
Execute the check.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
List of findings
|
|
29
|
+
"""
|
|
30
|
+
findings = []
|
|
31
|
+
# Check all regions
|
|
32
|
+
for region in self.regions:
|
|
33
|
+
detector_id = self.get_detector_id(region)
|
|
34
|
+
|
|
35
|
+
# Handle regions where we can't access GuardDuty
|
|
36
|
+
if not detector_id:
|
|
37
|
+
findings.append(self.create_finding(
|
|
38
|
+
status="ERROR",
|
|
39
|
+
region=region,
|
|
40
|
+
resource_id=f"guardduty:{region}",
|
|
41
|
+
actual_value="Unable to access GuardDuty in this region",
|
|
42
|
+
remediation="Check permissions or if GuardDuty is supported in this region"
|
|
43
|
+
))
|
|
44
|
+
continue
|
|
45
|
+
|
|
46
|
+
# Get detector details
|
|
47
|
+
detector_details = self.get_detector_details(region)
|
|
48
|
+
|
|
49
|
+
if detector_details:
|
|
50
|
+
# Check if S3 protection is enabled in the Features array
|
|
51
|
+
s3_protection_enabled = False
|
|
52
|
+
features = detector_details.get('Features', [])
|
|
53
|
+
|
|
54
|
+
for feature in features:
|
|
55
|
+
if feature.get('Name') == 'S3_DATA_EVENTS' and feature.get('Status') == 'ENABLED':
|
|
56
|
+
s3_protection_enabled = True
|
|
57
|
+
break
|
|
58
|
+
|
|
59
|
+
if s3_protection_enabled:
|
|
60
|
+
findings.append(self.create_finding(
|
|
61
|
+
status="PASS",
|
|
62
|
+
region=region,
|
|
63
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
64
|
+
actual_value="S3 protection is enabled",
|
|
65
|
+
remediation=""
|
|
66
|
+
))
|
|
67
|
+
else:
|
|
68
|
+
findings.append(self.create_finding(
|
|
69
|
+
status="FAIL",
|
|
70
|
+
region=region,
|
|
71
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
72
|
+
actual_value="S3 protection is not enabled",
|
|
73
|
+
remediation=f"Enable S3 protection for GuardDuty in {region} to monitor CloudTrail management and S3 data events"
|
|
74
|
+
))
|
|
75
|
+
else:
|
|
76
|
+
findings.append(self.create_finding(
|
|
77
|
+
status="FAIL",
|
|
78
|
+
region=region,
|
|
79
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
80
|
+
actual_value="Unable to retrieve detector details",
|
|
81
|
+
remediation="Check GuardDuty permissions and configuration"
|
|
82
|
+
))
|
|
83
|
+
|
|
84
|
+
return findings
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check if GuardDuty has EKS protection enabled.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any
|
|
5
|
+
from sraverify.services.guardduty.base import GuardDutyCheck
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SRA_GUARDDUTY_07(GuardDutyCheck):
|
|
9
|
+
"""Check if GuardDuty has EKS protection enabled."""
|
|
10
|
+
|
|
11
|
+
def __init__(self):
|
|
12
|
+
"""Initialize GuardDuty EKS protection check."""
|
|
13
|
+
super().__init__()
|
|
14
|
+
self.check_id = "SRA-GUARDDUTY-07"
|
|
15
|
+
self.check_name = "GuardDuty EKS protection enabled"
|
|
16
|
+
self.description = ("This check verifies that GuardDuty has EKS protection enabled. "
|
|
17
|
+
"EKS Audit Log Monitoring helps you detect potentially suspicious activities "
|
|
18
|
+
"in your EKS clusters within Amazon Elastic Kubernetes Service. It consumes "
|
|
19
|
+
"Kubernetes audit log events directly from the Amazon EKS control plane logging "
|
|
20
|
+
"feature through an independent and duplicated stream of audit logs.")
|
|
21
|
+
self.severity = "HIGH"
|
|
22
|
+
self.check_logic = "Get detector details in each Region. Check if EKS protection is enabled in the Features array."
|
|
23
|
+
|
|
24
|
+
def execute(self) -> List[Dict[str, Any]]:
|
|
25
|
+
"""
|
|
26
|
+
Execute the check.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
List of findings
|
|
30
|
+
"""
|
|
31
|
+
findings = []
|
|
32
|
+
# Check all regions
|
|
33
|
+
for region in self.regions:
|
|
34
|
+
detector_id = self.get_detector_id(region)
|
|
35
|
+
|
|
36
|
+
# Handle regions where we can't access GuardDuty
|
|
37
|
+
if not detector_id:
|
|
38
|
+
findings.append(self.create_finding(
|
|
39
|
+
status="ERROR",
|
|
40
|
+
region=region,
|
|
41
|
+
resource_id=f"guardduty:{region}",
|
|
42
|
+
actual_value="Unable to access GuardDuty in this region",
|
|
43
|
+
remediation="Check permissions or if GuardDuty is supported in this region"
|
|
44
|
+
))
|
|
45
|
+
continue
|
|
46
|
+
|
|
47
|
+
# Get detector details
|
|
48
|
+
detector_details = self.get_detector_details(region)
|
|
49
|
+
|
|
50
|
+
if detector_details:
|
|
51
|
+
# Check if EKS protection is enabled in the Features array
|
|
52
|
+
eks_protection_enabled = False
|
|
53
|
+
features = detector_details.get('Features', [])
|
|
54
|
+
|
|
55
|
+
for feature in features:
|
|
56
|
+
if feature.get('Name') == 'EKS_AUDIT_LOGS' and feature.get('Status') == 'ENABLED':
|
|
57
|
+
eks_protection_enabled = True
|
|
58
|
+
break
|
|
59
|
+
|
|
60
|
+
if eks_protection_enabled:
|
|
61
|
+
findings.append(self.create_finding(
|
|
62
|
+
status="PASS",
|
|
63
|
+
region=region,
|
|
64
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
65
|
+
actual_value="EKS protection is enabled",
|
|
66
|
+
remediation=""
|
|
67
|
+
))
|
|
68
|
+
else:
|
|
69
|
+
findings.append(self.create_finding(
|
|
70
|
+
status="FAIL",
|
|
71
|
+
region=region,
|
|
72
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
73
|
+
actual_value="EKS protection is not enabled",
|
|
74
|
+
remediation=f"Enable EKS protection for GuardDuty in {region} to monitor Kubernetes audit logs for suspicious activities"
|
|
75
|
+
))
|
|
76
|
+
else:
|
|
77
|
+
findings.append(self.create_finding(
|
|
78
|
+
status="FAIL",
|
|
79
|
+
region=region,
|
|
80
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
81
|
+
actual_value="Unable to retrieve detector details",
|
|
82
|
+
remediation="Check GuardDuty permissions and configuration"
|
|
83
|
+
))
|
|
84
|
+
|
|
85
|
+
return findings
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check if GuardDuty has CloudTrail event and management logs enabled.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any
|
|
5
|
+
from sraverify.services.guardduty.base import GuardDutyCheck
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SRA_GUARDDUTY_08(GuardDutyCheck):
|
|
9
|
+
"""Check if GuardDuty has CloudTrail event and management logs enabled."""
|
|
10
|
+
|
|
11
|
+
def __init__(self):
|
|
12
|
+
"""Initialize GuardDuty CloudTrail logs check."""
|
|
13
|
+
super().__init__()
|
|
14
|
+
self.check_id = "SRA-GUARDDUTY-08"
|
|
15
|
+
self.check_name = "GuardDuty CloudTrail logs enabled"
|
|
16
|
+
self.description = ("This check verifies that GuardDuty has CloudTrail event and management logs as one of the feature, enabled. "
|
|
17
|
+
"GuardDuty consumes CloudTrail management events directly from CloudTrail through an independent and "
|
|
18
|
+
"duplicated stream of events and analyzes the CloudTrail event logs.")
|
|
19
|
+
self.severity = "HIGH"
|
|
20
|
+
self.check_logic = "Get detector details in each Region. Check if CloudTrail logs are enabled in the Features array."
|
|
21
|
+
|
|
22
|
+
def execute(self) -> List[Dict[str, Any]]:
|
|
23
|
+
"""
|
|
24
|
+
Execute the check.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
List of findings
|
|
28
|
+
"""
|
|
29
|
+
findings = []
|
|
30
|
+
# Check all regions
|
|
31
|
+
for region in self.regions:
|
|
32
|
+
detector_id = self.get_detector_id(region)
|
|
33
|
+
|
|
34
|
+
# Handle regions where we can't access GuardDuty
|
|
35
|
+
if not detector_id:
|
|
36
|
+
findings.append(self.create_finding(
|
|
37
|
+
status="ERROR",
|
|
38
|
+
region=region,
|
|
39
|
+
resource_id=f"guardduty:{region}",
|
|
40
|
+
actual_value="Unable to access GuardDuty in this region",
|
|
41
|
+
remediation="Check permissions or if GuardDuty is supported in this region"
|
|
42
|
+
))
|
|
43
|
+
continue
|
|
44
|
+
|
|
45
|
+
# Get detector details
|
|
46
|
+
detector_details = self.get_detector_details(region)
|
|
47
|
+
|
|
48
|
+
if detector_details:
|
|
49
|
+
# Check if CloudTrail logs are enabled in the Features array
|
|
50
|
+
cloudtrail_enabled = False
|
|
51
|
+
features = detector_details.get('Features', [])
|
|
52
|
+
|
|
53
|
+
for feature in features:
|
|
54
|
+
if feature.get('Name') == 'CLOUD_TRAIL' and feature.get('Status') == 'ENABLED':
|
|
55
|
+
cloudtrail_enabled = True
|
|
56
|
+
break
|
|
57
|
+
|
|
58
|
+
if cloudtrail_enabled:
|
|
59
|
+
findings.append(self.create_finding(
|
|
60
|
+
status="PASS",
|
|
61
|
+
region=region,
|
|
62
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
63
|
+
actual_value="CloudTrail event and management logs are enabled",
|
|
64
|
+
remediation=""
|
|
65
|
+
))
|
|
66
|
+
else:
|
|
67
|
+
findings.append(self.create_finding(
|
|
68
|
+
status="FAIL",
|
|
69
|
+
region=region,
|
|
70
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
71
|
+
actual_value="CloudTrail event and management logs are not enabled",
|
|
72
|
+
remediation=f"Enable CloudTrail event and management logs for GuardDuty in {region} to monitor for suspicious API activity"
|
|
73
|
+
))
|
|
74
|
+
else:
|
|
75
|
+
findings.append(self.create_finding(
|
|
76
|
+
status="FAIL",
|
|
77
|
+
region=region,
|
|
78
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
79
|
+
actual_value="Unable to retrieve detector details",
|
|
80
|
+
remediation="Check GuardDuty permissions and configuration"
|
|
81
|
+
))
|
|
82
|
+
|
|
83
|
+
return findings
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check if GuardDuty has malware protection for EBS enabled.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any
|
|
5
|
+
from sraverify.services.guardduty.base import GuardDutyCheck
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SRA_GUARDDUTY_09(GuardDutyCheck):
|
|
9
|
+
"""Check if GuardDuty has malware protection for EBS enabled."""
|
|
10
|
+
|
|
11
|
+
def __init__(self):
|
|
12
|
+
"""Initialize GuardDuty malware protection for EBS check."""
|
|
13
|
+
super().__init__()
|
|
14
|
+
self.check_id = "SRA-GUARDDUTY-09"
|
|
15
|
+
self.check_name = "GuardDuty malware protection for EBS enabled"
|
|
16
|
+
self.description = ("This check verifies that GuardDuty malware protection for EBS is enabled. "
|
|
17
|
+
"Malware Protection for EC2 helps you detect the potential presence of malware "
|
|
18
|
+
"by scanning the Amazon EBS volumes that are attached to the Amazon EC2 instances "
|
|
19
|
+
"and container workloads.")
|
|
20
|
+
self.severity = "HIGH"
|
|
21
|
+
self.check_logic = "Get detector details in each Region. Check if malware protection for EBS is enabled in the Features array."
|
|
22
|
+
|
|
23
|
+
def execute(self) -> List[Dict[str, Any]]:
|
|
24
|
+
"""
|
|
25
|
+
Execute the check.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
List of findings
|
|
29
|
+
"""
|
|
30
|
+
findings = []
|
|
31
|
+
# Check all regions
|
|
32
|
+
for region in self.regions:
|
|
33
|
+
detector_id = self.get_detector_id(region)
|
|
34
|
+
|
|
35
|
+
# Handle regions where we can't access GuardDuty
|
|
36
|
+
if not detector_id:
|
|
37
|
+
findings.append(self.create_finding(
|
|
38
|
+
status="ERROR",
|
|
39
|
+
region=region,
|
|
40
|
+
resource_id=f"guardduty:{region}",
|
|
41
|
+
actual_value="Unable to access GuardDuty in this region",
|
|
42
|
+
remediation="Check permissions or if GuardDuty is supported in this region"
|
|
43
|
+
))
|
|
44
|
+
continue
|
|
45
|
+
|
|
46
|
+
# Get detector details
|
|
47
|
+
detector_details = self.get_detector_details(region)
|
|
48
|
+
|
|
49
|
+
if detector_details:
|
|
50
|
+
# Check if malware protection for EBS is enabled in the Features array
|
|
51
|
+
ebs_malware_protection_enabled = False
|
|
52
|
+
features = detector_details.get('Features', [])
|
|
53
|
+
|
|
54
|
+
for feature in features:
|
|
55
|
+
if feature.get('Name') == 'EBS_MALWARE_PROTECTION' and feature.get('Status') == 'ENABLED':
|
|
56
|
+
ebs_malware_protection_enabled = True
|
|
57
|
+
break
|
|
58
|
+
|
|
59
|
+
if ebs_malware_protection_enabled:
|
|
60
|
+
findings.append(self.create_finding(
|
|
61
|
+
status="PASS",
|
|
62
|
+
region=region,
|
|
63
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
64
|
+
actual_value="Malware protection for EBS is enabled",
|
|
65
|
+
remediation=""
|
|
66
|
+
))
|
|
67
|
+
else:
|
|
68
|
+
findings.append(self.create_finding(
|
|
69
|
+
status="FAIL",
|
|
70
|
+
region=region,
|
|
71
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
72
|
+
actual_value="Malware protection for EBS is not enabled",
|
|
73
|
+
remediation=f"Enable malware protection for EBS in GuardDuty in {region} to scan EC2 instances and container workloads for malware"
|
|
74
|
+
))
|
|
75
|
+
else:
|
|
76
|
+
findings.append(self.create_finding(
|
|
77
|
+
status="FAIL",
|
|
78
|
+
region=region,
|
|
79
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
80
|
+
actual_value="Unable to retrieve detector details",
|
|
81
|
+
remediation="Check GuardDuty permissions and configuration"
|
|
82
|
+
))
|
|
83
|
+
|
|
84
|
+
return findings
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check if GuardDuty has RDS protection enabled.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any
|
|
5
|
+
from sraverify.services.guardduty.base import GuardDutyCheck
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SRA_GUARDDUTY_10(GuardDutyCheck):
|
|
9
|
+
"""Check if GuardDuty has RDS protection enabled."""
|
|
10
|
+
|
|
11
|
+
def __init__(self):
|
|
12
|
+
"""Initialize GuardDuty RDS protection check."""
|
|
13
|
+
super().__init__()
|
|
14
|
+
self.check_id = "SRA-GUARDDUTY-10"
|
|
15
|
+
self.check_name = "GuardDuty RDS protection enabled"
|
|
16
|
+
self.description = ("This check verifies that GuardDuty RDS protection is enabled. "
|
|
17
|
+
"RDS Protection in Amazon GuardDuty analyzes and profiles RDS login activity "
|
|
18
|
+
"for potential access threats to Amazon Aurora databases and Amazon RDS for PostgreSQL.")
|
|
19
|
+
self.severity = "HIGH"
|
|
20
|
+
self.check_logic = "Get detector details in each Region. Check if RDS protection is enabled in the Features array."
|
|
21
|
+
|
|
22
|
+
def execute(self) -> List[Dict[str, Any]]:
|
|
23
|
+
"""
|
|
24
|
+
Execute the check.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
List of findings
|
|
28
|
+
"""
|
|
29
|
+
findings = []
|
|
30
|
+
# Check all regions
|
|
31
|
+
for region in self.regions:
|
|
32
|
+
detector_id = self.get_detector_id(region)
|
|
33
|
+
|
|
34
|
+
# Handle regions where we can't access GuardDuty
|
|
35
|
+
if not detector_id:
|
|
36
|
+
findings.append(self.create_finding(
|
|
37
|
+
status="ERROR",
|
|
38
|
+
region=region,
|
|
39
|
+
resource_id=f"guardduty:{region}",
|
|
40
|
+
actual_value="Unable to access GuardDuty in this region",
|
|
41
|
+
remediation="Check permissions or if GuardDuty is supported in this region"
|
|
42
|
+
))
|
|
43
|
+
continue
|
|
44
|
+
|
|
45
|
+
# Get detector details
|
|
46
|
+
detector_details = self.get_detector_details(region)
|
|
47
|
+
|
|
48
|
+
if detector_details:
|
|
49
|
+
# Check if RDS protection is enabled in the Features array
|
|
50
|
+
rds_protection_enabled = False
|
|
51
|
+
features = detector_details.get('Features', [])
|
|
52
|
+
|
|
53
|
+
for feature in features:
|
|
54
|
+
if feature.get('Name') == 'RDS_LOGIN_EVENTS' and feature.get('Status') == 'ENABLED':
|
|
55
|
+
rds_protection_enabled = True
|
|
56
|
+
break
|
|
57
|
+
|
|
58
|
+
if rds_protection_enabled:
|
|
59
|
+
findings.append(self.create_finding(
|
|
60
|
+
status="PASS",
|
|
61
|
+
region=region,
|
|
62
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
63
|
+
actual_value="RDS protection is enabled",
|
|
64
|
+
remediation=""
|
|
65
|
+
))
|
|
66
|
+
else:
|
|
67
|
+
findings.append(self.create_finding(
|
|
68
|
+
status="FAIL",
|
|
69
|
+
region=region,
|
|
70
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
71
|
+
actual_value="RDS protection is not enabled",
|
|
72
|
+
remediation=f"Enable RDS protection for GuardDuty in {region} to monitor login activity for potential threats to Aurora and RDS for PostgreSQL databases"
|
|
73
|
+
))
|
|
74
|
+
else:
|
|
75
|
+
findings.append(self.create_finding(
|
|
76
|
+
status="FAIL",
|
|
77
|
+
region=region,
|
|
78
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
79
|
+
actual_value="Unable to retrieve detector details",
|
|
80
|
+
remediation="Check GuardDuty permissions and configuration"
|
|
81
|
+
))
|
|
82
|
+
|
|
83
|
+
return findings
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check if GuardDuty has EKS runtime protection enabled.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any
|
|
5
|
+
from sraverify.services.guardduty.base import GuardDutyCheck
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SRA_GUARDDUTY_11(GuardDutyCheck):
|
|
9
|
+
"""Check if GuardDuty has EKS runtime protection enabled."""
|
|
10
|
+
|
|
11
|
+
def __init__(self):
|
|
12
|
+
"""Initialize GuardDuty EKS runtime protection check."""
|
|
13
|
+
super().__init__()
|
|
14
|
+
self.check_id = "SRA-GUARDDUTY-11"
|
|
15
|
+
self.check_name = "GuardDuty EKS runtime protection enabled"
|
|
16
|
+
self.description = ("This check verifies that GuardDuty EKS runtime (original) or runtime protection is enabled. "
|
|
17
|
+
"Runtime Monitoring observes and analyzes operating system-level, networking, "
|
|
18
|
+
"and file events to help you detect potential threats in specific AWS workloads")
|
|
19
|
+
self.severity = "HIGH"
|
|
20
|
+
self.check_logic = "Get detector details in each Region. Check if EKS runtime monitoring or runtime monitoring is enabled in the Features array."
|
|
21
|
+
|
|
22
|
+
def execute(self) -> List[Dict[str, Any]]:
|
|
23
|
+
"""
|
|
24
|
+
Execute the check.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
List of findings
|
|
28
|
+
"""
|
|
29
|
+
findings = []
|
|
30
|
+
# Check all regions
|
|
31
|
+
for region in self.regions:
|
|
32
|
+
detector_id = self.get_detector_id(region)
|
|
33
|
+
|
|
34
|
+
# Handle regions where we can't access GuardDuty
|
|
35
|
+
if not detector_id:
|
|
36
|
+
findings.append(self.create_finding(
|
|
37
|
+
status="ERROR",
|
|
38
|
+
region=region,
|
|
39
|
+
resource_id=f"guardduty:{region}",
|
|
40
|
+
actual_value="Unable to access GuardDuty in this region",
|
|
41
|
+
remediation="Check permissions or if GuardDuty is supported in this region"
|
|
42
|
+
))
|
|
43
|
+
continue
|
|
44
|
+
|
|
45
|
+
# Get detector details
|
|
46
|
+
detector_details = self.get_detector_details(region)
|
|
47
|
+
|
|
48
|
+
if detector_details:
|
|
49
|
+
# Check if EKS runtime protection is enabled in the Features array
|
|
50
|
+
# We need to check both EKS_RUNTIME_MONITORING (original) and RUNTIME_MONITORING features
|
|
51
|
+
eks_runtime_protection_enabled = False
|
|
52
|
+
runtime_monitoring_enabled = False
|
|
53
|
+
features = detector_details.get('Features', [])
|
|
54
|
+
|
|
55
|
+
for feature in features:
|
|
56
|
+
if feature.get('Name') == 'EKS_RUNTIME_MONITORING' and feature.get('Status') == 'ENABLED':
|
|
57
|
+
eks_runtime_protection_enabled = True
|
|
58
|
+
if feature.get('Name') == 'RUNTIME_MONITORING' and feature.get('Status') == 'ENABLED':
|
|
59
|
+
runtime_monitoring_enabled = True
|
|
60
|
+
|
|
61
|
+
# Consider the check passed if either of the runtime monitoring features is enabled
|
|
62
|
+
if eks_runtime_protection_enabled or runtime_monitoring_enabled:
|
|
63
|
+
enabled_features = []
|
|
64
|
+
if eks_runtime_protection_enabled:
|
|
65
|
+
enabled_features.append("EKS_RUNTIME_MONITORING")
|
|
66
|
+
if runtime_monitoring_enabled:
|
|
67
|
+
enabled_features.append("RUNTIME_MONITORING")
|
|
68
|
+
|
|
69
|
+
findings.append(self.create_finding(
|
|
70
|
+
status="PASS",
|
|
71
|
+
region=region,
|
|
72
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
73
|
+
actual_value=f"Runtime protection is enabled: {', '.join(enabled_features)}",
|
|
74
|
+
remediation=""
|
|
75
|
+
))
|
|
76
|
+
else:
|
|
77
|
+
findings.append(self.create_finding(
|
|
78
|
+
status="FAIL",
|
|
79
|
+
region=region,
|
|
80
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
81
|
+
actual_value="Runtime protection is not enabled",
|
|
82
|
+
remediation=f"Enable Runtime Monitoring for GuardDuty in {region} to monitor operating system-level, networking, and file events in workloads"
|
|
83
|
+
))
|
|
84
|
+
else:
|
|
85
|
+
findings.append(self.create_finding(
|
|
86
|
+
status="FAIL",
|
|
87
|
+
region=region,
|
|
88
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
89
|
+
actual_value="Unable to retrieve detector details",
|
|
90
|
+
remediation="Check GuardDuty permissions and configuration"
|
|
91
|
+
))
|
|
92
|
+
|
|
93
|
+
return findings
|