aws-cis-controls-assessment 1.2.0__tar.gz → 1.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. {aws_cis_controls_assessment-1.2.0/aws_cis_controls_assessment.egg-info → aws_cis_controls_assessment-1.2.2}/PKG-INFO +1 -1
  2. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/__init__.py +1 -1
  3. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/config/rules/cis_controls_ig1.yaml +3 -3
  4. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/base_control.py +106 -24
  5. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/__init__.py +144 -15
  6. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_4_1.py +4 -4
  7. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_guardduty.py +4 -4
  8. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_s3_encryption.py +1 -1
  9. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_tls_ssl.py +4 -4
  10. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_version_mgmt.py +9 -1
  11. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/core/assessment_engine.py +160 -11
  12. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/core/aws_client_factory.py +17 -5
  13. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/core/scoring_engine.py +19 -15
  14. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/reporters/base_reporter.py +27 -12
  15. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/reporters/html_reporter.py +23 -9
  16. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2/aws_cis_controls_assessment.egg-info}/PKG-INFO +1 -1
  17. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/LICENSE +0 -0
  18. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/MANIFEST.in +0 -0
  19. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/README.md +0 -0
  20. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/cli/__init__.py +0 -0
  21. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/cli/examples.py +0 -0
  22. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/cli/main.py +0 -0
  23. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/cli/utils.py +0 -0
  24. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/config/__init__.py +0 -0
  25. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/config/config_loader.py +0 -0
  26. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/config/rules/cis_controls_ig2.yaml +0 -0
  27. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/config/rules/cis_controls_ig3.yaml +0 -0
  28. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/__init__.py +0 -0
  29. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_1_1.py +0 -0
  30. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_2_2.py +0 -0
  31. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_3_3.py +0 -0
  32. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_3_4.py +0 -0
  33. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_access_analyzer.py +0 -0
  34. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_access_asset_mgmt.py +0 -0
  35. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_access_control.py +0 -0
  36. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_access_keys.py +0 -0
  37. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_advanced_security.py +0 -0
  38. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_aws_backup_service.py +0 -0
  39. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_backup_recovery.py +0 -0
  40. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_backup_security.py +0 -0
  41. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_cloudfront_logging.py +0 -0
  42. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_cloudtrail_logging.py +0 -0
  43. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_configuration_mgmt.py +0 -0
  44. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_critical_security.py +0 -0
  45. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_data_classification.py +0 -0
  46. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_data_protection.py +0 -0
  47. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_dynamodb_encryption.py +0 -0
  48. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_ebs_encryption.py +0 -0
  49. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_efs_encryption.py +0 -0
  50. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_elb_logging.py +0 -0
  51. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_iam_advanced.py +0 -0
  52. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_iam_governance.py +0 -0
  53. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_iam_policies.py +0 -0
  54. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_inspector.py +0 -0
  55. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_instance_optimization.py +0 -0
  56. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_inventory.py +0 -0
  57. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_macie.py +0 -0
  58. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_messaging_encryption.py +0 -0
  59. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_mfa.py +0 -0
  60. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_network_enhancements.py +0 -0
  61. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_network_security.py +0 -0
  62. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_patch_management.py +0 -0
  63. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_rds_encryption.py +0 -0
  64. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_s3_enhancements.py +0 -0
  65. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_s3_security.py +0 -0
  66. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_vpc_flow_logs.py +0 -0
  67. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_vpc_security.py +0 -0
  68. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig1/control_waf_logging.py +0 -0
  69. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/__init__.py +0 -0
  70. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_3_10.py +0 -0
  71. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_3_11.py +0 -0
  72. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_4_5_6_access_configuration.py +0 -0
  73. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_5_2.py +0 -0
  74. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_8_audit_logging.py +0 -0
  75. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_advanced_encryption.py +0 -0
  76. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_aws_backup_ig2.py +0 -0
  77. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_codebuild_security.py +0 -0
  78. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_encryption_rest.py +0 -0
  79. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_encryption_transit.py +0 -0
  80. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_network_ha.py +0 -0
  81. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_remaining_encryption.py +0 -0
  82. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_remaining_rules.py +0 -0
  83. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig2/control_service_logging.py +0 -0
  84. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig3/__init__.py +0 -0
  85. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig3/control_12_8.py +0 -0
  86. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig3/control_13_1.py +0 -0
  87. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig3/control_3_14.py +0 -0
  88. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/controls/ig3/control_7_1.py +0 -0
  89. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/core/__init__.py +0 -0
  90. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/core/accuracy_validator.py +0 -0
  91. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/core/audit_trail.py +0 -0
  92. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/core/error_handler.py +0 -0
  93. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/core/models.py +0 -0
  94. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/reporters/__init__.py +0 -0
  95. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/reporters/csv_reporter.py +0 -0
  96. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_assessment/reporters/json_reporter.py +0 -0
  97. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_controls_assessment.egg-info/SOURCES.txt +0 -0
  98. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_controls_assessment.egg-info/dependency_links.txt +0 -0
  99. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_controls_assessment.egg-info/entry_points.txt +0 -0
  100. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_controls_assessment.egg-info/requires.txt +0 -0
  101. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/aws_cis_controls_assessment.egg-info/top_level.txt +0 -0
  102. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/deprecation-package/aws_cis_assessment_deprecated/__init__.py +0 -0
  103. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/README.md +0 -0
  104. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/adding-aws-backup-controls.md +0 -0
  105. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/assessment-logic.md +0 -0
  106. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/cli-reference.md +0 -0
  107. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/config-rule-mappings.md +0 -0
  108. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/developer-guide.md +0 -0
  109. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/dual-scoring-implementation.md +0 -0
  110. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/html-report-improvements.md +0 -0
  111. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/installation.md +0 -0
  112. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/scoring-comparison-aws-config.md +0 -0
  113. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/scoring-methodology.md +0 -0
  114. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/troubleshooting.md +0 -0
  115. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/docs/user-guide.md +0 -0
  116. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/pyproject.toml +0 -0
  117. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/pytest.ini +0 -0
  118. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/requirements.txt +0 -0
  119. {aws_cis_controls_assessment-1.2.0 → aws_cis_controls_assessment-1.2.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aws-cis-controls-assessment
3
- Version: 1.2.0
3
+ Version: 1.2.2
4
4
  Summary: Production-ready AWS CIS Controls compliance assessment framework with 175 comprehensive rules and 75%+ IG1 coverage
5
5
  Author-email: AWS CIS Assessment Team <security@example.com>
6
6
  Maintainer-email: AWS CIS Assessment Team <security@example.com>
@@ -6,6 +6,6 @@ CIS Controls Implementation Groups (IG1, IG2, IG3). Implements 175 comprehensive
6
6
  across all implementation groups with 75%+ coverage of CIS Controls v8.1 IG1 safeguards.
7
7
  """
8
8
 
9
- __version__ = "1.2.0"
9
+ __version__ = "1.2.2"
10
10
  __author__ = "AWS CIS Assessment Team"
11
11
  __description__ = "Production-ready AWS CIS Controls Compliance Assessment Framework with Enhanced IG1 Coverage"
@@ -917,12 +917,12 @@ controls:
917
917
  title: Encrypt Sensitive Data in Transit
918
918
  weight: 1.0
919
919
  config_rules:
920
- - name: alb-http-to-https-redirection
920
+ - name: alb-http-to-https-redirection-check
921
921
  resource_types:
922
922
  - AWS::ElasticLoadBalancingV2::LoadBalancer
923
923
  parameters: {}
924
- description: "CIS Control 3.10 - Encrypt Sensitive Data in Transit\n AWS Config Rule: alb-http-to-https-redirection\n \n Ensures Application Load Balancers redirect HTTP traffic to HTTPS."
925
- remediation_guidance: Follow AWS Config rule guidance for alb-http-to-https-redirection
924
+ description: "CIS Control 3.10 - Encrypt Sensitive Data in Transit\n AWS Config Rule: alb-http-to-https-redirection-check\n \n Ensures Application Load Balancers redirect HTTP traffic to HTTPS."
925
+ remediation_guidance: Follow AWS Config rule guidance for alb-http-to-https-redirection-check
926
926
  - name: elb-tls-https-listeners-only
927
927
  resource_types:
928
928
  - AWS::ElasticLoadBalancingV2::LoadBalancer
@@ -56,25 +56,37 @@ class BaseConfigRuleAssessment(ABC):
56
56
  results = []
57
57
 
58
58
  try:
59
- # Validate that we can access required services
60
- if not self._validate_service_access(aws_factory, region):
61
- return [self._create_error_result(
62
- "SERVICE_UNAVAILABLE",
63
- f"Required AWS services not accessible in region {region}",
64
- region
65
- )]
66
-
67
59
  # Evaluate each resource type
68
60
  for resource_type in self.resource_types:
69
61
  try:
62
+ # Determine evaluation region (us-east-1 for account-level resources)
63
+ eval_region = self._get_evaluation_region(resource_type, region)
64
+ is_account_level = self._is_account_level_resource(resource_type)
65
+
66
+ # Skip account-level resources in non-primary regions to prevent duplication
67
+ # Account-level resources are only evaluated once in us-east-1
68
+ if is_account_level and region != 'us-east-1':
69
+ logger.debug(f"Skipping {resource_type} in {region} (account-level resource, evaluated in us-east-1 only)")
70
+ continue
71
+
72
+ # Validate that we can access required services in the evaluation region
73
+ if not self._validate_service_access(aws_factory, eval_region):
74
+ results.append(self._create_error_result(
75
+ "SERVICE_UNAVAILABLE",
76
+ f"Required AWS services not accessible in region {eval_region}",
77
+ eval_region,
78
+ resource_type
79
+ ))
80
+ continue
81
+
70
82
  # Use error handler for resource discovery if available
71
83
  def get_resources():
72
- return self._get_resources(aws_factory, resource_type, region)
84
+ return self._get_resources(aws_factory, resource_type, eval_region)
73
85
 
74
86
  if self.error_handler:
75
87
  context = ErrorContext(
76
88
  service_name=self._get_required_services()[0] if self._get_required_services() else "",
77
- region=region,
89
+ region=eval_region,
78
90
  resource_type=resource_type,
79
91
  operation="get_resources",
80
92
  control_id=self.control_id,
@@ -90,18 +102,18 @@ class BaseConfigRuleAssessment(ABC):
90
102
  else:
91
103
  resources = get_resources()
92
104
 
93
- logger.debug(f"Found {len(resources)} resources of type {resource_type} in {region}")
105
+ logger.debug(f"Found {len(resources)} resources of type {resource_type} in {eval_region}")
94
106
 
95
107
  for resource in resources:
96
108
  try:
97
109
  # Use error handler for resource evaluation if available
98
110
  def evaluate_resource():
99
- return self._evaluate_resource_compliance(resource, aws_factory, region)
111
+ return self._evaluate_resource_compliance(resource, aws_factory, eval_region)
100
112
 
101
113
  if self.error_handler:
102
114
  context = ErrorContext(
103
115
  service_name=self._get_required_services()[0] if self._get_required_services() else "",
104
- region=region,
116
+ region=eval_region,
105
117
  resource_type=resource_type,
106
118
  resource_id=resource.get('id', 'unknown'),
107
119
  operation="evaluate_compliance",
@@ -121,13 +133,20 @@ class BaseConfigRuleAssessment(ABC):
121
133
  results.append(compliance)
122
134
 
123
135
  except Exception as e:
124
- logger.error(f"Error evaluating resource {resource.get('id', 'unknown')}: {e}")
136
+ error_str = str(e)
137
+ # Log expected errors at DEBUG level
138
+ if ("Parameter validation failed" in error_str or
139
+ "Missing required parameter" in error_str or
140
+ "Could not connect to the endpoint URL" in error_str):
141
+ logger.debug(f"Expected error for resource {resource.get('id', 'unknown')}: {e}")
142
+ else:
143
+ logger.error(f"Error evaluating resource {resource.get('id', 'unknown')}: {e}")
125
144
 
126
145
  # Handle error with error handler if available
127
146
  if self.error_handler:
128
147
  context = ErrorContext(
129
148
  service_name=self._get_required_services()[0] if self._get_required_services() else "",
130
- region=region,
149
+ region=eval_region,
131
150
  resource_type=resource_type,
132
151
  resource_id=resource.get('id', 'unknown'),
133
152
  operation="evaluate_compliance",
@@ -139,19 +158,27 @@ class BaseConfigRuleAssessment(ABC):
139
158
  results.append(self._create_error_result(
140
159
  resource.get('id', 'unknown'),
141
160
  f"Evaluation error: {str(e)}",
142
- region,
161
+ eval_region,
143
162
  resource_type
144
163
  ))
145
164
 
146
165
  except ClientError as e:
147
166
  error_code = e.response.get('Error', {}).get('Code', '')
148
- error_message = f"AWS API error: {str(e)}"
167
+ error_message = str(e)
168
+
169
+ # Log parameter validation errors at DEBUG level (expected for some resources)
170
+ if 'Parameter' in error_code or 'parameter' in error_message.lower():
171
+ logger.debug(f"Parameter validation error for {resource_type} in {eval_region}: {e}")
172
+ elif error_code in ['AccessDenied', 'UnauthorizedOperation']:
173
+ logger.debug(f"Access denied for {resource_type} in {eval_region}")
174
+ else:
175
+ logger.error(f"AWS API error for {resource_type} in {eval_region}: {e}")
149
176
 
150
177
  # Handle error with error handler if available
151
178
  if self.error_handler:
152
179
  context = ErrorContext(
153
180
  service_name=self._get_required_services()[0] if self._get_required_services() else "",
154
- region=region,
181
+ region=eval_region,
155
182
  resource_type=resource_type,
156
183
  operation="get_resources",
157
184
  control_id=self.control_id,
@@ -163,25 +190,29 @@ class BaseConfigRuleAssessment(ABC):
163
190
  results.append(self._create_error_result(
164
191
  f"{resource_type}_PERMISSION_ERROR",
165
192
  f"Insufficient permissions to evaluate {resource_type}",
166
- region,
193
+ eval_region,
167
194
  resource_type
168
195
  ))
169
196
  else:
170
197
  results.append(self._create_error_result(
171
198
  f"{resource_type}_API_ERROR",
172
- error_message,
173
- region,
199
+ f"AWS API error: {error_message}",
200
+ eval_region,
174
201
  resource_type
175
202
  ))
176
203
 
177
204
  except Exception as e:
178
- logger.error(f"Unexpected error evaluating {resource_type}: {e}")
205
+ # Log parameter validation errors at DEBUG level (expected for some resources)
206
+ if "Parameter validation failed" in str(e) or "Missing required parameter" in str(e):
207
+ logger.debug(f"Parameter validation error for {resource_type} in {eval_region}: {e}")
208
+ else:
209
+ logger.error(f"Unexpected error evaluating {resource_type}: {e}")
179
210
 
180
211
  # Handle error with error handler if available
181
212
  if self.error_handler:
182
213
  context = ErrorContext(
183
214
  service_name=self._get_required_services()[0] if self._get_required_services() else "",
184
- region=region,
215
+ region=eval_region,
185
216
  resource_type=resource_type,
186
217
  operation="evaluate_resource_type",
187
218
  control_id=self.control_id,
@@ -192,7 +223,7 @@ class BaseConfigRuleAssessment(ABC):
192
223
  results.append(self._create_error_result(
193
224
  f"{resource_type}_UNKNOWN_ERROR",
194
225
  f"Unexpected error: {str(e)}",
195
- region,
226
+ eval_region,
196
227
  resource_type
197
228
  ))
198
229
 
@@ -298,6 +329,57 @@ class BaseConfigRuleAssessment(ABC):
298
329
 
299
330
  return list(services)
300
331
 
332
+ def _is_account_level_resource(self, resource_type: str) -> bool:
333
+ """Check if resource type is account-level (global).
334
+
335
+ Account-level resources should be evaluated in us-east-1 only once,
336
+ not per region. This prevents duplicate evaluations and region validation errors.
337
+
338
+ Args:
339
+ resource_type: AWS resource type (e.g., "AWS::::Account", "AWS::IAM::User")
340
+
341
+ Returns:
342
+ True if resource is account-level/global
343
+ """
344
+ # Explicit account-level marker
345
+ if resource_type == 'AWS::::Account':
346
+ return True
347
+
348
+ # Global services that should only be evaluated in us-east-1
349
+ global_service_prefixes = [
350
+ 'AWS::IAM::', # IAM is global
351
+ 'AWS::CloudFront::', # CloudFront is global
352
+ 'AWS::Route53::', # Route53 is global
353
+ 'AWS::Organizations::', # Organizations is global
354
+ ]
355
+
356
+ for prefix in global_service_prefixes:
357
+ if resource_type.startswith(prefix):
358
+ return True
359
+
360
+ # S3 buckets are special - they're global but region-specific
361
+ # We handle them in controls by checking region == 'us-east-1'
362
+
363
+ return False
364
+
365
+ def _get_evaluation_region(self, resource_type: str, requested_region: str) -> str:
366
+ """Determine which region to use for resource evaluation.
367
+
368
+ Account-level and global resources must be evaluated in us-east-1
369
+ to avoid region validation errors and ensure proper API access.
370
+
371
+ Args:
372
+ resource_type: AWS resource type
373
+ requested_region: Region requested for evaluation
374
+
375
+ Returns:
376
+ Region to use (us-east-1 for account-level, requested_region otherwise)
377
+ """
378
+ if self._is_account_level_resource(resource_type):
379
+ return 'us-east-1'
380
+ return requested_region
381
+
382
+
301
383
  def _create_error_result(self, resource_id: str, error_message: str, region: str, resource_type: str = "Unknown") -> ComplianceResult:
302
384
  """Create a ComplianceResult for error conditions.
303
385
 
@@ -61,13 +61,8 @@ from .control_data_protection import (
61
61
  )
62
62
 
63
63
  from .control_network_security import (
64
- DMSReplicationNotPublicAssessment,
65
- ElasticsearchInVPCOnlyAssessment,
66
- EC2InstancesInVPCAssessment,
67
- EMRMasterNoPublicIPAssessment,
68
- LambdaFunctionPublicAccessProhibitedAssessment,
69
- SageMakerNotebookNoDirectInternetAccessAssessment,
70
- SubnetAutoAssignPublicIPDisabledAssessment
64
+ NetworkFirewallDeployedAssessment,
65
+ Route53ResolverFirewallEnabledAssessment
71
66
  )
72
67
 
73
68
  from .control_iam_governance import (
@@ -143,6 +138,85 @@ from .control_instance_optimization import (
143
138
  EBSOptimizedInstanceAssessment
144
139
  )
145
140
 
141
+ # Phase 1-4: CIS Controls v8.1 IG1 Expansion
142
+ from .control_guardduty import GuardDutyEnabledAssessment
143
+ from .control_inspector import InspectorEnabledAssessment
144
+ from .control_macie import MacieEnabledAssessment
145
+ from .control_access_analyzer import IAMAccessAnalyzerEnabledAssessment
146
+ from .control_vpc_flow_logs import VPCFlowLogsEnabledAssessment
147
+ from .control_elb_logging import ELBLoggingEnabledAssessment
148
+ from .control_cloudfront_logging import CloudFrontLoggingEnabledAssessment
149
+ from .control_waf_logging import WAFLoggingEnabledAssessment
150
+ from .control_ebs_encryption import EBSEncryptionByDefaultAssessment
151
+ from .control_rds_encryption import RDSStorageEncryptedAssessment
152
+ from .control_efs_encryption import EFSEncryptedCheckAssessment
153
+ from .control_dynamodb_encryption import DynamoDBTableEncryptedKMSAssessment
154
+ from .control_s3_encryption import S3DefaultEncryptionKMSAssessment
155
+ from .control_patch_management import (
156
+ SSMPatchManagerEnabledAssessment,
157
+ SSMPatchBaselineConfiguredAssessment,
158
+ EC2PatchComplianceStatusAssessment
159
+ )
160
+ from .control_access_control import (
161
+ SSOEnabledCheckAssessment,
162
+ IdentityCenterConfiguredAssessment
163
+ )
164
+ from .control_mfa import (
165
+ IAMAdminMFARequiredAssessment,
166
+ CognitoMFAEnabledAssessment,
167
+ VPNMFAEnabledAssessment
168
+ )
169
+ from .control_tls_ssl import (
170
+ ALBHTTPToHTTPSRedirectionAssessment,
171
+ ELBTLSHTTPSListenersOnlyAssessment,
172
+ RDSSSLConnectionRequiredAssessment,
173
+ APIGatewaySSLEnabledAssessment,
174
+ RedshiftRequireTLSSSLAssessment
175
+ )
176
+ from .control_messaging_encryption import (
177
+ SNSEncryptedKMSAssessment,
178
+ SQSQueueEncryptedAssessment,
179
+ CloudTrailS3DataEventsEnabledAssessment
180
+ )
181
+ from .control_inventory import (
182
+ SSMInventoryEnabledAssessment,
183
+ ConfigEnabledAllRegionsAssessment,
184
+ AMIInventoryTrackingAssessment,
185
+ LambdaRuntimeInventoryAssessment,
186
+ IAMUserInventoryCheckAssessment
187
+ )
188
+ from .control_configuration_mgmt import (
189
+ ConfigConformancePackDeployedAssessment,
190
+ SecurityHubStandardsEnabledAssessment,
191
+ AssetTaggingComplianceAssessment,
192
+ InspectorAssessmentEnabledAssessment
193
+ )
194
+ from .control_version_mgmt import (
195
+ EC2OSVersionSupportedAssessment,
196
+ RDSEngineVersionSupportedAssessment,
197
+ LambdaRuntimeSupportedAssessment
198
+ )
199
+ from .control_access_asset_mgmt import (
200
+ IAMUserLastAccessCheckAssessment,
201
+ SSMSessionManagerEnabledAssessment,
202
+ UnauthorizedAssetDetectionAssessment
203
+ )
204
+ from .control_data_classification import (
205
+ DataClassificationTaggingAssessment,
206
+ S3BucketClassificationTagsAssessment
207
+ )
208
+ from .control_network_security import (
209
+ NetworkFirewallDeployedAssessment,
210
+ Route53ResolverFirewallEnabledAssessment
211
+ )
212
+ from .control_backup_security import (
213
+ BackupVaultEncryptionEnabledAssessment,
214
+ BackupCrossRegionCopyEnabledAssessment,
215
+ BackupVaultLockEnabledAssessment,
216
+ Route53QueryLoggingEnabledAssessment,
217
+ RDSBackupRetentionCheckAssessment
218
+ )
219
+
146
220
  __all__ = [
147
221
  # Control 1.1 - Asset Inventory
148
222
  'EIPAttachedAssessment',
@@ -171,13 +245,6 @@ __all__ = [
171
245
  'RDSInstancePublicAccessCheckAssessment',
172
246
  'RedshiftClusterPublicAccessCheckAssessment',
173
247
  'S3BucketLevelPublicAccessProhibitedAssessment',
174
- 'DMSReplicationNotPublicAssessment',
175
- 'ElasticsearchInVPCOnlyAssessment',
176
- 'EC2InstancesInVPCAssessment',
177
- 'EMRMasterNoPublicIPAssessment',
178
- 'LambdaFunctionPublicAccessProhibitedAssessment',
179
- 'SageMakerNotebookNoDirectInternetAccessAssessment',
180
- 'SubnetAutoAssignPublicIPDisabledAssessment',
181
248
  'IAMGroupHasUsersCheckAssessment',
182
249
  'IAMPolicyNoStatementsWithFullAccessAssessment',
183
250
  'IAMUserNoPoliciesCheckAssessment',
@@ -252,5 +319,67 @@ __all__ = [
252
319
  'S3BucketPublicWriteProhibitedAssessment',
253
320
 
254
321
  # Instance Optimization
255
- 'EBSOptimizedInstanceAssessment'
322
+ 'EBSOptimizedInstanceAssessment',
323
+
324
+ # Phase 1-4: CIS Controls v8.1 IG1 Expansion (50 new rules)
325
+ # Phase 1 - Quick Wins (13 rules)
326
+ 'GuardDutyEnabledAssessment',
327
+ 'InspectorEnabledAssessment',
328
+ 'MacieEnabledAssessment',
329
+ 'IAMAccessAnalyzerEnabledAssessment',
330
+ 'VPCFlowLogsEnabledAssessment',
331
+ 'ELBLoggingEnabledAssessment',
332
+ 'CloudFrontLoggingEnabledAssessment',
333
+ 'WAFLoggingEnabledAssessment',
334
+ 'EBSEncryptionByDefaultAssessment',
335
+ 'RDSStorageEncryptedAssessment',
336
+ 'EFSEncryptedCheckAssessment',
337
+ 'DynamoDBTableEncryptedKMSAssessment',
338
+ 'S3DefaultEncryptionKMSAssessment',
339
+
340
+ # Phase 2 - Core Security (15 rules)
341
+ 'SSMPatchManagerEnabledAssessment',
342
+ 'SSMPatchBaselineConfiguredAssessment',
343
+ 'EC2PatchComplianceStatusAssessment',
344
+ 'SSOEnabledCheckAssessment',
345
+ 'IdentityCenterConfiguredAssessment',
346
+ 'IAMAdminMFARequiredAssessment',
347
+ 'CognitoMFAEnabledAssessment',
348
+ 'VPNMFAEnabledAssessment',
349
+ 'ALBHTTPToHTTPSRedirectionAssessment',
350
+ 'ELBTLSHTTPSListenersOnlyAssessment',
351
+ 'RDSSSLConnectionRequiredAssessment',
352
+ 'APIGatewaySSLEnabledAssessment',
353
+ 'RedshiftRequireTLSSSLAssessment',
354
+ 'SNSEncryptedKMSAssessment',
355
+ 'SQSQueueEncryptedAssessment',
356
+ 'CloudTrailS3DataEventsEnabledAssessment',
357
+
358
+ # Phase 3 - Advanced (15 rules)
359
+ 'SSMInventoryEnabledAssessment',
360
+ 'ConfigEnabledAllRegionsAssessment',
361
+ 'AMIInventoryTrackingAssessment',
362
+ 'LambdaRuntimeInventoryAssessment',
363
+ 'IAMUserInventoryCheckAssessment',
364
+ 'ConfigConformancePackDeployedAssessment',
365
+ 'SecurityHubStandardsEnabledAssessment',
366
+ 'AssetTaggingComplianceAssessment',
367
+ 'InspectorAssessmentEnabledAssessment',
368
+ 'EC2OSVersionSupportedAssessment',
369
+ 'RDSEngineVersionSupportedAssessment',
370
+ 'LambdaRuntimeSupportedAssessment',
371
+ 'IAMUserLastAccessCheckAssessment',
372
+ 'SSMSessionManagerEnabledAssessment',
373
+ 'UnauthorizedAssetDetectionAssessment',
374
+
375
+ # Phase 4 - Enhanced (7 rules)
376
+ 'DataClassificationTaggingAssessment',
377
+ 'S3BucketClassificationTagsAssessment',
378
+ 'NetworkFirewallDeployedAssessment',
379
+ 'Route53ResolverFirewallEnabledAssessment',
380
+ 'BackupVaultEncryptionEnabledAssessment',
381
+ 'BackupCrossRegionCopyEnabledAssessment',
382
+ 'BackupVaultLockEnabledAssessment',
383
+ 'Route53QueryLoggingEnabledAssessment',
384
+ 'RDSBackupRetentionCheckAssessment'
256
385
  ]
@@ -28,8 +28,8 @@ class AccountPartOfOrganizationsAssessment(BaseConfigRuleAssessment):
28
28
  return []
29
29
 
30
30
  try:
31
- # Get account information
32
- sts_client = aws_factory.get_client('sts', region)
31
+ # Get account information (use allow_global_region for account-level resources)
32
+ sts_client = aws_factory.get_client('sts', region, allow_global_region=True)
33
33
 
34
34
  response = aws_factory.aws_api_call_with_retry(
35
35
  lambda: sts_client.get_caller_identity()
@@ -55,8 +55,8 @@ class AccountPartOfOrganizationsAssessment(BaseConfigRuleAssessment):
55
55
  account_id = resource.get('AccountId', 'unknown')
56
56
 
57
57
  try:
58
- # Check if account is part of an organization
59
- organizations_client = aws_factory.get_client('organizations', region)
58
+ # Check if account is part of an organization (use allow_global_region for account-level resources)
59
+ organizations_client = aws_factory.get_client('organizations', region, allow_global_region=True)
60
60
 
61
61
  # Try to describe the organization
62
62
  response = aws_factory.aws_api_call_with_retry(
@@ -16,8 +16,8 @@ logger = logging.getLogger(__name__)
16
16
 
17
17
  class GuardDutyEnabledAssessment(BaseConfigRuleAssessment):
18
18
  """
19
- CIS Control 10.1 - Deploy and Maintain Anti-Malware Software
20
- AWS Config Rule: guardduty-enabled
19
+ CIS Control 6.2 - Establish and Maintain a Secure Network Architecture
20
+ AWS Config Rule: guardduty-enabled-centralized
21
21
 
22
22
  Ensures GuardDuty is enabled for threat detection and malware defense.
23
23
  GuardDuty provides intelligent threat detection by analyzing VPC Flow Logs,
@@ -26,8 +26,8 @@ class GuardDutyEnabledAssessment(BaseConfigRuleAssessment):
26
26
 
27
27
  def __init__(self):
28
28
  super().__init__(
29
- rule_name="guardduty-enabled",
30
- control_id="10.1",
29
+ rule_name="guardduty-enabled-centralized",
30
+ control_id="6.2",
31
31
  resource_types=["AWS::GuardDuty::Detector"]
32
32
  )
33
33
 
@@ -304,7 +304,7 @@ class S3DefaultEncryptionKMSAssessment(BaseConfigRuleAssessment):
304
304
  ' "Rules": [{',
305
305
  ' "ApplyServerSideEncryptionByDefault": {',
306
306
  ' "SSEAlgorithm": "aws:kms",',
307
- ' "KMSMasterKeyID": "'\"$KMS_KEY_ID\"'"',
307
+ ' "KMSMasterKeyID": "'"$KMS_KEY_ID"'"',
308
308
  " },",
309
309
  ' "BucketKeyEnabled": true',
310
310
  " }]",
@@ -16,16 +16,16 @@ logger = logging.getLogger(__name__)
16
16
 
17
17
  class ALBHTTPToHTTPSRedirectionAssessment(BaseConfigRuleAssessment):
18
18
  """
19
- CIS Control 2.8 - Encrypt Sensitive Data in Transit
20
- AWS Config Rule: alb-http-to-https-redirection
19
+ CIS Control 3.10 - Encrypt Sensitive Data in Transit
20
+ AWS Config Rule: alb-http-to-https-redirection-check
21
21
 
22
22
  Ensures Application Load Balancers redirect HTTP traffic to HTTPS.
23
23
  """
24
24
 
25
25
  def __init__(self):
26
26
  super().__init__(
27
- rule_name="alb-http-to-https-redirection",
28
- control_id="2.8",
27
+ rule_name="alb-http-to-https-redirection-check",
28
+ control_id="3.10",
29
29
  resource_types=["AWS::ElasticLoadBalancingV2::LoadBalancer"]
30
30
  )
31
31
 
@@ -58,7 +58,15 @@ class EC2OSVersionSupportedAssessment(BaseConfigRuleAssessment):
58
58
  return instances
59
59
 
60
60
  except ClientError as e:
61
- logger.error(f"Error retrieving instance information in {region}: {e}")
61
+ error_code = e.response.get('Error', {}).get('Code', '')
62
+ # Log parameter validation errors at DEBUG level (expected for some resources)
63
+ if 'Parameter' in error_code or 'parameter' in str(e).lower():
64
+ logger.debug(f"Parameter validation issue retrieving instance information in {region}: {e}")
65
+ else:
66
+ logger.error(f"Error retrieving instance information in {region}: {e}")
67
+ return []
68
+ except Exception as e:
69
+ logger.error(f"Unexpected error retrieving instance information in {region}: {e}")
62
70
  return []
63
71
 
64
72
  def _check_version_support(self, platform_name: str, platform_version: str) -> bool: