aws-cis-controls-assessment 1.0.3__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 (77) hide show
  1. aws_cis_assessment/__init__.py +11 -0
  2. aws_cis_assessment/cli/__init__.py +3 -0
  3. aws_cis_assessment/cli/examples.py +274 -0
  4. aws_cis_assessment/cli/main.py +1259 -0
  5. aws_cis_assessment/cli/utils.py +356 -0
  6. aws_cis_assessment/config/__init__.py +1 -0
  7. aws_cis_assessment/config/config_loader.py +328 -0
  8. aws_cis_assessment/config/rules/cis_controls_ig1.yaml +590 -0
  9. aws_cis_assessment/config/rules/cis_controls_ig2.yaml +412 -0
  10. aws_cis_assessment/config/rules/cis_controls_ig3.yaml +100 -0
  11. aws_cis_assessment/controls/__init__.py +1 -0
  12. aws_cis_assessment/controls/base_control.py +400 -0
  13. aws_cis_assessment/controls/ig1/__init__.py +239 -0
  14. aws_cis_assessment/controls/ig1/control_1_1.py +586 -0
  15. aws_cis_assessment/controls/ig1/control_2_2.py +231 -0
  16. aws_cis_assessment/controls/ig1/control_3_3.py +718 -0
  17. aws_cis_assessment/controls/ig1/control_3_4.py +235 -0
  18. aws_cis_assessment/controls/ig1/control_4_1.py +461 -0
  19. aws_cis_assessment/controls/ig1/control_access_keys.py +310 -0
  20. aws_cis_assessment/controls/ig1/control_advanced_security.py +512 -0
  21. aws_cis_assessment/controls/ig1/control_backup_recovery.py +510 -0
  22. aws_cis_assessment/controls/ig1/control_cloudtrail_logging.py +197 -0
  23. aws_cis_assessment/controls/ig1/control_critical_security.py +422 -0
  24. aws_cis_assessment/controls/ig1/control_data_protection.py +898 -0
  25. aws_cis_assessment/controls/ig1/control_iam_advanced.py +573 -0
  26. aws_cis_assessment/controls/ig1/control_iam_governance.py +493 -0
  27. aws_cis_assessment/controls/ig1/control_iam_policies.py +383 -0
  28. aws_cis_assessment/controls/ig1/control_instance_optimization.py +100 -0
  29. aws_cis_assessment/controls/ig1/control_network_enhancements.py +203 -0
  30. aws_cis_assessment/controls/ig1/control_network_security.py +672 -0
  31. aws_cis_assessment/controls/ig1/control_s3_enhancements.py +173 -0
  32. aws_cis_assessment/controls/ig1/control_s3_security.py +422 -0
  33. aws_cis_assessment/controls/ig1/control_vpc_security.py +235 -0
  34. aws_cis_assessment/controls/ig2/__init__.py +172 -0
  35. aws_cis_assessment/controls/ig2/control_3_10.py +698 -0
  36. aws_cis_assessment/controls/ig2/control_3_11.py +1330 -0
  37. aws_cis_assessment/controls/ig2/control_5_2.py +393 -0
  38. aws_cis_assessment/controls/ig2/control_advanced_encryption.py +355 -0
  39. aws_cis_assessment/controls/ig2/control_codebuild_security.py +263 -0
  40. aws_cis_assessment/controls/ig2/control_encryption_rest.py +382 -0
  41. aws_cis_assessment/controls/ig2/control_encryption_transit.py +382 -0
  42. aws_cis_assessment/controls/ig2/control_network_ha.py +467 -0
  43. aws_cis_assessment/controls/ig2/control_remaining_encryption.py +426 -0
  44. aws_cis_assessment/controls/ig2/control_remaining_rules.py +363 -0
  45. aws_cis_assessment/controls/ig2/control_service_logging.py +402 -0
  46. aws_cis_assessment/controls/ig3/__init__.py +49 -0
  47. aws_cis_assessment/controls/ig3/control_12_8.py +395 -0
  48. aws_cis_assessment/controls/ig3/control_13_1.py +467 -0
  49. aws_cis_assessment/controls/ig3/control_3_14.py +523 -0
  50. aws_cis_assessment/controls/ig3/control_7_1.py +359 -0
  51. aws_cis_assessment/core/__init__.py +1 -0
  52. aws_cis_assessment/core/accuracy_validator.py +425 -0
  53. aws_cis_assessment/core/assessment_engine.py +1266 -0
  54. aws_cis_assessment/core/audit_trail.py +491 -0
  55. aws_cis_assessment/core/aws_client_factory.py +313 -0
  56. aws_cis_assessment/core/error_handler.py +607 -0
  57. aws_cis_assessment/core/models.py +166 -0
  58. aws_cis_assessment/core/scoring_engine.py +459 -0
  59. aws_cis_assessment/reporters/__init__.py +8 -0
  60. aws_cis_assessment/reporters/base_reporter.py +454 -0
  61. aws_cis_assessment/reporters/csv_reporter.py +835 -0
  62. aws_cis_assessment/reporters/html_reporter.py +2162 -0
  63. aws_cis_assessment/reporters/json_reporter.py +561 -0
  64. aws_cis_controls_assessment-1.0.3.dist-info/METADATA +248 -0
  65. aws_cis_controls_assessment-1.0.3.dist-info/RECORD +77 -0
  66. aws_cis_controls_assessment-1.0.3.dist-info/WHEEL +5 -0
  67. aws_cis_controls_assessment-1.0.3.dist-info/entry_points.txt +2 -0
  68. aws_cis_controls_assessment-1.0.3.dist-info/licenses/LICENSE +21 -0
  69. aws_cis_controls_assessment-1.0.3.dist-info/top_level.txt +2 -0
  70. docs/README.md +94 -0
  71. docs/assessment-logic.md +766 -0
  72. docs/cli-reference.md +698 -0
  73. docs/config-rule-mappings.md +393 -0
  74. docs/developer-guide.md +858 -0
  75. docs/installation.md +299 -0
  76. docs/troubleshooting.md +634 -0
  77. docs/user-guide.md +487 -0
