aws-cis-controls-assessment 1.0.9__py3-none-any.whl → 1.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.
Files changed (26) hide show
  1. aws_cis_assessment/__init__.py +2 -2
  2. aws_cis_assessment/config/rules/cis_controls_ig1.yaml +94 -1
  3. aws_cis_assessment/config/rules/cis_controls_ig2.yaml +680 -1
  4. aws_cis_assessment/controls/ig1/__init__.py +17 -0
  5. aws_cis_assessment/controls/ig1/control_aws_backup_service.py +1276 -0
  6. aws_cis_assessment/controls/ig2/__init__.py +74 -1
  7. aws_cis_assessment/controls/ig2/control_4_5_6_access_configuration.py +2638 -0
  8. aws_cis_assessment/controls/ig2/control_8_audit_logging.py +984 -0
  9. aws_cis_assessment/controls/ig2/control_aws_backup_ig2.py +23 -0
  10. aws_cis_assessment/core/assessment_engine.py +74 -0
  11. aws_cis_assessment/reporters/html_reporter.py +197 -35
  12. {aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.1.0.dist-info}/METADATA +163 -12
  13. {aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.1.0.dist-info}/RECORD +26 -21
  14. docs/README.md +14 -3
  15. docs/adding-aws-backup-controls.md +562 -0
  16. docs/assessment-logic.md +291 -3
  17. docs/cli-reference.md +1 -1
  18. docs/config-rule-mappings.md +465 -7
  19. docs/developer-guide.md +312 -3
  20. docs/installation.md +2 -2
  21. docs/troubleshooting.md +211 -2
  22. docs/user-guide.md +47 -2
  23. {aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.1.0.dist-info}/WHEEL +0 -0
  24. {aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.1.0.dist-info}/entry_points.txt +0 -0
  25. {aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.1.0.dist-info}/licenses/LICENSE +0 -0
  26. {aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.1.0.dist-info}/top_level.txt +0 -0
docs/developer-guide.md CHANGED
@@ -1,15 +1,16 @@
1
1
  # Developer Guide
2
2
 
3
- This guide covers extending and customizing the AWS CIS Controls Compliance Assessment Framework - a production-ready, enterprise-grade solution with 136 implemented rules (131 CIS Controls + 5 bonus security enhancements).
3
+ This guide covers extending and customizing the AWS CIS Controls Compliance Assessment Framework - a production-ready, enterprise-grade solution with 138 implemented rules (133 CIS Controls + 5 bonus security enhancements).
4
4
 
5
5
  ## Production Framework Status
6
6
 
7
7
  **✅ Complete Implementation**
8
8
  - 100% CIS Controls coverage across all Implementation Groups
9
- - 136 total rules implemented (131 CIS + 5 bonus)
9
+ - 138 total rules implemented (133 CIS + 5 bonus)
10
10
  - Production-tested architecture with comprehensive error handling
11
11
  - Enterprise-grade performance and scalability
12
12
  - Ready for immediate deployment and customization
13
+ - **NEW:** AWS Backup service controls for infrastructure assessment
13
14
 
14
15
  ## Table of Contents
15
16
 
@@ -855,4 +856,312 @@ Common utility functions are available in various modules:
855
856
 
856
857
  - `aws_cis_assessment.cli.utils`: CLI utilities
857
858
  - `aws_cis_assessment.core.utils`: Core utilities
