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.
- aws_cis_assessment/__init__.py +11 -0
- aws_cis_assessment/cli/__init__.py +3 -0
- aws_cis_assessment/cli/examples.py +274 -0
- aws_cis_assessment/cli/main.py +1259 -0
- aws_cis_assessment/cli/utils.py +356 -0
- aws_cis_assessment/config/__init__.py +1 -0
- aws_cis_assessment/config/config_loader.py +328 -0
- aws_cis_assessment/config/rules/cis_controls_ig1.yaml +590 -0
- aws_cis_assessment/config/rules/cis_controls_ig2.yaml +412 -0
- aws_cis_assessment/config/rules/cis_controls_ig3.yaml +100 -0
- aws_cis_assessment/controls/__init__.py +1 -0
- aws_cis_assessment/controls/base_control.py +400 -0
- aws_cis_assessment/controls/ig1/__init__.py +239 -0
- aws_cis_assessment/controls/ig1/control_1_1.py +586 -0
- aws_cis_assessment/controls/ig1/control_2_2.py +231 -0
- aws_cis_assessment/controls/ig1/control_3_3.py +718 -0
- aws_cis_assessment/controls/ig1/control_3_4.py +235 -0
- aws_cis_assessment/controls/ig1/control_4_1.py +461 -0
- aws_cis_assessment/controls/ig1/control_access_keys.py +310 -0
- aws_cis_assessment/controls/ig1/control_advanced_security.py +512 -0
- aws_cis_assessment/controls/ig1/control_backup_recovery.py +510 -0
- aws_cis_assessment/controls/ig1/control_cloudtrail_logging.py +197 -0
- aws_cis_assessment/controls/ig1/control_critical_security.py +422 -0
- aws_cis_assessment/controls/ig1/control_data_protection.py +898 -0
- aws_cis_assessment/controls/ig1/control_iam_advanced.py +573 -0
- aws_cis_assessment/controls/ig1/control_iam_governance.py +493 -0
- aws_cis_assessment/controls/ig1/control_iam_policies.py +383 -0
- aws_cis_assessment/controls/ig1/control_instance_optimization.py +100 -0
- aws_cis_assessment/controls/ig1/control_network_enhancements.py +203 -0
- aws_cis_assessment/controls/ig1/control_network_security.py +672 -0
- aws_cis_assessment/controls/ig1/control_s3_enhancements.py +173 -0
- aws_cis_assessment/controls/ig1/control_s3_security.py +422 -0
- aws_cis_assessment/controls/ig1/control_vpc_security.py +235 -0
- aws_cis_assessment/controls/ig2/__init__.py +172 -0
- aws_cis_assessment/controls/ig2/control_3_10.py +698 -0
- aws_cis_assessment/controls/ig2/control_3_11.py +1330 -0
- aws_cis_assessment/controls/ig2/control_5_2.py +393 -0
- aws_cis_assessment/controls/ig2/control_advanced_encryption.py +355 -0
- aws_cis_assessment/controls/ig2/control_codebuild_security.py +263 -0
- aws_cis_assessment/controls/ig2/control_encryption_rest.py +382 -0
- aws_cis_assessment/controls/ig2/control_encryption_transit.py +382 -0
- aws_cis_assessment/controls/ig2/control_network_ha.py +467 -0
- aws_cis_assessment/controls/ig2/control_remaining_encryption.py +426 -0
- aws_cis_assessment/controls/ig2/control_remaining_rules.py +363 -0
- aws_cis_assessment/controls/ig2/control_service_logging.py +402 -0
- aws_cis_assessment/controls/ig3/__init__.py +49 -0
- aws_cis_assessment/controls/ig3/control_12_8.py +395 -0
- aws_cis_assessment/controls/ig3/control_13_1.py +467 -0
- aws_cis_assessment/controls/ig3/control_3_14.py +523 -0
- aws_cis_assessment/controls/ig3/control_7_1.py +359 -0
- aws_cis_assessment/core/__init__.py +1 -0
- aws_cis_assessment/core/accuracy_validator.py +425 -0
- aws_cis_assessment/core/assessment_engine.py +1266 -0
- aws_cis_assessment/core/audit_trail.py +491 -0
- aws_cis_assessment/core/aws_client_factory.py +313 -0
- aws_cis_assessment/core/error_handler.py +607 -0
- aws_cis_assessment/core/models.py +166 -0
- aws_cis_assessment/core/scoring_engine.py +459 -0
- aws_cis_assessment/reporters/__init__.py +8 -0
- aws_cis_assessment/reporters/base_reporter.py +454 -0
- aws_cis_assessment/reporters/csv_reporter.py +835 -0
- aws_cis_assessment/reporters/html_reporter.py +2162 -0
- aws_cis_assessment/reporters/json_reporter.py +561 -0
- aws_cis_controls_assessment-1.0.3.dist-info/METADATA +248 -0
- aws_cis_controls_assessment-1.0.3.dist-info/RECORD +77 -0
- aws_cis_controls_assessment-1.0.3.dist-info/WHEEL +5 -0
- aws_cis_controls_assessment-1.0.3.dist-info/entry_points.txt +2 -0
- aws_cis_controls_assessment-1.0.3.dist-info/licenses/LICENSE +21 -0
- aws_cis_controls_assessment-1.0.3.dist-info/top_level.txt +2 -0
- docs/README.md +94 -0
- docs/assessment-logic.md +766 -0
- docs/cli-reference.md +698 -0
- docs/config-rule-mappings.md +393 -0
- docs/developer-guide.md +858 -0
- docs/installation.md +299 -0
- docs/troubleshooting.md +634 -0
- 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
|
+
]
|