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,91 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check if GuardDuty has ECS Fargate agent management enabled.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any
|
|
5
|
+
from sraverify.services.guardduty.base import GuardDutyCheck
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SRA_GUARDDUTY_18(GuardDutyCheck):
|
|
9
|
+
"""Check if GuardDuty has ECS Fargate agent management enabled."""
|
|
10
|
+
|
|
11
|
+
def __init__(self):
|
|
12
|
+
"""Initialize GuardDuty ECS Fargate agent management check."""
|
|
13
|
+
super().__init__()
|
|
14
|
+
self.check_id = "SRA-GUARDDUTY-18"
|
|
15
|
+
self.check_name = "GuardDuty ECS Fargate agent management enabled"
|
|
16
|
+
self.description = ("This check verifies that GuardDuty has ECS Fargate agent management enabled. "
|
|
17
|
+
"ECS Fargate agent management allows GuardDuty to automatically deploy and manage "
|
|
18
|
+
"the security agent on your ECS Fargate tasks, simplifying the setup and maintenance "
|
|
19
|
+
"of runtime monitoring for containerized workloads.")
|
|
20
|
+
self.severity = "HIGH"
|
|
21
|
+
self.check_logic = "Get detector details in each Region. Check if ECS_FARGATE_AGENT_MANAGEMENT is enabled in the RUNTIME_MONITORING feature's AdditionalConfiguration."
|
|
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 ECS_FARGATE_AGENT_MANAGEMENT is enabled in any RUNTIME_MONITORING feature
|
|
51
|
+
ecs_fargate_agent_management_enabled = False
|
|
52
|
+
features = detector_details.get('Features', [])
|
|
53
|
+
|
|
54
|
+
for feature in features:
|
|
55
|
+
if feature.get('Name') == 'RUNTIME_MONITORING':
|
|
56
|
+
# Check AdditionalConfiguration for ECS_FARGATE_AGENT_MANAGEMENT
|
|
57
|
+
additional_configs = feature.get('AdditionalConfiguration', [])
|
|
58
|
+
for config in additional_configs:
|
|
59
|
+
if config.get('Name') == 'ECS_FARGATE_AGENT_MANAGEMENT' and config.get('Status') == 'ENABLED':
|
|
60
|
+
ecs_fargate_agent_management_enabled = True
|
|
61
|
+
break
|
|
62
|
+
|
|
63
|
+
if ecs_fargate_agent_management_enabled:
|
|
64
|
+
break
|
|
65
|
+
|
|
66
|
+
if ecs_fargate_agent_management_enabled:
|
|
67
|
+
findings.append(self.create_finding(
|
|
68
|
+
status="PASS",
|
|
69
|
+
region=region,
|
|
70
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
71
|
+
actual_value="ECS Fargate agent management is enabled",
|
|
72
|
+
remediation=""
|
|
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="ECS Fargate agent management is not enabled",
|
|
80
|
+
remediation=f"Enable ECS Fargate agent management in the Runtime Monitoring configuration for GuardDuty in {region}"
|
|
81
|
+
))
|
|
82
|
+
else:
|
|
83
|
+
findings.append(self.create_finding(
|
|
84
|
+
status="FAIL",
|
|
85
|
+
region=region,
|
|
86
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
87
|
+
actual_value="Unable to retrieve detector details",
|
|
88
|
+
remediation="Check GuardDuty permissions and configuration"
|
|
89
|
+
))
|
|
90
|
+
|
|
91
|
+
return findings
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check if GuardDuty has EC2 agent management enabled.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any
|
|
5
|
+
from sraverify.services.guardduty.base import GuardDutyCheck
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SRA_GUARDDUTY_19(GuardDutyCheck):
|
|
9
|
+
"""Check if GuardDuty has EC2 agent management enabled."""
|
|
10
|
+
|
|
11
|
+
def __init__(self):
|
|
12
|
+
"""Initialize GuardDuty EC2 agent management check."""
|
|
13
|
+
super().__init__()
|
|
14
|
+
self.check_id = "SRA-GUARDDUTY-19"
|
|
15
|
+
self.check_name = "GuardDuty EC2 agent management enabled"
|
|
16
|
+
self.description = ("This check verifies that GuardDuty has EC2 agent management enabled. "
|
|
17
|
+
"EC2 agent management allows GuardDuty to automatically deploy and manage "
|
|
18
|
+
"the security agent on your EC2 instances, simplifying the setup and maintenance "
|
|
19
|
+
"of runtime monitoring for EC2 workloads.")
|
|
20
|
+
self.severity = "HIGH"
|
|
21
|
+
self.check_logic = "Get detector details in each Region. Check if EC2_AGENT_MANAGEMENT is enabled in the RUNTIME_MONITORING feature's AdditionalConfiguration."
|
|
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 EC2_AGENT_MANAGEMENT is enabled in any RUNTIME_MONITORING feature
|
|
51
|
+
ec2_agent_management_enabled = False
|
|
52
|
+
features = detector_details.get('Features', [])
|
|
53
|
+
|
|
54
|
+
for feature in features:
|
|
55
|
+
if feature.get('Name') == 'RUNTIME_MONITORING':
|
|
56
|
+
# Check AdditionalConfiguration for EC2_AGENT_MANAGEMENT
|
|
57
|
+
additional_configs = feature.get('AdditionalConfiguration', [])
|
|
58
|
+
for config in additional_configs:
|
|
59
|
+
if config.get('Name') == 'EC2_AGENT_MANAGEMENT' and config.get('Status') == 'ENABLED':
|
|
60
|
+
ec2_agent_management_enabled = True
|
|
61
|
+
break
|
|
62
|
+
|
|
63
|
+
if ec2_agent_management_enabled:
|
|
64
|
+
break
|
|
65
|
+
|
|
66
|
+
if ec2_agent_management_enabled:
|
|
67
|
+
findings.append(self.create_finding(
|
|
68
|
+
status="PASS",
|
|
69
|
+
region=region,
|
|
70
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
71
|
+
actual_value="EC2 agent management is enabled",
|
|
72
|
+
remediation=""
|
|
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="EC2 agent management is not enabled",
|
|
80
|
+
remediation=f"Enable EC2 agent management in the Runtime Monitoring configuration for GuardDuty in {region}"
|
|
81
|
+
))
|
|
82
|
+
else:
|
|
83
|
+
findings.append(self.create_finding(
|
|
84
|
+
status="FAIL",
|
|
85
|
+
region=region,
|
|
86
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
87
|
+
actual_value="Unable to retrieve detector details",
|
|
88
|
+
remediation="Check GuardDuty permissions and configuration"
|
|
89
|
+
))
|
|
90
|
+
|
|
91
|
+
return findings
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check if GuardDuty S3 data events are configured for auto-enablement.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any
|
|
5
|
+
from sraverify.services.guardduty.base import GuardDutyCheck
|
|
6
|
+
from sraverify.core.logging import logger
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SRA_GUARDDUTY_20(GuardDutyCheck):
|
|
10
|
+
"""Check if GuardDuty S3 data events are configured for auto-enablement."""
|
|
11
|
+
|
|
12
|
+
def __init__(self):
|
|
13
|
+
"""Initialize GuardDuty S3 data events auto-enablement check."""
|
|
14
|
+
super().__init__()
|
|
15
|
+
self.check_id = "SRA-GUARDDUTY-20"
|
|
16
|
+
self.check_name = "GuardDuty S3 data events auto-enablement configured"
|
|
17
|
+
self.description = ("This check verifies whether S3 data events are configured for auto-enablement "
|
|
18
|
+
"in GuardDuty for all member accounts. S3 data events provide visibility into "
|
|
19
|
+
"object-level API operations, enhancing threat detection for S3 buckets.")
|
|
20
|
+
self.severity = "HIGH"
|
|
21
|
+
self.check_logic = "Check if S3_DATA_EVENTS feature is configured with AutoEnable set to ALL."
|
|
22
|
+
self.account_type = "audit"
|
|
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 organization configuration for GuardDuty
|
|
48
|
+
org_config = self.get_organization_configuration(region)
|
|
49
|
+
|
|
50
|
+
# Check if there was an error in the response
|
|
51
|
+
if "Error" in org_config:
|
|
52
|
+
error_code = org_config["Error"].get("Code", "Unknown")
|
|
53
|
+
error_message = org_config["Error"].get("Message", "Unknown error")
|
|
54
|
+
|
|
55
|
+
# Handle BadRequestException specifically for non-management accounts
|
|
56
|
+
if error_code == "BadRequestException":
|
|
57
|
+
findings.append(self.create_finding(
|
|
58
|
+
status="FAIL",
|
|
59
|
+
region=region,
|
|
60
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
61
|
+
actual_value=f"{error_code} {error_message}",
|
|
62
|
+
remediation="Verify that GuardDuty is the delegated admin in this Region and run the check again."
|
|
63
|
+
))
|
|
64
|
+
else:
|
|
65
|
+
findings.append(self.create_finding(
|
|
66
|
+
status="ERROR",
|
|
67
|
+
region=region,
|
|
68
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
69
|
+
actual_value=f"Error accessing GuardDuty organization configuration: {error_code}",
|
|
70
|
+
remediation="Check permissions and AWS Organizations configuration"
|
|
71
|
+
))
|
|
72
|
+
continue
|
|
73
|
+
|
|
74
|
+
# Check if S3 data events are configured for auto-enablement
|
|
75
|
+
# Look for S3_DATA_EVENTS in Features
|
|
76
|
+
s3_data_events_found = False
|
|
77
|
+
s3_data_events_auto_enable = "NOT_CONFIGURED"
|
|
78
|
+
features = org_config.get('Features', [])
|
|
79
|
+
|
|
80
|
+
for feature in features:
|
|
81
|
+
if feature.get('Name') == 'S3_DATA_EVENTS':
|
|
82
|
+
s3_data_events_found = True
|
|
83
|
+
s3_data_events_auto_enable = feature.get('AutoEnable', 'NONE')
|
|
84
|
+
break
|
|
85
|
+
|
|
86
|
+
if s3_data_events_found and s3_data_events_auto_enable == 'ALL':
|
|
87
|
+
findings.append(self.create_finding(
|
|
88
|
+
status="PASS",
|
|
89
|
+
region=region,
|
|
90
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
91
|
+
actual_value="GuardDuty S3 data events are configured for auto-enablement for all accounts (AutoEnable=ALL)",
|
|
92
|
+
remediation=""
|
|
93
|
+
))
|
|
94
|
+
elif s3_data_events_found:
|
|
95
|
+
findings.append(self.create_finding(
|
|
96
|
+
status="FAIL",
|
|
97
|
+
region=region,
|
|
98
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
99
|
+
actual_value=f"GuardDuty S3 data events are configured with AutoEnable={s3_data_events_auto_enable}, but should be ALL",
|
|
100
|
+
remediation=f"Configure S3 data events auto-enablement for all accounts in {region} by setting AutoEnable to ALL"
|
|
101
|
+
))
|
|
102
|
+
else:
|
|
103
|
+
findings.append(self.create_finding(
|
|
104
|
+
status="FAIL",
|
|
105
|
+
region=region,
|
|
106
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
107
|
+
actual_value=f"GuardDuty S3 data events feature is not configured",
|
|
108
|
+
remediation=f"Enable S3 data events feature and configure auto-enablement for all accounts in {region}"
|
|
109
|
+
))
|
|
110
|
+
|
|
111
|
+
return findings
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check if GuardDuty EBS Malware Protection is configured for auto-enablement.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any
|
|
5
|
+
from sraverify.services.guardduty.base import GuardDutyCheck
|
|
6
|
+
from sraverify.core.logging import logger
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SRA_GUARDDUTY_21(GuardDutyCheck):
|
|
10
|
+
"""Check if GuardDuty EBS Malware Protection is configured for auto-enablement."""
|
|
11
|
+
|
|
12
|
+
def __init__(self):
|
|
13
|
+
"""Initialize GuardDuty EBS Malware Protection auto-enablement check."""
|
|
14
|
+
super().__init__()
|
|
15
|
+
self.check_id = "SRA-GUARDDUTY-21"
|
|
16
|
+
self.check_name = "GuardDuty EBS Malware Protection auto-enablement configured"
|
|
17
|
+
self.description = ("This check verifies whether EBS Malware Protection is configured for auto-enablement "
|
|
18
|
+
"in GuardDuty for all member accounts. EBS Malware Protection scans EBS volumes for "
|
|
19
|
+
"malware when GuardDuty detects a potential threat, helping to identify and remediate "
|
|
20
|
+
"malware infections in your AWS environment.")
|
|
21
|
+
self.severity = "HIGH"
|
|
22
|
+
self.check_logic = "Check if EBS_MALWARE_PROTECTION feature is configured with AutoEnable set to ALL."
|
|
23
|
+
self.account_type = "audit"
|
|
24
|
+
|
|
25
|
+
def execute(self) -> List[Dict[str, Any]]:
|
|
26
|
+
"""
|
|
27
|
+
Execute the check.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
List of findings
|
|
31
|
+
"""
|
|
32
|
+
findings = []
|
|
33
|
+
# Check all regions
|
|
34
|
+
for region in self.regions:
|
|
35
|
+
detector_id = self.get_detector_id(region)
|
|
36
|
+
|
|
37
|
+
# Handle regions where we can't access GuardDuty
|
|
38
|
+
if not detector_id:
|
|
39
|
+
findings.append(self.create_finding(
|
|
40
|
+
status="ERROR",
|
|
41
|
+
region=region,
|
|
42
|
+
resource_id=f"guardduty:{region}",
|
|
43
|
+
actual_value="Unable to access GuardDuty in this region",
|
|
44
|
+
remediation="Check permissions or if GuardDuty is supported in this region"
|
|
45
|
+
))
|
|
46
|
+
continue
|
|
47
|
+
|
|
48
|
+
# Get organization configuration for GuardDuty
|
|
49
|
+
org_config = self.get_organization_configuration(region)
|
|
50
|
+
|
|
51
|
+
# Check if there was an error in the response
|
|
52
|
+
if "Error" in org_config:
|
|
53
|
+
error_code = org_config["Error"].get("Code", "Unknown")
|
|
54
|
+
error_message = org_config["Error"].get("Message", "Unknown error")
|
|
55
|
+
|
|
56
|
+
# Handle BadRequestException specifically for non-management accounts
|
|
57
|
+
if error_code == "BadRequestException":
|
|
58
|
+
findings.append(self.create_finding(
|
|
59
|
+
status="FAIL",
|
|
60
|
+
region=region,
|
|
61
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
62
|
+
actual_value=f"{error_code} {error_message}",
|
|
63
|
+
remediation="Verify that GuardDuty is the delegated admin in this Region and run the check again."
|
|
64
|
+
))
|
|
65
|
+
else:
|
|
66
|
+
findings.append(self.create_finding(
|
|
67
|
+
status="ERROR",
|
|
68
|
+
region=region,
|
|
69
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
70
|
+
actual_value=f"Error accessing GuardDuty organization configuration: {error_code}",
|
|
71
|
+
remediation="Check permissions and AWS Organizations configuration"
|
|
72
|
+
))
|
|
73
|
+
continue
|
|
74
|
+
|
|
75
|
+
# Check if EBS Malware Protection is configured for auto-enablement
|
|
76
|
+
# Look for EBS_MALWARE_PROTECTION in Features
|
|
77
|
+
ebs_malware_protection_found = False
|
|
78
|
+
ebs_malware_protection_auto_enable = "NOT_CONFIGURED"
|
|
79
|
+
features = org_config.get('Features', [])
|
|
80
|
+
|
|
81
|
+
for feature in features:
|
|
82
|
+
if feature.get('Name') == 'EBS_MALWARE_PROTECTION':
|
|
83
|
+
ebs_malware_protection_found = True
|
|
84
|
+
ebs_malware_protection_auto_enable = feature.get('AutoEnable', 'NONE')
|
|
85
|
+
break
|
|
86
|
+
|
|
87
|
+
if ebs_malware_protection_found and ebs_malware_protection_auto_enable == 'ALL':
|
|
88
|
+
findings.append(self.create_finding(
|
|
89
|
+
status="PASS",
|
|
90
|
+
region=region,
|
|
91
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
92
|
+
actual_value="GuardDuty EBS Malware Protection is configured for auto-enablement for all accounts (AutoEnable=ALL)",
|
|
93
|
+
remediation=""
|
|
94
|
+
))
|
|
95
|
+
elif ebs_malware_protection_found:
|
|
96
|
+
findings.append(self.create_finding(
|
|
97
|
+
status="FAIL",
|
|
98
|
+
region=region,
|
|
99
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
100
|
+
actual_value=f"GuardDuty EBS Malware Protection is configured with AutoEnable={ebs_malware_protection_auto_enable}, but should be ALL",
|
|
101
|
+
remediation=f"Configure EBS Malware Protection auto-enablement for all accounts in {region} by setting AutoEnable to ALL"
|
|
102
|
+
))
|
|
103
|
+
else:
|
|
104
|
+
findings.append(self.create_finding(
|
|
105
|
+
status="FAIL",
|
|
106
|
+
region=region,
|
|
107
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
108
|
+
actual_value=f"GuardDuty EBS Malware Protection feature is not configured",
|
|
109
|
+
remediation=f"Enable EBS Malware Protection feature and configure auto-enablement for all accounts in {region}"
|
|
110
|
+
))
|
|
111
|
+
|
|
112
|
+
return findings
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check if GuardDuty EKS Audit Logs are configured for auto-enablement.
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, List, Any
|
|
5
|
+
from sraverify.services.guardduty.base import GuardDutyCheck
|
|
6
|
+
from sraverify.core.logging import logger
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SRA_GUARDDUTY_22(GuardDutyCheck):
|
|
10
|
+
"""Check if GuardDuty EKS Audit Logs are configured for auto-enablement."""
|
|
11
|
+
|
|
12
|
+
def __init__(self):
|
|
13
|
+
"""Initialize GuardDuty EKS Audit Logs auto-enablement check."""
|
|
14
|
+
super().__init__()
|
|
15
|
+
self.check_id = "SRA-GUARDDUTY-22"
|
|
16
|
+
self.check_name = "GuardDuty EKS Audit Logs auto-enablement configured"
|
|
17
|
+
self.description = ("This check verifies whether EKS Audit Logs are configured for auto-enablement "
|
|
18
|
+
"in GuardDuty for all member accounts. EKS Audit Logs monitoring analyzes Kubernetes "
|
|
19
|
+
"audit logs to detect potentially suspicious activities in Amazon EKS clusters.")
|
|
20
|
+
self.severity = "HIGH"
|
|
21
|
+
self.check_logic = "Check if EKS_AUDIT_LOGS feature is configured with AutoEnable set to ALL."
|
|
22
|
+
self.account_type = "audit"
|
|
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 organization configuration for GuardDuty
|
|
48
|
+
org_config = self.get_organization_configuration(region)
|
|
49
|
+
|
|
50
|
+
# Check if there was an error in the response
|
|
51
|
+
if "Error" in org_config:
|
|
52
|
+
error_code = org_config["Error"].get("Code", "Unknown")
|
|
53
|
+
error_message = org_config["Error"].get("Message", "Unknown error")
|
|
54
|
+
|
|
55
|
+
# Handle BadRequestException specifically for non-management accounts
|
|
56
|
+
if error_code == "BadRequestException":
|
|
57
|
+
findings.append(self.create_finding(
|
|
58
|
+
status="FAIL",
|
|
59
|
+
region=region,
|
|
60
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
61
|
+
actual_value=f"{error_code} {error_message}",
|
|
62
|
+
remediation="Verify that GuardDuty is the delegated admin in this Region and run the check again."
|
|
63
|
+
))
|
|
64
|
+
else:
|
|
65
|
+
findings.append(self.create_finding(
|
|
66
|
+
status="ERROR",
|
|
67
|
+
region=region,
|
|
68
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
69
|
+
actual_value=f"Error accessing GuardDuty organization configuration: {error_code}",
|
|
70
|
+
remediation="Check permissions and AWS Organizations configuration"
|
|
71
|
+
))
|
|
72
|
+
continue
|
|
73
|
+
|
|
74
|
+
# Check if EKS Audit Logs are configured for auto-enablement
|
|
75
|
+
# Look for EKS_AUDIT_LOGS in Features
|
|
76
|
+
eks_audit_logs_found = False
|
|
77
|
+
eks_audit_logs_auto_enable = "NOT_CONFIGURED"
|
|
78
|
+
features = org_config.get('Features', [])
|
|
79
|
+
|
|
80
|
+
for feature in features:
|
|
81
|
+
if feature.get('Name') == 'EKS_AUDIT_LOGS':
|
|
82
|
+
eks_audit_logs_found = True
|
|
83
|
+
eks_audit_logs_auto_enable = feature.get('AutoEnable', 'NONE')
|
|
84
|
+
break
|
|
85
|
+
|
|
86
|
+
if eks_audit_logs_found and eks_audit_logs_auto_enable == 'ALL':
|
|
87
|
+
findings.append(self.create_finding(
|
|
88
|
+
status="PASS",
|
|
89
|
+
region=region,
|
|
90
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
91
|
+
actual_value="GuardDuty EKS Audit Logs are configured for auto-enablement for all accounts (AutoEnable=ALL)",
|
|
92
|
+
remediation=""
|
|
93
|
+
))
|
|
94
|
+
elif eks_audit_logs_found:
|
|
95
|
+
findings.append(self.create_finding(
|
|
96
|
+
status="FAIL",
|
|
97
|
+
region=region,
|
|
98
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
99
|
+
actual_value=f"GuardDuty EKS Audit Logs are configured with AutoEnable={eks_audit_logs_auto_enable}, but should be ALL",
|
|
100
|
+
remediation=f"Configure EKS Audit Logs auto-enablement for all accounts in {region} by setting AutoEnable to ALL"
|
|
101
|
+
))
|
|
102
|
+
else:
|
|
103
|
+
findings.append(self.create_finding(
|
|
104
|
+
status="FAIL",
|
|
105
|
+
region=region,
|
|
106
|
+
resource_id=f"guardduty:{region}:{detector_id}",
|
|
107
|
+
actual_value=f"GuardDuty EKS Audit Logs feature is not configured",
|
|
108
|
+
remediation=f"Enable EKS Audit Logs feature and configure auto-enablement for all accounts in {region}"
|
|
109
|
+
))
|
|
110
|
+
|
|
111
|
+
return findings
|