858
- - `aws_cis_assessment.reporters.utils`: Reporting utilities
859
+ - `aws_cis_assessment.reporters.utils`: Reporting utilities
860
+
861
+
862
+ ## AWS Backup Controls Example (New in v1.0.10)
863
+
864
+ ### Overview
865
+
866
+ The AWS Backup service controls demonstrate best practices for implementing service-level assessments. These controls assess the backup infrastructure itself, complementing resource-specific backup controls.
867
+
868
+ ### Implementation Example
869
+
870
+ ```python
871
+ # aws_cis_assessment/controls/ig1/control_aws_backup_service.py
872
+ from typing import Dict, List, Any
873
+ import logging
874
+ import json
875
+ from botocore.exceptions import ClientError
876
+
877
+ from aws_cis_assessment.controls.base_control import BaseConfigRuleAssessment
878
+ from aws_cis_assessment.core.models import ComplianceResult, ComplianceStatus
879
+ from aws_cis_assessment.core.aws_client_factory import AWSClientFactory
880
+
881
+ logger = logging.getLogger(__name__)
882
+
883
+
884
+ class BackupPlanMinFrequencyAndMinRetentionCheckAssessment(BaseConfigRuleAssessment):
885
+ """Assessment for backup-plan-min-frequency-and-min-retention-check Config rule.
886
+
887
+ Validates that AWS Backup plans have appropriate backup frequency and retention
888
+ policies to ensure data protection and recovery capabilities.
889
+ """
890
+
891
+ def __init__(self, min_retention_days: int = 7):
892
+ """Initialize backup plan assessment.
893
+
894
+ Args:
895
+ min_retention_days: Minimum retention period in days (default: 7)
896
+ """
897
+ super().__init__(
898
+ rule_name="backup-plan-min-frequency-and-min-retention-check",
899
+ control_id="11.2",
900
+ resource_types=["AWS::Backup::BackupPlan"]
901
+ )
902
+ self.min_retention_days = min_retention_days
903
+
904
+ def _get_resources(self, aws_factory: AWSClientFactory,
905
+ resource_type: str, region: str) -> List[Dict[str, Any]]:
906
+ """Get all AWS Backup plans in the region."""
907
+ if resource_type != "AWS::Backup::BackupPlan":
908
+ return []
909
+
910
+ try:
911
+ backup_client = aws_factory.get_client('backup', region)
912
+
913
+ # List all backup plans
914
+ response = aws_factory.aws_api_call_with_retry(
915
+ lambda: backup_client.list_backup_plans()
916
+ )
917
+
918
+ plans = []
919
+ for plan in response.get('BackupPlansList', []):
920
+ plan_id = plan.get('BackupPlanId')
921
+ plan_name = plan.get('BackupPlanName')
922
+
923
+ try:
924
+ # Get detailed plan information including rules
925
+ plan_details = aws_factory.aws_api_call_with_retry(
926
+ lambda: backup_client.get_backup_plan(BackupPlanId=plan_id)
927
+ )
928
+
929
+ plans.append({
930
+ 'BackupPlanId': plan_id,
931
+ 'BackupPlanName': plan_name,
932
+ 'BackupPlan': plan_details.get('BackupPlan'),
933
+ 'BackupPlanArn': plan_details.get('BackupPlanArn'),
934
+ 'VersionId': plan.get('VersionId'),
935
+ 'CreationDate': plan.get('CreationDate')
936
+ })
937
+
938
+ except ClientError as e:
939
+ logger.warning(f"Could not get details for backup plan {plan_name}: {e}")
940
+ # Include plan with minimal info
941
+ plans.append({
942
+ 'BackupPlanId': plan_id,
943
+ 'BackupPlanName': plan_name,
944
+ 'BackupPlan': None,
945
+ 'Error': str(e)
946
+ })
947
+
948
+ logger.info(f"Retrieved {len(plans)} backup plan(s) in region {region}")
949
+ return plans
950
+
951
+ except ClientError as e:
952
+ if e.response.get('Error', {}).get('Code') in ['AccessDenied', 'UnauthorizedOperation']:
953
+ logger.warning(f"Insufficient permissions to list backup plans in region {region}")
954
+ return []
955
+ logger.error(f"Error retrieving backup plans in region {region}: {e}")
956
+ raise
957
+
958
+ def _evaluate_resource_compliance(self, resource: Dict[str, Any],
959
+ aws_factory: AWSClientFactory,
960
+ region: str) -> ComplianceResult:
961
+ """Evaluate if backup plan has appropriate frequency and retention."""
962
+ plan_id = resource.get('BackupPlanId', 'unknown')
963
+ plan_name = resource.get('BackupPlanName', 'unknown')
964
+ backup_plan = resource.get('BackupPlan')
965
+
966
+ # Check if plan details were retrieved
967
+ if backup_plan is None:
968
+ error_msg = resource.get('Error', 'Unknown error')
969
+ return ComplianceResult(
970
+ resource_id=plan_id,
971
+ resource_type="AWS::Backup::BackupPlan",
972
+ compliance_status=ComplianceStatus.ERROR,
973
+ evaluation_reason=f"Could not retrieve backup plan details: {error_msg}",
974
+ config_rule_name=self.rule_name,
975
+ region=region
976
+ )
977
+
978
+ # Check backup rules
979
+ rules = backup_plan.get('Rules', [])
980
+
981
+ if not rules:
982
+ return ComplianceResult(
983
+ resource_id=plan_id,
984
+ resource_type="AWS::Backup::BackupPlan",
985
+ compliance_status=ComplianceStatus.NON_COMPLIANT,
986
+ evaluation_reason=f"Backup plan '{plan_name}' has no backup rules defined",
987
+ config_rule_name=self.rule_name,
988
+ region=region
989
+ )
990
+
991
+ # Validate each rule
992
+ compliant_rules = 0
993
+ issues = []
994
+
995
+ for rule in rules:
996
+ rule_name = rule.get('RuleName', 'unnamed')
997
+ schedule = rule.get('ScheduleExpression', '')
998
+ lifecycle = rule.get('Lifecycle', {})
999
+
1000
+ # Check schedule expression
1001
+ if not schedule:
1002
+ issues.append(f"Rule '{rule_name}' has no schedule expression")
1003
+ continue
1004
+
1005
+ # Validate schedule format (cron or rate expression)
1006
+ has_valid_schedule = self._validate_schedule_expression(schedule)
1007
+ if not has_valid_schedule:
1008
+ issues.append(f"Rule '{rule_name}' has invalid schedule expression: {schedule}")
1009
+
1010
+ # Check retention period
1011
+ delete_after_days = lifecycle.get('DeleteAfterDays')
1012
+ move_to_cold_storage_after_days = lifecycle.get('MoveToColdStorageAfterDays')
1013
+
1014
+ if delete_after_days is None:
1015
+ issues.append(f"Rule '{rule_name}' has no retention period defined")
1016
+ elif delete_after_days < self.min_retention_days:
1017
+ issues.append(
1018
+ f"Rule '{rule_name}' has insufficient retention "
1019
+ f"({delete_after_days} days, minimum: {self.min_retention_days} days)"
1020
+ )
1021
+ else:
1022
+ # Check cold storage configuration if present
1023
+ if move_to_cold_storage_after_days is not None:
1024
+ if move_to_cold_storage_after_days >= delete_after_days:
1025
+ issues.append(
1026
+ f"Rule '{rule_name}' has invalid lifecycle: "
1027
+ f"cold storage transition ({move_to_cold_storage_after_days} days) "
1028
+ f"must be before deletion ({delete_after_days} days)"
1029
+ )
1030
+ else:
1031
+ # Rule is compliant
1032
+ if has_valid_schedule:
1033
+ compliant_rules += 1
1034
+ else:
1035
+ # No cold storage, just check schedule and retention
1036
+ if has_valid_schedule:
1037
+ compliant_rules += 1
1038
+
1039
+ # Determine overall compliance
1040
+ if compliant_rules == len(rules) and not issues:
1041
+ compliance_status = ComplianceStatus.COMPLIANT
1042
+ evaluation_reason = (
1043
+ f"Backup plan '{plan_name}' has {len(rules)} compliant rule(s) "
1044
+ f"with valid schedules and retention >= {self.min_retention_days} days"
1045
+ )
1046
+ elif compliant_rules > 0:
1047
+ compliance_status = ComplianceStatus.NON_COMPLIANT
1048
+ evaluation_reason = (
1049
+ f"Backup plan '{plan_name}' has {compliant_rules}/{len(rules)} compliant rules. "
1050
+ f"Issues: {'; '.join(issues)}"
1051
+ )
1052
+ else:
1053
+ compliance_status = ComplianceStatus.NON_COMPLIANT
1054
+ evaluation_reason = (
1055
+ f"Backup plan '{plan_name}' has no compliant rules. "
1056
+ f"Issues: {'; '.join(issues)}"
1057
+ )
1058
+
1059
+ return ComplianceResult(
1060
+ resource_id=plan_id,
1061
+ resource_type="AWS::Backup::BackupPlan",
1062
+ compliance_status=compliance_status,
1063
+ evaluation_reason=evaluation_reason,
1064
+ config_rule_name=self.rule_name,
1065
+ region=region
1066
+ )
1067
+
1068
+ def _validate_schedule_expression(self, schedule: str) -> bool:
1069
+ """Validate AWS Backup schedule expression format."""
1070
+ if not schedule:
1071
+ return False
1072
+
1073
+ schedule_lower = schedule.lower().strip()
1074
+
1075
+ # Check for cron expression
1076
+ if schedule_lower.startswith('cron(') and schedule_lower.endswith(')'):
1077
+ return True
1078
+
1079
+ # Check for rate expression
1080
+ if schedule_lower.startswith('rate(') and schedule_lower.endswith(')'):
1081
+ return True
1082
+
1083
+ return False
1084
+ ```
1085
+
1086
+ ### Key Implementation Patterns
1087
+
1088
+ 1. **Configurable Parameters**: The `min_retention_days` parameter allows customization
1089
+ 2. **Comprehensive Error Handling**: Gracefully handles access denied and missing resources
1090
+ 3. **Detailed Evaluation**: Provides specific reasons for non-compliance
1091
+ 4. **Validation Logic**: Validates schedule expressions and lifecycle policies
1092
+ 5. **Logging**: Appropriate logging for troubleshooting
1093
+
1094
+ ### Testing Example
1095
+
1096
+ ```python
1097
+ # tests/test_aws_backup_service_controls.py
1098
+ import pytest
1099
+ from unittest.mock import Mock
1100
+ from botocore.exceptions import ClientError
1101
+
1102
+ from aws_cis_assessment.controls.ig1.control_aws_backup_service import (
1103
+ BackupPlanMinFrequencyAndMinRetentionCheckAssessment
1104
+ )
1105
+ from aws_cis_assessment.core.models import ComplianceStatus
1106
+
1107
+ class TestBackupPlanMinFrequencyAndMinRetentionCheckAssessment:
1108
+
1109
+ def test_compliant_plan(self):
1110
+ """Test evaluation of compliant backup plan."""
1111
+ assessment = BackupPlanMinFrequencyAndMinRetentionCheckAssessment()
1112
+ aws_factory = Mock()
1113
+
1114
+ resource = {
1115
+ 'BackupPlanId': 'plan-123',
1116
+ 'BackupPlanName': 'daily-backup',
1117
+ 'BackupPlan': {
1118
+ 'Rules': [{
1119
+ 'RuleName': 'daily-rule',
1120
+ 'ScheduleExpression': 'cron(0 5 * * ? *)',
1121
+ 'Lifecycle': {'DeleteAfterDays': 30}
1122
+ }]
1123
+ }
1124
+ }
1125
+
1126
+ result = assessment._evaluate_resource_compliance(resource, aws_factory, "us-east-1")
1127
+
1128
+ assert result.compliance_status == ComplianceStatus.COMPLIANT
1129
+ assert 'compliant rule(s)' in result.evaluation_reason
1130
+ assert result.resource_id == 'plan-123'
1131
+
1132
+ def test_plan_insufficient_retention(self):
1133
+ """Test evaluation of backup plan with insufficient retention."""
1134
+ assessment = BackupPlanMinFrequencyAndMinRetentionCheckAssessment()
1135
+ aws_factory = Mock()
1136
+
1137
+ resource = {
1138
+ 'BackupPlanId': 'plan-123',
1139
+ 'BackupPlanName': 'short-retention',
1140
+ 'BackupPlan': {
1141
+ 'Rules': [{
1142
+ 'RuleName': 'short-rule',
1143
+ 'ScheduleExpression': 'cron(0 5 * * ? *)',
1144
+ 'Lifecycle': {'DeleteAfterDays': 3} # Less than minimum 7 days
1145
+ }]
1146
+ }
1147
+ }
1148
+
1149
+ result = assessment._evaluate_resource_compliance(resource, aws_factory, "us-east-1")
1150
+
1151
+ assert result.compliance_status == ComplianceStatus.NON_COMPLIANT
1152
+ assert 'insufficient retention' in result.evaluation_reason
1153
+ ```
1154
+
1155
+ ### Documentation
1156
+
1157
+ For complete documentation on AWS Backup controls, see:
1158
+ - [AWS Backup Controls Implementation Guide](adding-aws-backup-controls.md)
1159
+ - [AWS Backup Controls Summary](../AWS_BACKUP_CONTROLS_IMPLEMENTATION_SUMMARY.md)
1160
+
1161
+ ### Benefits of This Approach
1162
+
1163
+ 1. **Hybrid Model**: Combines resource-specific and service-level assessments
1164
+ 2. **Comprehensive Coverage**: Validates both resource protection and infrastructure security
1165
+ 3. **Flexible**: Works for organizations using AWS Backup or service-native backups
1166
+ 4. **Extensible**: Easy to add more AWS Backup controls (vault lock, restore testing, etc.)
1167
+ 5. **Production-Ready**: Full error handling, logging, and testing
docs/installation.md CHANGED
@@ -7,7 +7,7 @@ This guide covers the installation and initial setup of the AWS CIS Controls Com
7
7
  ## Production Status