@@ -0,0 +1,235 @@
1
+ """
2
+ CIS Control 12.2 - VPC Security Controls
3
+ Network security controls for VPC hardening and access restriction.
4
+ """
5
+
6
+ import logging
7
+ from typing import List, Dict, Any, Optional
8
+ import boto3
9
+ from botocore.exceptions import ClientError, NoCredentialsError
10
+
11
+ from aws_cis_assessment.controls.base_control import BaseConfigRuleAssessment
12
+ from aws_cis_assessment.core.models import ComplianceResult, ComplianceStatus
13
+ from aws_cis_assessment.core.aws_client_factory import AWSClientFactory
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class VPCDefaultSecurityGroupClosedAssessment(BaseConfigRuleAssessment):
19
+ """
20
+ CIS Control 12.2 - Establish and Maintain a Secure Network Architecture
21
+ AWS Config Rule: vpc-default-security-group-closed
22
+
23
+ Ensures default security groups restrict all traffic to prevent accidental exposure.
24
+ """
25
+
26
+ def __init__(self):
27
+ super().__init__(
28
+ rule_name="vpc-default-security-group-closed",
29
+ control_id="12.2",
30
+ resource_types=["AWS::EC2::SecurityGroup"]
31
+ )
32
+
33
+ def _get_resources(self, aws_factory: AWSClientFactory, resource_type: str, region: str) -> List[Dict[str, Any]]:
34
+ """Get all default security groups in the region."""
35
+ if resource_type != "AWS::EC2::SecurityGroup":
36
+ return []
37
+
38
+ try:
39
+ ec2_client = aws_factory.get_client('ec2', region)
40
+
41
+ # Get all default security groups
42
+ response = ec2_client.describe_security_groups(
43
+ Filters=[
44
+ {'Name': 'group-name', 'Values': ['default']}
45
+ ]
46
+ )
47
+
48
+ security_groups = []
49
+ for sg in response.get('SecurityGroups', []):
50
+ group_id = sg.get('GroupId', '')
51
+ vpc_id = sg.get('VpcId', '')
52
+
53
+ # Analyze ingress and egress rules
54
+ ingress_rules = sg.get('IpPermissions', [])
55
+ egress_rules = sg.get('IpPermissionsEgress', [])
56
+
57
+ # Check if rules allow any traffic
58
+ has_ingress_rules = len(ingress_rules) > 0
59
+ has_egress_rules = len([rule for rule in egress_rules
60
+ if not (rule.get('IpProtocol') == '-1' and
61
+ rule.get('IpRanges') == [{'CidrIp': '0.0.0.0/0'}])])
62
+
63
+ security_groups.append({
64
+ 'GroupId': group_id,
65
+ 'GroupName': sg.get('GroupName', ''),
66
+ 'VpcId': vpc_id,
67
+ 'IngressRules': ingress_rules,
68
+ 'EgressRules': egress_rules,
69
+ 'HasIngressRules': has_ingress_rules,
70
+ 'HasCustomEgressRules': has_egress_rules,
71
+ 'IsDefaultGroup': True
72
+ })
73
+
74
+ logger.debug(f"Found {len(security_groups)} default security groups in {region}")
75
+ return security_groups
76
+
77
+ except ClientError as e:
78
+ logger.error(f"Error retrieving default security groups from {region}: {e}")
79
+ raise
80
+ except Exception as e:
81
+ logger.error(f"Unexpected error retrieving default security groups from {region}: {e}")
82
+ raise
83
+
84
+ def _evaluate_resource_compliance(self, resource: Dict[str, Any], aws_factory: AWSClientFactory, region: str) -> ComplianceResult:
85
+ """Evaluate if default security group restricts all traffic."""
86
+ group_id = resource.get('GroupId', 'unknown')
87
+ vpc_id = resource.get('VpcId', 'unknown')
88
+ has_ingress_rules = resource.get('HasIngressRules', False)
89
+ has_custom_egress_rules = resource.get('HasCustomEgressRules', False)
90
+
91
+ # Default security group should have no ingress rules and only default egress rule
92
+ if not has_ingress_rules and not has_custom_egress_rules:
93
+ return ComplianceResult(
94
+ resource_id=group_id,
95
+ resource_type="AWS::EC2::SecurityGroup",
96
+ compliance_status=ComplianceStatus.COMPLIANT,
97
+ evaluation_reason=f"Default security group {group_id} in VPC {vpc_id} restricts all traffic",
98
+ config_rule_name=self.rule_name,
99
+ region=region
100
+ )
101
+ else:
102
+ issues = []
103
+ if has_ingress_rules:
104
+ issues.append("has ingress rules")
105
+ if has_custom_egress_rules:
106
+ issues.append("has custom egress rules")
107
+
108
+ return ComplianceResult(
109
+ resource_id=group_id,
110
+ resource_type="AWS::EC2::SecurityGroup",
111
+ compliance_status=ComplianceStatus.NON_COMPLIANT,
112
+ evaluation_reason=f"Default security group {group_id} in VPC {vpc_id} {' and '.join(issues)}",
113
+ config_rule_name=self.rule_name,
114
+ region=region
115
+ )
116
+
117
+
118
+ class RestrictedSSHAssessment(BaseConfigRuleAssessment):
119
+ """
120
+ CIS Control 12.2 - Establish and Maintain a Secure Network Architecture
121
+ AWS Config Rule: restricted-ssh
122
+
123
+ Ensures security groups do not allow unrestricted SSH access from 0.0.0.0/0.
124
+ """
125
+
126
+ def __init__(self):
127
+ super().__init__(
128
+ rule_name="restricted-ssh",
129
+ control_id="12.2",
130
+ resource_types=["AWS::EC2::SecurityGroup"]
131
+ )
132
+
133
+ def _get_resources(self, aws_factory: AWSClientFactory, resource_type: str, region: str) -> List[Dict[str, Any]]:
134
+ """Get all security groups in the region."""
135
+ if resource_type != "AWS::EC2::SecurityGroup":
136
+ return []
137
+
138
+ try:
139
+ ec2_client = aws_factory.get_client('ec2', region)
140
+
141
+ security_groups = []
142
+ paginator = ec2_client.get_paginator('describe_security_groups')
143
+
144
+ for page in paginator.paginate():
145
+ for sg in page.get('SecurityGroups', []):
146
+ group_id = sg.get('GroupId', '')
147
+ group_name = sg.get('GroupName', '')
148
+ vpc_id = sg.get('VpcId', '')
149
+
150
+ # Analyze ingress rules for SSH access
151
+ ingress_rules = sg.get('IpPermissions', [])
152
+ ssh_rules = []
153
+
154
+ for rule in ingress_rules:
155
+ from_port = rule.get('FromPort')
156
+ to_port = rule.get('ToPort')
157
+ ip_protocol = rule.get('IpProtocol', '')
158
+
159
+ # Check if rule allows SSH (port 22)
160
+ if (ip_protocol == 'tcp' and
161
+ from_port is not None and to_port is not None and
162
+ from_port <= 22 <= to_port):
163
+
164
+ # Check IP ranges for 0.0.0.0/0
165
+ for ip_range in rule.get('IpRanges', []):
166
+ cidr = ip_range.get('CidrIp', '')
167
+ if cidr == '0.0.0.0/0':
168
+ ssh_rules.append({
169
+ 'FromPort': from_port,
170
+ 'ToPort': to_port,
171
+ 'CidrIp': cidr,
172
+ 'Description': ip_range.get('Description', '')
173
+ })
174
+
175
+ # Check IPv6 ranges for ::/0
176
+ for ipv6_range in rule.get('Ipv6Ranges', []):
177
+ cidr_ipv6 = ipv6_range.get('CidrIpv6', '')
178
+ if cidr_ipv6 == '::/0':
179
+ ssh_rules.append({
180
+ 'FromPort': from_port,
181
+ 'ToPort': to_port,
182
+ 'CidrIpv6': cidr_ipv6,
183
+ 'Description': ipv6_range.get('Description', '')
184
+ })
185
+
186
+ security_groups.append({
187
+ 'GroupId': group_id,
188
+ 'GroupName': group_name,
189
+ 'VpcId': vpc_id,
190
+ 'SSHRules': ssh_rules,
191
+ 'HasUnrestrictedSSH': len(ssh_rules) > 0
192
+ })
193
+
194
+ logger.debug(f"Found {len(security_groups)} security groups in {region}")
195
+ return security_groups
196
+
197
+ except ClientError as e:
198
+ logger.error(f"Error retrieving security groups from {region}: {e}")
199
+ raise
200
+ except Exception as e:
201
+ logger.error(f"Unexpected error retrieving security groups from {region}: {e}")
202
+ raise
203
+
204
+ def _evaluate_resource_compliance(self, resource: Dict[str, Any], aws_factory: AWSClientFactory, region: str) -> ComplianceResult:
205
+ """Evaluate if security group restricts SSH access."""
206
+ group_id = resource.get('GroupId', 'unknown')
207
+ group_name = resource.get('GroupName', 'unknown')
208
+ has_unrestricted_ssh = resource.get('HasUnrestrictedSSH', False)
209
+ ssh_rules = resource.get('SSHRules', [])
210
+
211
+ if not has_unrestricted_ssh:
212
+ return ComplianceResult(
213
+ resource_id=group_id,
214
+ resource_type="AWS::EC2::SecurityGroup",
215
+ compliance_status=ComplianceStatus.COMPLIANT,
216
+ evaluation_reason=f"Security group {group_name} ({group_id}) does not allow unrestricted SSH access",
217
+ config_rule_name=self.rule_name,
218
+ region=region
219
+ )
220
+ else:
221
+ rule_details = []
222
+ for rule in ssh_rules:
223
+ if 'CidrIp' in rule:
224
+ rule_details.append(f"port {rule['FromPort']}-{rule['ToPort']} from {rule['CidrIp']}")
225
+ elif 'CidrIpv6' in rule:
226
+ rule_details.append(f"port {rule['FromPort']}-{rule['ToPort']} from {rule['CidrIpv6']}")
227
+
228
+ return ComplianceResult(
229
+ resource_id=group_id,
230
+ resource_type="AWS::EC2::SecurityGroup",
231
+ compliance_status=ComplianceStatus.NON_COMPLIANT,
232
+ evaluation_reason=f"Security group {group_name} ({group_id}) allows unrestricted SSH access: {', '.join(rule_details)}",
233
+ config_rule_name=self.rule_name,
234
+ region=region
235
+ )
@@ -0,0 +1,172 @@
1
+ """IG2 Enhanced Security Controls."""
2
+
3
+ from .control_3_10 import (
4
+ APIGatewaySSLEnabledAssessment,
5
+ ALBHTTPToHTTPSRedirectionAssessment,
6
+ ELBTLSHTTPSListenersOnlyAssessment,
7
+ S3BucketSSLRequestsOnlyAssessment,
8
+ RedshiftRequireTLSSSLAssessment
9
+ )
10
+ from .control_3_11 import (
11
+ EncryptedVolumesAssessment,
12
+ RDSStorageEncryptedAssessment,
13
+ S3DefaultEncryptionKMSAssessment,
14
+ DynamoDBTableEncryptedKMSAssessment,
15
+ BackupRecoveryPointEncryptedAssessment,
16
+ EFSEncryptedCheckAssessment,
17
+ SecretsManagerUsingKMSKeyAssessment,
18
+ SNSTopicEncryptedKMSAssessment,
19
+ SQSQueueEncryptedKMSAssessment,
20
+ CloudWatchLogsEncryptedAssessment,
21
+ KinesisStreamEncryptedAssessment,
22
+ ElasticSearchDomainEncryptedAssessment
23
+ )
24
+ from .control_5_2 import (
25
+ MFAEnabledForIAMConsoleAccessAssessment,
26
+ RootAccountMFAEnabledAssessment,
27
+ IAMUserUnusedCredentialsAssessment
28
+ )
29
+ from .control_encryption_transit import (
30
+ ELBACMCertificateRequiredAssessment,
31
+ ELBv2ACMCertificateRequiredAssessment,
32
+ OpenSearchHTTPSRequiredAssessment
33
+ )
34
+ from .control_encryption_rest import (
35
+ CloudTrailEncryptionEnabledAssessment,
36
+ EFSEncryptedCheckAssessment as EFSEncryptedCheckIG2Assessment,
37
+ EC2EBSEncryptionByDefaultAssessment,
38
+ RDSSnapshotEncryptedAssessment
39
+ )
40
+
41
+ from .control_advanced_encryption import (
42
+ SecretsManagerUsingCMKAssessment,
43
+ SNSEncryptedKMSAssessment,
44
+ SQSQueueEncryptedKMSAssessment,
45
+ KinesisStreamEncryptedAssessment,
46
+ ElasticsearchEncryptedAtRestAssessment
47
+ )
48
+
49
+ from .control_service_logging import (
50
+ ElasticsearchLogsToCloudWatchAssessment,
51
+ ELBLoggingEnabledAssessment,
52
+ RDSLoggingEnabledAssessment,
53
+ WAFv2LoggingEnabledAssessment,
54
+ CodeBuildProjectLoggingEnabledAssessment,
55
+ RedshiftClusterConfigurationCheckAssessment
56
+ )
57
+
58
+ # Import remaining encryption controls
59
+ from .control_remaining_encryption import (
60
+ OpenSearchEncryptedAtRestAssessment,
61
+ OpenSearchNodeToNodeEncryptionCheckAssessment,
62
+ RedshiftClusterKMSEnabledAssessment,
63
+ SageMakerEndpointConfigurationKMSKeyConfiguredAssessment,
64
+ SageMakerNotebookInstanceKMSKeyConfiguredAssessment,
65
+ CodeBuildProjectArtifactEncryptionAssessment
66
+ )
67
+
68
+ # Import network/HA controls
69
+ from .control_network_ha import (
70
+ ELBCrossZoneLoadBalancingEnabledAssessment,
71
+ ELBDeletionProtectionEnabledAssessment,
72
+ ELBv2MultipleAZAssessment,
73
+ RDSClusterMultiAZEnabledAssessment,
74
+ RDSInstanceDeletionProtectionEnabledAssessment,
75
+ RDSMultiAZSupportAssessment,
76
+ VPCVPNTwoTunnelsUpAssessment
77
+ )
78
+
79
+ # Import CodeBuild security controls
80
+ from .control_codebuild_security import (
81
+ CodeBuildProjectEnvironmentPrivilegedCheckAssessment,
82
+ CodeBuildProjectEnvVarAWSCredCheckAssessment,
83
+ CodeBuildProjectSourceRepoURLCheckAssessment
84
+ )
85
+
86
+ # Import remaining rules
87
+ from .control_remaining_rules import (
88
+ ACMCertificateExpirationCheckAssessment,
89
+ DynamoDBAutoScalingEnabledAssessment,
90
+ RedshiftEnhancedVPCRoutingEnabledAssessment,
91
+ RestrictedCommonPortsAssessment,
92
+ AuditLogPolicyExistsAssessment
93
+ )
94
+
95
+ __all__ = [
96
+ # Control 3.10 - Encrypt Sensitive Data in Transit
97
+ 'APIGatewaySSLEnabledAssessment',
98
+ 'ALBHTTPToHTTPSRedirectionAssessment',
99
+ 'ELBTLSHTTPSListenersOnlyAssessment',
100
+ 'S3BucketSSLRequestsOnlyAssessment',
101
+ 'RedshiftRequireTLSSSLAssessment',
102
+ 'ELBACMCertificateRequiredAssessment',
103
+ 'ELBv2ACMCertificateRequiredAssessment',
104
+ 'OpenSearchHTTPSRequiredAssessment',
105
+
106
+ # Control 3.11 - Encrypt Sensitive Data at Rest
107
+ 'EncryptedVolumesAssessment',
108
+ 'RDSStorageEncryptedAssessment',
109
+ 'S3DefaultEncryptionKMSAssessment',
110
+ 'DynamoDBTableEncryptedKMSAssessment',
111
+ 'BackupRecoveryPointEncryptedAssessment',
112
+ 'EFSEncryptedCheckAssessment',
113
+ 'SecretsManagerUsingKMSKeyAssessment',
114
+ 'SNSTopicEncryptedKMSAssessment',
115
+ 'SQSQueueEncryptedKMSAssessment',
116
+ 'CloudWatchLogsEncryptedAssessment',
117
+ 'KinesisStreamEncryptedAssessment',
118
+ 'ElasticSearchDomainEncryptedAssessment',
119
+ 'CloudTrailEncryptionEnabledAssessment',
120
+ 'EFSEncryptedCheckIG2Assessment',
121
+ 'EC2EBSEncryptionByDefaultAssessment',
122
+ 'RDSSnapshotEncryptedAssessment',
123
+
124
+ # Advanced Encryption Controls
125
+ 'SecretsManagerUsingCMKAssessment',
126
+ 'SNSEncryptedKMSAssessment',
127
+ 'SQSQueueEncryptedKMSAssessment',
128
+ 'KinesisStreamEncryptedAssessment',
129
+ 'ElasticsearchEncryptedAtRestAssessment',
130
+
131
+ # Service Logging Controls
132
+ 'ElasticsearchLogsToCloudWatchAssessment',
133
+ 'ELBLoggingEnabledAssessment',
134
+ 'RDSLoggingEnabledAssessment',
135
+ 'WAFv2LoggingEnabledAssessment',
136
+ 'CodeBuildProjectLoggingEnabledAssessment',
137
+ 'RedshiftClusterConfigurationCheckAssessment',
138
+
139
+ # Remaining Encryption Controls
140
+ 'OpenSearchEncryptedAtRestAssessment',
141
+ 'OpenSearchNodeToNodeEncryptionCheckAssessment',
142
+ 'RedshiftClusterKMSEnabledAssessment',
143
+ 'SageMakerEndpointConfigurationKMSKeyConfiguredAssessment',
144
+ 'SageMakerNotebookInstanceKMSKeyConfiguredAssessment',
145
+ 'CodeBuildProjectArtifactEncryptionAssessment',
146
+
147
+ # Network/HA Controls
148
+ 'ELBCrossZoneLoadBalancingEnabledAssessment',
149
+ 'ELBDeletionProtectionEnabledAssessment',
150
+ 'ELBv2MultipleAZAssessment',
151
+ 'RDSClusterMultiAZEnabledAssessment',
152
+ 'RDSInstanceDeletionProtectionEnabledAssessment',
153
+ 'RDSMultiAZSupportAssessment',
154
+ 'VPCVPNTwoTunnelsUpAssessment',
155
+
156
+ # CodeBuild Security Controls
157
+ 'CodeBuildProjectEnvironmentPrivilegedCheckAssessment',
158
+ 'CodeBuildProjectEnvVarAWSCredCheckAssessment',
159
+ 'CodeBuildProjectSourceRepoURLCheckAssessment',
160
+
161
+ # Remaining Rules
162
+ 'ACMCertificateExpirationCheckAssessment',
163
+ 'DynamoDBAutoScalingEnabledAssessment',
164
+ 'RedshiftEnhancedVPCRoutingEnabledAssessment',
165
+ 'RestrictedCommonPortsAssessment',
166
+ 'AuditLogPolicyExistsAssessment',
167
+
168
+ # Control 5.2 - Use Unique Passwords
169
+ 'MFAEnabledForIAMConsoleAccessAssessment',
170
+ 'RootAccountMFAEnabledAssessment',
171
+ 'IAMUserUnusedCredentialsAssessment'
172
+ ]