aws-cis-controls-assessment 1.0.9__py3-none-any.whl → 1.0.10__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.
- aws_cis_assessment/__init__.py +1 -1
- aws_cis_assessment/config/rules/cis_controls_ig1.yaml +94 -1
- aws_cis_assessment/config/rules/cis_controls_ig2.yaml +83 -1
- aws_cis_assessment/controls/ig1/__init__.py +17 -0
- aws_cis_assessment/controls/ig1/control_aws_backup_service.py +1276 -0
- aws_cis_assessment/controls/ig2/__init__.py +12 -0
- aws_cis_assessment/controls/ig2/control_aws_backup_ig2.py +23 -0
- aws_cis_assessment/core/assessment_engine.py +20 -0
- {aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.0.10.dist-info}/METADATA +53 -10
- {aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.0.10.dist-info}/RECORD +23 -20
- docs/README.md +14 -3
- docs/adding-aws-backup-controls.md +562 -0
- docs/assessment-logic.md +291 -3
- docs/cli-reference.md +1 -1
- docs/config-rule-mappings.md +46 -5
- docs/developer-guide.md +312 -3
- docs/installation.md +2 -2
- docs/troubleshooting.md +211 -2
- docs/user-guide.md +47 -2
- {aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.0.10.dist-info}/WHEEL +0 -0
- {aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.0.10.dist-info}/entry_points.txt +0 -0
- {aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.0.10.dist-info}/licenses/LICENSE +0 -0
- {aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.0.10.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
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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)
|
{aws_cis_controls_assessment-1.0.9.dist-info → aws_cis_controls_assessment-1.0.10.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|