8
8
 
9
9
  **✅ Ready for Enterprise Deployment**
10
- - Complete implementation with 136 AWS Config rules (131 CIS Controls + 5 bonus)
10
+ - Complete implementation with 138 AWS Config rules (133 CIS Controls + 5 bonus)
11
11
  - 100% CIS Controls coverage across all Implementation Groups
12
12
  - Production-tested architecture with comprehensive error handling
13
13
  - Enterprise-grade performance and scalability
@@ -104,7 +104,7 @@ aws-cis-assess assess --aws-profile my-sso-profile
104
104
 
105
105
  ## Required IAM Permissions
106
106
 
107
- The tool requires read-only permissions for various AWS services. Here's a comprehensive IAM policy that covers all 136 assessments:
107
+ The tool requires read-only permissions for various AWS services. Here's a comprehensive IAM policy that covers all 138 assessments:
108
108
 
109
109
  ```json
110
110
  {
docs/troubleshooting.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Troubleshooting Guide
2
2
 
3
- This guide helps you diagnose and resolve common issues with the AWS CIS Controls Compliance Assessment Framework - a production-ready, enterprise-grade solution with 136 implemented rules.
3
+ This guide helps you diagnose and resolve common issues with the AWS CIS Controls Compliance Assessment Framework - a production-ready, enterprise-grade solution with 138 implemented rules.
4
4
 
5
5
  ## Production Framework Status
6
6
 
@@ -631,4 +631,213 @@ When reporting issues, include:
631
631
  For enterprise users:
632
632
  - **AWS Support**: For AWS service-related issues
633
633
  - **Professional Services**: For implementation assistance
634
- - **Training**: For team education and best practices
634
+ - **Training**: For team education and best practices
635
+
636
+
637
+ ## AWS Backup Controls Issues
638
+
639
+ ### Problem: Backup Plan Assessment Failures
640
+
641
+ **Error Message:**
642
+ ```
643
+ AccessDenied: User is not authorized to perform: backup:ListBackupPlans
644
+ ```
645
+
646
+ **Solutions:**
647
+
648
+ 1. **Add Backup permissions:**
649
+ ```bash
650
+ # Ensure IAM policy includes Backup permissions
651
+ aws iam attach-user-policy \
652
+ --user-name your-user \
653
+ --policy-arn arn:aws:iam::aws:policy/AWSBackupReadOnlyAccess
654
+ ```
655
+
656
+ 2. **Verify Backup service availability:**
657
+ ```bash
658
+ # Check if Backup service is available in region
659
+ aws backup list-backup-plans --region us-east-1
660
+ ```
661
+
662
+ 3. **Check for Backup plans:**
663
+ ```bash
664
+ # List existing backup plans
665
+ aws backup list-backup-plans --query 'BackupPlansList[*].[BackupPlanName,BackupPlanId]' --output table
666
+ ```
667
+
668
+ ### Problem: Backup Vault Access Policy Check Failures
669
+
670
+ **Error Message:**
671
+ ```
672
+ ResourceNotFoundException: Backup vault not found
673
+ ```
674
+
675
+ **Solutions:**
676
+
677
+ 1. **Verify backup vaults exist:**
678
+ ```bash
679
+ # List backup vaults in region
680
+ aws backup list-backup-vaults --region us-east-1
681
+ ```
682
+
683
+ 2. **Check vault access policy:**
684
+ ```bash
685
+ # Get vault access policy
686
+ aws backup get-backup-vault-access-policy --backup-vault-name MyVault
687
+ ```
688
+
689
+ 3. **Create backup vault if needed:**
690
+ ```bash
691
+ # Create a backup vault
692
+ aws backup create-backup-vault --backup-vault-name MyVault
693
+ ```
694
+
695
+ ### Problem: Backup Plan Frequency/Retention Validation
696
+
697
+ **Symptoms:**
698
+ - Backup plans marked as non-compliant
699
+ - Frequency or retention requirements not met
700
+ - Assessment shows "Backup plan does not meet minimum requirements"
701
+
702
+ **Solutions:**
703
+
704
+ 1. **Review backup plan rules:**
705
+ ```bash
706
+ # Get backup plan details
707
+ aws backup get-backup-plan --backup-plan-id <plan-id>
708
+ ```
709
+
710
+ 2. **Check schedule expression:**
711
+ ```bash
712
+ # Verify cron/rate expression meets requirements
713
+ # Minimum daily frequency: cron(0 0 * * ? *) or rate(1 day)
714
+ ```
715
+
716
+ 3. **Verify retention settings:**
717
+ ```bash
718
+ # Ensure DeleteAfterDays >= 35 days (5 weeks)
719
+ # Check lifecycle settings in backup plan rules
720
+ ```
721
+
722
+ 4. **Update backup plan:**
723
+ ```bash
724
+ # Update plan to meet requirements
725
+ aws backup update-backup-plan \
726
+ --backup-plan-id <plan-id> \
727
+ --backup-plan file://updated-plan.json
728
+ ```
729
+
730
+ ### Problem: No Backup Resources Found
731
+
732
+ **Symptoms:**
733
+ - Assessment shows "No backup plans found"
734
+ - Zero backup-related resources discovered
735
+ - All backup controls show NOT_APPLICABLE
736
+
737
+ **Solutions:**
738
+
739
+ 1. **Enable AWS Backup:**
740
+ ```bash
741
+ # Create your first backup plan
742
+ aws backup create-backup-plan --backup-plan file://backup-plan.json
743
+ ```
744
+
745
+ 2. **Check region scope:**
746
+ ```bash
747
+ # Backup resources are regional
748
+ # Ensure you're checking the correct regions
749
+ aws-cis-assess assess --regions us-east-1,us-west-2 --verbose
750
+ ```
751
+
752
+ 3. **Verify service availability:**
753
+ ```bash
754
+ # Check if Backup service is enabled in your account
755
+ aws backup describe-global-settings
756
+ ```
757
+
758
+ ### Problem: Backup Vault Policy Validation
759
+
760
+ **Symptoms:**
761
+ - Vault policy marked as non-compliant
762
+ - "Vault allows public access" or "Vault policy too permissive"
763
+ - Policy validation failures
764
+
765
+ **Solutions:**
766
+
767
+ 1. **Review vault policy:**
768
+ ```bash
769
+ # Get current vault policy
770
+ aws backup get-backup-vault-access-policy \
771
+ --backup-vault-name MyVault \
772
+ --query 'Policy' \
773
+ --output text | jq .
774
+ ```
775
+
776
+ 2. **Check for overly permissive principals:**
777
+ ```json
778
+ {
779
+ "Statement": [{
780
+ "Principal": "*", // ❌ Too permissive
781
+ "Effect": "Allow",
782
+ "Action": "backup:*"
783
+ }]
784
+ }
785
+ ```
786
+
787
+ 3. **Update vault policy:**
788
+ ```bash
789
+ # Apply restrictive policy
790
+ aws backup put-backup-vault-access-policy \
791
+ --backup-vault-name MyVault \
792
+ --policy file://restrictive-policy.json
793
+ ```
794
+
795
+ 4. **Best practice policy example:**
796
+ ```json
797
+ {
798
+ "Version": "2012-10-17",
799
+ "Statement": [{
800
+ "Effect": "Allow",
801
+ "Principal": {
802
+ "AWS": "arn:aws:iam::123456789012:role/BackupRole"
803
+ },
804
+ "Action": [
805
+ "backup:DescribeBackupVault",
806
+ "backup:ListRecoveryPointsByBackupVault"
807
+ ],
808
+ "Resource": "*"
809
+ }]
810
+ }
811
+ ```
812
+
813
+ ### Problem: Backup Assessment Performance
814
+
815
+ **Symptoms:**
816
+ - Backup control assessments take too long
817
+ - Timeout errors during backup plan evaluation
818
+ - High API call volume to Backup service
819
+
820
+ **Solutions:**
821
+
822
+ 1. **Limit assessment scope:**
823
+ ```bash
824
+ # Assess only specific backup controls
825
+ aws-cis-assess assess --controls 11.1,11.2 --regions us-east-1
826
+ ```
827
+
828
+ 2. **Reduce parallel workers:**
829
+ ```bash
830
+ # Lower concurrency for Backup API calls
831
+ aws-cis-assess assess --max-workers 2
832
+ ```
833
+
834
+ 3. **Check for large number of backup plans:**
835
+ ```bash
836
+ # Count backup plans
837
+ aws backup list-backup-plans --query 'length(BackupPlansList)'
838
+ ```
839
+
840
+ 4. **Optimize backup plan structure:**
841
+ - Consolidate multiple small plans into fewer comprehensive plans
842
+ - Use backup selections to target specific resources
843
+ - Avoid creating excessive backup plans per region
docs/user-guide.md CHANGED
@@ -5,10 +5,11 @@ This comprehensive guide covers how to use the AWS CIS Controls Compliance Asses
5
5
  ## Production Framework Overview
6
6
 
7
7
  **✅ Complete Implementation**
8
- - 136 AWS Config rules implemented (131 CIS Controls + 5 bonus security rules)
8
+ - 138 AWS Config rules implemented (133 CIS Controls + 5 bonus security rules)
9
9
  - 100% coverage across all Implementation Groups (IG1, IG2, IG3)
10
10
  - Production-tested architecture with enterprise-grade error handling
11
11
  - Ready for immediate deployment in production environments
12
+ - **NEW:** AWS Backup service controls for infrastructure assessment
12
13
 
13
14
  ## Table of Contents
14
15
 
@@ -490,4 +491,48 @@ Each non-compliant finding includes:
490
491
  - **Configuration Guide**: Learn about customizing assessments
491
492
  - **Troubleshooting Guide**: Resolve common issues
492
493
  - **CLI Reference**: Complete command reference
493
- - **Developer Guide**: Extend and customize the tool
494
+ - **Developer Guide**: Extend and customize the tool
495
+
496
+
497
+ ## AWS Backup Controls (New in v1.0.10)
498
+
499
+ ### Overview
500
+
501
+ Two new controls have been added to assess AWS Backup service infrastructure:
502
+
503
+ 1. **backup-plan-min-frequency-and-min-retention-check**
504
+ - Validates backup plans have appropriate frequency and retention policies
505
+ - Ensures backups happen regularly (daily minimum)
506
+ - Checks retention periods meet minimum requirements (7 days default)
507
+ - Validates lifecycle policies for cold storage transitions
508
+
509
+ 2. **backup-vault-access-policy-check**
510
+ - Ensures backup vaults have secure access policies
511
+ - Detects publicly accessible backup vaults
512
+ - Identifies overly permissive access policies
513
+ - Warns about dangerous permissions
514
+
515
+ ### Usage
516
+
517
+ These controls are automatically included in IG1 assessments:
518
+
519
+ ```bash
520
+ # Run assessment including new backup controls
521
+ aws-cis-assess assess --implementation-groups IG1
522
+
523
+ # Focus on backup-related controls
524
+ aws-cis-assess assess --controls 11.2
525
+ ```
526
+
527
+ ### Benefits
528
+
529
+ - **Comprehensive Coverage**: Assesses both resource protection AND backup infrastructure
530
+ - **Security Validation**: Ensures backup vaults aren't publicly accessible
531
+ - **Compliance Checking**: Validates backup policies meet organizational requirements
532
+ - **Ransomware Protection**: Helps identify backup vulnerabilities
533
+
534
+ ### Documentation
535
+
536
+ For detailed information about AWS Backup controls, see:
537
+ - [AWS Backup Controls Implementation Guide](adding-aws-backup-controls.md)
538
+ - [AWS Backup Controls Summary](../AWS_BACKUP_CONTROLS_IMPLEMENTATION_SUMMARY.md)