mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-07-23 12:31:54 +00:00
feat(aws): include resource metadata in services from d* to e* (#6532)
Co-authored-by: Sergio Garcia <hello@mistercloudsec.com>
This commit is contained in:
committed by
GitHub
parent
74a90aab98
commit
ee87f2676d
+1
-1
@@ -22,7 +22,7 @@ class datasync_task_logging_enabled(Check):
|
||||
"""
|
||||
findings = []
|
||||
for task in datasync_client.tasks.values():
|
||||
report = Check_Report_AWS(self.metadata(), task)
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=task)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"DataSync task {task.name} has logging enabled."
|
||||
|
||||
|
||||
+3
-1
@@ -18,7 +18,9 @@ class directconnect_connection_redundancy(Check):
|
||||
regions[conn.region]["Locations"].add(conn.location)
|
||||
|
||||
for region, connections in regions.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=connections
|
||||
)
|
||||
report.region = region
|
||||
report.resource_arn = directconnect_client._get_connection_arn_template(
|
||||
region
|
||||
|
||||
+1
-4
@@ -27,10 +27,7 @@ class directconnect_virtual_interface_redundancy(Check):
|
||||
findings.append(report)
|
||||
|
||||
for dxgw in directconnect_client.dxgws.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = dxgw.region
|
||||
report.resource_arn = dxgw.arn
|
||||
report.resource_id = dxgw.id
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=dxgw)
|
||||
if len(dxgw.vifs) < 2:
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
|
||||
+3
-5
@@ -8,11 +8,9 @@ class directoryservice_directory_log_forwarding_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for directory in directoryservice_client.directories.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = directory.region
|
||||
report.resource_id = directory.id
|
||||
report.resource_arn = directory.arn
|
||||
report.resource_tags = directory.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=directory
|
||||
)
|
||||
if directory.log_subscriptions:
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Directory Service {directory.id} have log forwarding to CloudWatch enabled."
|
||||
|
||||
+3
-5
@@ -8,11 +8,9 @@ class directoryservice_directory_monitor_notifications(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for directory in directoryservice_client.directories.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = directory.region
|
||||
report.resource_id = directory.id
|
||||
report.resource_arn = directory.arn
|
||||
report.resource_tags = directory.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=directory
|
||||
)
|
||||
if directory.event_topics:
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
|
||||
+3
-5
@@ -11,11 +11,9 @@ class directoryservice_directory_snapshots_limit(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for directory in directoryservice_client.directories.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = directory.region
|
||||
report.resource_id = directory.id
|
||||
report.resource_arn = directory.arn
|
||||
report.resource_tags = directory.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=directory
|
||||
)
|
||||
if directory.snapshots_limits:
|
||||
if directory.snapshots_limits.manual_snapshots_limit_reached:
|
||||
report.status = "FAIL"
|
||||
|
||||
+3
-4
@@ -14,11 +14,10 @@ class directoryservice_ldap_certificate_expiration(Check):
|
||||
findings = []
|
||||
for directory in directoryservice_client.directories.values():
|
||||
for certificate in directory.certificates:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = directory.region
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=directory
|
||||
)
|
||||
report.resource_id = certificate.id
|
||||
report.resource_arn = directory.arn
|
||||
report.resource_tags = directory.tags
|
||||
|
||||
remaining_days_to_expire = (
|
||||
certificate.expiry_date_time
|
||||
|
||||
+3
-5
@@ -12,11 +12,9 @@ class directoryservice_radius_server_security_protocol(Check):
|
||||
findings = []
|
||||
for directory in directoryservice_client.directories.values():
|
||||
if directory.radius_settings:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = directory.region
|
||||
report.resource_id = directory.id
|
||||
report.resource_arn = directory.arn
|
||||
report.resource_tags = directory.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=directory
|
||||
)
|
||||
if (
|
||||
directory.radius_settings.authentication_protocol
|
||||
== AuthenticationProtocol.MS_CHAPv2
|
||||
|
||||
+3
-5
@@ -12,11 +12,9 @@ class directoryservice_supported_mfa_radius_enabled(Check):
|
||||
findings = []
|
||||
for directory in directoryservice_client.directories.values():
|
||||
if directory.radius_settings:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = directory.region
|
||||
report.resource_id = directory.id
|
||||
report.resource_arn = directory.arn
|
||||
report.resource_tags = directory.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=directory
|
||||
)
|
||||
if directory.radius_settings.status == RadiusStatus.Completed:
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
|
||||
+4
-1
@@ -11,7 +11,10 @@ class dlm_ebs_snapshot_lifecycle_policy_exists(Check):
|
||||
region in ec2_client.regions_with_snapshots
|
||||
and ec2_client.regions_with_snapshots[region]
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(),
|
||||
resource_metadata=dlm_client.lifecycle_policies,
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = "No EBS Snapshot lifecycle policies found."
|
||||
report.region = region
|
||||
|
||||
+4
-6
@@ -24,13 +24,11 @@ class dms_endpoint_mongodb_authentication_enabled(Check):
|
||||
List[Check_Report_AWS]: A list of report objects with the results of the check.
|
||||
"""
|
||||
findings = []
|
||||
for endpoint_arn, endpoint in dms_client.endpoints.items():
|
||||
for endpoint in dms_client.endpoints.values():
|
||||
if endpoint.engine_name == "mongodb":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = endpoint.id
|
||||
report.resource_arn = endpoint_arn
|
||||
report.region = endpoint.region
|
||||
report.resource_tags = endpoint.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=endpoint
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"DMS Endpoint '{endpoint.id}' for MongoDB does not have an authentication mechanism enabled."
|
||||
if endpoint.mongodb_auth_type != "no":
|
||||
|
||||
+4
-6
@@ -23,13 +23,11 @@ class dms_endpoint_neptune_iam_authorization_enabled(Check):
|
||||
List[Check_Report_AWS]: A list of report objects with the results of the check.
|
||||
"""
|
||||
findings = []
|
||||
for endpoint_arn, endpoint in dms_client.endpoints.items():
|
||||
for endpoint in dms_client.endpoints.values():
|
||||
if endpoint.engine_name == "neptune":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = endpoint.id
|
||||
report.resource_arn = endpoint_arn
|
||||
report.region = endpoint.region
|
||||
report.resource_tags = endpoint.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=endpoint
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"DMS Endpoint {endpoint.id} for Neptune databases does not have IAM authorization enabled."
|
||||
if endpoint.neptune_iam_auth_enabled:
|
||||
|
||||
+4
-6
@@ -24,13 +24,11 @@ class dms_endpoint_redis_in_transit_encryption_enabled(Check):
|
||||
List[Check_Report_AWS]: A list of report objects with the results of the check.
|
||||
"""
|
||||
findings = []
|
||||
for endpoint_arn, endpoint in dms_client.endpoints.items():
|
||||
for endpoint in dms_client.endpoints.values():
|
||||
if endpoint.engine_name == "redis":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = endpoint.id
|
||||
report.resource_arn = endpoint_arn
|
||||
report.region = endpoint.region
|
||||
report.resource_tags = endpoint.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=endpoint
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"DMS Endpoint {endpoint.id} for Redis OSS is not encrypted in transit."
|
||||
if endpoint.redis_ssl_protocol == "ssl-encryption":
|
||||
|
||||
+4
-6
@@ -5,12 +5,10 @@ from prowler.providers.aws.services.dms.dms_client import dms_client
|
||||
class dms_endpoint_ssl_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for endpoint_arn, endpoint in dms_client.endpoints.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = endpoint.id
|
||||
report.resource_arn = endpoint_arn
|
||||
report.region = endpoint.region
|
||||
report.resource_tags = endpoint.tags
|
||||
for endpoint in dms_client.endpoints.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=endpoint
|
||||
)
|
||||
|
||||
if endpoint.ssl_mode == "none":
|
||||
report.status = "FAIL"
|
||||
|
||||
+3
-5
@@ -6,11 +6,9 @@ class dms_instance_minor_version_upgrade_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for instance in dms_client.instances:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = instance.region
|
||||
report.resource_id = instance.id
|
||||
report.resource_arn = instance.arn
|
||||
report.resource_tags = instance.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"DMS Replication Instance {instance.id} does not have auto minor version upgrade enabled."
|
||||
if instance.auto_minor_version_upgrade:
|
||||
|
||||
+3
-5
@@ -6,11 +6,9 @@ class dms_instance_multi_az_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for instance in dms_client.instances:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = instance.region
|
||||
report.resource_id = instance.id
|
||||
report.resource_arn = instance.arn
|
||||
report.resource_tags = instance.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"DMS Replication Instance {instance.id} does not have multi az enabled."
|
||||
if instance.multi_az:
|
||||
|
||||
+3
-5
@@ -8,11 +8,9 @@ class dms_instance_no_public_access(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for instance in dms_client.instances:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = instance.region
|
||||
report.resource_id = instance.id
|
||||
report.resource_arn = instance.arn
|
||||
report.resource_tags = instance.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"DMS Replication Instance {instance.id} is not publicly accessible."
|
||||
|
||||
+3
-4
@@ -36,11 +36,10 @@ class dms_replication_task_source_logging_enabled(Check):
|
||||
replication_task_arn,
|
||||
replication_task,
|
||||
) in dms_client.replication_tasks.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = replication_task.id
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=replication_task
|
||||
)
|
||||
report.resource_arn = replication_task_arn
|
||||
report.region = replication_task.region
|
||||
report.resource_tags = replication_task.tags
|
||||
|
||||
if not replication_task.logging_enabled:
|
||||
report.status = "FAIL"
|
||||
|
||||
+3
-4
@@ -36,11 +36,10 @@ class dms_replication_task_target_logging_enabled(Check):
|
||||
replication_task_arn,
|
||||
replication_task,
|
||||
) in dms_client.replication_tasks.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = replication_task.id
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=replication_task
|
||||
)
|
||||
report.resource_arn = replication_task_arn
|
||||
report.region = replication_task.region
|
||||
report.resource_tags = replication_task.tags
|
||||
|
||||
if not replication_task.logging_enabled:
|
||||
report.status = "FAIL"
|
||||
|
||||
+3
-5
@@ -8,11 +8,9 @@ class documentdb_cluster_backup_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for cluster in documentdb_client.db_clusters.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = cluster.region
|
||||
report.resource_id = cluster.id
|
||||
report.resource_arn = cluster.arn
|
||||
report.resource_tags = cluster.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"DocumentDB Cluster {cluster.id} does not have backup enabled."
|
||||
|
||||
+3
-5
@@ -8,11 +8,9 @@ class documentdb_cluster_cloudwatch_log_export(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for cluster in documentdb_client.db_clusters.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = cluster.region
|
||||
report.resource_id = cluster.id
|
||||
report.resource_arn = cluster.arn
|
||||
report.resource_tags = cluster.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"DocumentDB Cluster {cluster.id} does not have cloudwatch log export enabled."
|
||||
if cluster.cloudwatch_logs:
|
||||
|
||||
+3
-5
@@ -8,11 +8,9 @@ class documentdb_cluster_deletion_protection(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for cluster in documentdb_client.db_clusters.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = cluster.region
|
||||
report.resource_id = cluster.id
|
||||
report.resource_arn = cluster.arn
|
||||
report.resource_tags = cluster.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"DocumentDB Cluster {cluster.id} does not have deletion protection enabled."
|
||||
if cluster.deletion_protection:
|
||||
|
||||
+3
-5
@@ -8,11 +8,9 @@ class documentdb_cluster_multi_az_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for db_cluster in documentdb_client.db_clusters.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = db_cluster.region
|
||||
report.resource_id = db_cluster.id
|
||||
report.resource_arn = db_cluster.arn
|
||||
report.resource_tags = db_cluster.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=db_cluster
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"DocumentDB Cluster {db_cluster.id} does not have Multi-AZ enabled."
|
||||
|
||||
+3
-5
@@ -8,11 +8,9 @@ class documentdb_cluster_public_snapshot(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for db_snap in documentdb_client.db_cluster_snapshots:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = db_snap.region
|
||||
report.resource_id = db_snap.id
|
||||
report.resource_arn = db_snap.arn
|
||||
report.resource_tags = db_snap.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=db_snap
|
||||
)
|
||||
if db_snap.public:
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
|
||||
+3
-5
@@ -8,11 +8,9 @@ class documentdb_cluster_storage_encrypted(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for db_cluster in documentdb_client.db_clusters.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = db_cluster.region
|
||||
report.resource_id = db_cluster.id
|
||||
report.resource_arn = db_cluster.arn
|
||||
report.resource_tags = db_cluster.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=db_cluster
|
||||
)
|
||||
if db_cluster.encrypted:
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
|
||||
@@ -6,13 +6,12 @@ class drs_job_exist(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for drs in drs_client.drs_services:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.status = "FAIL"
|
||||
report.status_extended = "DRS is not enabled for this region."
|
||||
report.region = drs.region
|
||||
report.resource_tags = []
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=drs)
|
||||
report.resource_arn = drs_client._get_recovery_job_arn_template(drs.region)
|
||||
report.resource_id = drs_client.audited_account
|
||||
report.status = "FAIL"
|
||||
report.status_extended = "DRS is not enabled for this region."
|
||||
|
||||
if drs.status == "ENABLED":
|
||||
report.status_extended = "DRS is enabled for this region without jobs."
|
||||
if drs.jobs:
|
||||
|
||||
+3
-5
@@ -6,11 +6,9 @@ class dynamodb_accelerator_cluster_encryption_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for cluster in dax_client.clusters:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = cluster.name
|
||||
report.resource_arn = cluster.arn
|
||||
report.region = cluster.region
|
||||
report.resource_tags = cluster.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"DAX cluster {cluster.name} does not have encryption at rest enabled."
|
||||
|
||||
+3
-5
@@ -6,11 +6,9 @@ class dynamodb_accelerator_cluster_in_transit_encryption_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for cluster in dax_client.clusters:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = cluster.name
|
||||
report.resource_arn = cluster.arn
|
||||
report.region = cluster.region
|
||||
report.resource_tags = cluster.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"DAX cluster {cluster.name} does not have encryption in transit enabled."
|
||||
if cluster.tls_encryption:
|
||||
|
||||
+3
-5
@@ -6,11 +6,9 @@ class dynamodb_accelerator_cluster_multi_az(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for cluster in dax_client.clusters:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = cluster.name
|
||||
report.resource_arn = cluster.arn
|
||||
report.region = cluster.region
|
||||
report.resource_tags = cluster.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"DAX cluster {cluster.name} does not have nodes in multiple availability zones."
|
||||
if len(cluster.node_azs) > 1:
|
||||
|
||||
@@ -30,6 +30,7 @@ class DynamoDB(AWSService):
|
||||
is_resource_filtered(arn, self.audit_resources)
|
||||
):
|
||||
self.tables[arn] = Table(
|
||||
arn=arn,
|
||||
name=table,
|
||||
encryption_type=None,
|
||||
kms_arn=None,
|
||||
@@ -221,6 +222,7 @@ class DAX(AWSService):
|
||||
|
||||
|
||||
class Table(BaseModel):
|
||||
arn: str
|
||||
name: str
|
||||
billing_mode: str = "PROVISIONED"
|
||||
encryption_type: Optional[str]
|
||||
|
||||
+2
-6
@@ -22,12 +22,8 @@ class dynamodb_table_autoscaling_enabled(Check):
|
||||
autoscaling_mapping[table_name] = {}
|
||||
autoscaling_mapping[table_name][target.scalable_dimension] = target
|
||||
|
||||
for table_arn, table in dynamodb_client.tables.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = table.region
|
||||
report.resource_id = table.name
|
||||
report.resource_arn = table_arn
|
||||
report.resource_tags = table.tags
|
||||
for table in dynamodb_client.tables.values():
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=table)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"DynamoDB table {table.name} automatically scales capacity on demand."
|
||||
|
||||
+2
-6
@@ -6,12 +6,8 @@ from prowler.providers.aws.services.iam.lib.policy import is_policy_public
|
||||
class dynamodb_table_cross_account_access(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for table_arn, table in dynamodb_client.tables.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = table.name
|
||||
report.resource_arn = table_arn
|
||||
report.resource_tags = table.tags
|
||||
report.region = table.region
|
||||
for table in dynamodb_client.tables.values():
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=table)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"DynamoDB table {table.name} does not have a resource-based policy."
|
||||
|
||||
+2
-6
@@ -5,12 +5,8 @@ from prowler.providers.aws.services.dynamodb.dynamodb_client import dynamodb_cli
|
||||
class dynamodb_table_deletion_protection_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for table_arn, table in dynamodb_client.tables.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = table.region
|
||||
report.resource_id = table.name
|
||||
report.resource_arn = table_arn
|
||||
report.resource_tags = table.tags
|
||||
for table in dynamodb_client.tables.values():
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=table)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"DynamoDB table {table.name} does not have deletion protection enabled."
|
||||
|
||||
|
||||
+3
-7
@@ -6,19 +6,15 @@ from prowler.providers.aws.services.dynamodb.dynamodb_client import dynamodb_cli
|
||||
class dynamodb_table_protected_by_backup_plan(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for table_arn, table in dynamodb_client.tables.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = table.name
|
||||
report.resource_arn = table_arn
|
||||
report.resource_tags = table.tags
|
||||
report.region = table.region
|
||||
for table in dynamodb_client.tables.values():
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=table)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"DynamoDB table {table.name} is not protected by a backup plan."
|
||||
)
|
||||
|
||||
if (
|
||||
table_arn in backup_client.protected_resources
|
||||
table.arn in backup_client.protected_resources
|
||||
or f"arn:{dynamodb_client.audited_partition}:dynamodb:*:*:table/*"
|
||||
in backup_client.protected_resources
|
||||
or "*" in backup_client.protected_resources
|
||||
|
||||
+2
-6
@@ -5,12 +5,8 @@ from prowler.providers.aws.services.dynamodb.dynamodb_client import dynamodb_cli
|
||||
class dynamodb_tables_kms_cmk_encryption_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for table_arn, table in dynamodb_client.tables.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = table.name
|
||||
report.resource_arn = table_arn
|
||||
report.resource_tags = table.tags
|
||||
report.region = table.region
|
||||
for table in dynamodb_client.tables.values():
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=table)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"DynamoDB table {table.name} is using DEFAULT encryption."
|
||||
|
||||
+2
-6
@@ -5,12 +5,8 @@ from prowler.providers.aws.services.dynamodb.dynamodb_client import dynamodb_cli
|
||||
class dynamodb_tables_pitr_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for table_arn, table in dynamodb_client.tables.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = table.name
|
||||
report.resource_arn = table_arn
|
||||
report.resource_tags = table.tags
|
||||
report.region = table.region
|
||||
for table in dynamodb_client.tables.values():
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=table)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"DynamoDB table {table.name} does not have point-in-time recovery enabled."
|
||||
if table.pitr:
|
||||
|
||||
@@ -6,7 +6,7 @@ class ec2_ami_public(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for image in ec2_client.images:
|
||||
report = Check_Report_AWS(self.metadata(), image)
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=image)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"EC2 AMI {image.name if image.name else image.id} is not public."
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class ec2_client_vpn_endpoint_connection_logging_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for vpn_arn, vpn_endpoint in ec2_client.vpn_endpoints.items():
|
||||
report = Check_Report_AWS(self.metadata(), vpn_endpoint)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=vpn_endpoint
|
||||
)
|
||||
|
||||
if vpn_endpoint.connection_logging:
|
||||
report.status = "PASS"
|
||||
|
||||
+3
-1
@@ -7,7 +7,9 @@ class ec2_ebs_default_encryption(Check):
|
||||
findings = []
|
||||
for ebs_encryption in ec2_client.ebs_encryption_by_default:
|
||||
if ebs_encryption.volumes or ec2_client.provider.scan_unused_services:
|
||||
report = Check_Report_AWS(self.metadata(), ebs_encryption)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=ebs_encryption
|
||||
)
|
||||
report.resource_arn = ec2_client._get_volume_arn_template(
|
||||
ebs_encryption.region
|
||||
)
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class ec2_ebs_public_snapshot(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for snapshot in ec2_client.snapshots:
|
||||
report = Check_Report_AWS(self.metadata(), snapshot)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=snapshot
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"EBS Snapshot {snapshot.id} is not Public."
|
||||
if snapshot.public:
|
||||
|
||||
+4
-1
@@ -12,7 +12,10 @@ class ec2_ebs_snapshot_account_block_public_access(Check):
|
||||
ebs_snapshot_block_status.snapshots
|
||||
or ec2_client.provider.scan_unused_services
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), ebs_snapshot_block_status)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(),
|
||||
resource_metadata=ebs_snapshot_block_status,
|
||||
)
|
||||
report.resource_arn = ec2_client.account_arn_template
|
||||
report.resource_id = ec2_client.audited_account
|
||||
if ebs_snapshot_block_status.status == "block-all-sharing":
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class ec2_ebs_snapshots_encrypted(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for snapshot in ec2_client.snapshots:
|
||||
report = Check_Report_AWS(self.metadata(), snapshot)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=snapshot
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"EBS Snapshot {snapshot.id} is encrypted."
|
||||
if not snapshot.encrypted:
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class ec2_ebs_volume_encryption(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for volume in ec2_client.volumes:
|
||||
report = Check_Report_AWS(self.metadata(), volume)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=volume
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"EBS Snapshot {volume.id} is encrypted."
|
||||
if not volume.encrypted:
|
||||
|
||||
+3
-1
@@ -7,7 +7,9 @@ class ec2_ebs_volume_protected_by_backup_plan(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for volume in ec2_client.volumes:
|
||||
report = Check_Report_AWS(self.metadata(), volume)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=volume
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"EBS Volume {volume.id} is not protected by a backup plan."
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class ec2_ebs_volume_snapshots_exists(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for volume in ec2_client.volumes:
|
||||
report = Check_Report_AWS(self.metadata(), volume)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=volume
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"Snapshots not found for the EBS volume {volume.id}."
|
||||
|
||||
@@ -12,7 +12,9 @@ class ec2_elastic_ip_shodan(Check):
|
||||
if shodan_api_key:
|
||||
api = shodan.Shodan(shodan_api_key)
|
||||
for eip in ec2_client.elastic_ips:
|
||||
report = Check_Report_AWS(self.metadata(), eip)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=eip
|
||||
)
|
||||
if eip.public_ip:
|
||||
try:
|
||||
shodan_info = api.host(eip.public_ip)
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ class ec2_elastic_ip_unassigned(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for eip in ec2_client.elastic_ips:
|
||||
report = Check_Report_AWS(self.metadata(), eip)
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=eip)
|
||||
if eip.public_ip:
|
||||
report.resource_id = eip.public_ip
|
||||
report.status = "FAIL"
|
||||
|
||||
+4
-1
@@ -10,7 +10,10 @@ class ec2_instance_account_imdsv2_enabled(Check):
|
||||
instance_metadata_default.instances
|
||||
or ec2_client.provider.scan_unused_services
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), instance_metadata_default)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(),
|
||||
resource_metadata=instance_metadata_default,
|
||||
)
|
||||
report.resource_arn = ec2_client.account_arn_template
|
||||
report.resource_id = ec2_client.audited_account
|
||||
if instance_metadata_default.http_tokens == "required":
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class ec2_instance_detailed_monitoring_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.resource_id = instance.id
|
||||
report.resource_arn = instance.arn
|
||||
report.resource_tags = instance.tags
|
||||
|
||||
+3
-1
@@ -7,7 +7,9 @@ class ec2_instance_imdsv2_enabled(Check):
|
||||
findings = []
|
||||
for instance in ec2_client.instances:
|
||||
if instance.state != "terminated":
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"EC2 Instance {instance.id} has IMDSv2 disabled or not required."
|
||||
|
||||
+3
-1
@@ -7,7 +7,9 @@ class ec2_instance_internet_facing_with_instance_profile(Check):
|
||||
findings = []
|
||||
for instance in ec2_client.instances:
|
||||
if instance.state != "terminated":
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"EC2 Instance {instance.id} is not internet facing with an instance profile."
|
||||
if instance.public_ip and instance.instance_profile:
|
||||
|
||||
+3
-1
@@ -7,7 +7,9 @@ class ec2_instance_managed_by_ssm(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.resource_arn = instance.arn
|
||||
report.resource_tags = instance.tags
|
||||
report.status = "PASS"
|
||||
|
||||
+3
-1
@@ -13,7 +13,9 @@ class ec2_instance_older_than_specific_days(Check):
|
||||
"max_ec2_instance_age_in_days", 180
|
||||
)
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.resource_id = instance.id
|
||||
report.resource_arn = instance.arn
|
||||
report.resource_tags = instance.tags
|
||||
|
||||
+3
-1
@@ -7,7 +7,9 @@ class ec2_instance_paravirtual_type(Check):
|
||||
findings = []
|
||||
for instance in ec2_client.instances:
|
||||
if instance.state != "terminated":
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"EC2 Instance {instance.id} virtualization type is set to HVM."
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_cassandra_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [7000, 7001, 7199, 9042, 9160]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have Cassandra ports open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_cifs_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [139, 445]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"Instance {instance.id} does not have CIFS ports open to the Internet."
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_elasticsearch_kibana_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [9200, 9300, 5601]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have Elasticsearch/Kibana ports open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_ftp_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [20, 21]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"Instance {instance.id} does not have FTP ports open to the Internet."
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_kafka_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [9092]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have Kafka port 9092 open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_kerberos_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [88, 464, 749, 750]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have Kerberos ports open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_ldap_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [389, 636]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"Instance {instance.id} does not have LDAP ports open to the Internet."
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_memcached_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [11211]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have Memcached port 11211 open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_mongodb_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [27017, 27018]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have MongoDB ports open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_mysql_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [3306]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have MySQL port 3306 open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_oracle_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [1521, 2483, 2484]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have Oracle ports open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_postgresql_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [5432]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have PostgreSQL port 5432 open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_rdp_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [3389]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have RDP port 3389 open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_redis_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [6379]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have Redis port 6379 open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_sqlserver_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [1433, 1434]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have SQL Server ports open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_ssh_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [22]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have SSH port 22 open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -11,7 +11,9 @@ class ec2_instance_port_telnet_exposed_to_internet(Check):
|
||||
findings = []
|
||||
check_ports = [23]
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Instance {instance.id} does not have Telnet port 23 open to the Internet."
|
||||
is_open_port = False
|
||||
|
||||
+3
-1
@@ -7,7 +7,9 @@ class ec2_instance_profile_attached(Check):
|
||||
findings = []
|
||||
for instance in ec2_client.instances:
|
||||
if instance.state != "terminated":
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"EC2 Instance {instance.id} not associated with an Instance Profile Role."
|
||||
if instance.instance_profile:
|
||||
|
||||
@@ -7,7 +7,9 @@ class ec2_instance_public_ip(Check):
|
||||
findings = []
|
||||
for instance in ec2_client.instances:
|
||||
if instance.state != "terminated":
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"EC2 Instance {instance.id} does not have a Public IP."
|
||||
|
||||
+3
-1
@@ -16,7 +16,9 @@ class ec2_instance_secrets_user_data(Check):
|
||||
)
|
||||
for instance in ec2_client.instances:
|
||||
if instance.state != "terminated":
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
if instance.user_data:
|
||||
user_data = b64decode(instance.user_data)
|
||||
try:
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class ec2_instance_uses_single_eni(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for instance in ec2_client.instances:
|
||||
report = Check_Report_AWS(self.metadata(), instance)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
eni_types = {"efa": [], "interface": [], "trunk": []}
|
||||
if not instance.network_interfaces:
|
||||
report.status = "PASS"
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class ec2_launch_template_imdsv2_required(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for template in ec2_client.launch_templates:
|
||||
report = Check_Report_AWS(self.metadata(), template)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=template
|
||||
)
|
||||
|
||||
versions_with_imdsv2_required = []
|
||||
versions_with_metadata_disabled = []
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class ec2_launch_template_no_public_ip(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for template in ec2_client.launch_templates:
|
||||
report = Check_Report_AWS(self.metadata(), template)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=template
|
||||
)
|
||||
|
||||
versions_with_autoassign_public_ip = []
|
||||
versions_with_network_interfaces_public_ip = []
|
||||
|
||||
+3
-1
@@ -15,7 +15,9 @@ class ec2_launch_template_no_secrets(Check):
|
||||
"secrets_ignore_patterns", []
|
||||
)
|
||||
for template in ec2_client.launch_templates:
|
||||
report = Check_Report_AWS(self.metadata(), template)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=template
|
||||
)
|
||||
|
||||
versions_with_secrets = []
|
||||
|
||||
|
||||
+3
-1
@@ -13,7 +13,9 @@ class ec2_networkacl_allow_ingress_any_port(Check):
|
||||
ec2_client.provider.scan_unused_services
|
||||
or network_acl.region in ec2_client.regions_with_sgs
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), network_acl)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=network_acl
|
||||
)
|
||||
# If some entry allows it, that ACL is not securely configured
|
||||
if check_network_acl(network_acl.entries, tcp_protocol, check_port):
|
||||
report.status = "FAIL"
|
||||
|
||||
+3
-1
@@ -13,7 +13,9 @@ class ec2_networkacl_allow_ingress_tcp_port_22(Check):
|
||||
ec2_client.provider.scan_unused_services
|
||||
or network_acl.region in ec2_client.regions_with_sgs
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), network_acl)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=network_acl
|
||||
)
|
||||
# If some entry allows it, that ACL is not securely configured
|
||||
if check_network_acl(network_acl.entries, tcp_protocol, check_port):
|
||||
report.status = "FAIL"
|
||||
|
||||
+3
-1
@@ -13,7 +13,9 @@ class ec2_networkacl_allow_ingress_tcp_port_3389(Check):
|
||||
ec2_client.provider.scan_unused_services
|
||||
or network_acl.region in ec2_client.regions_with_sgs
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), network_acl)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=network_acl
|
||||
)
|
||||
# If some entry allows it, that ACL is not securely configured
|
||||
if check_network_acl(network_acl.entries, tcp_protocol, check_port):
|
||||
report.status = "FAIL"
|
||||
|
||||
@@ -7,7 +7,9 @@ class ec2_networkacl_unused(Check):
|
||||
findings = []
|
||||
for arn, network_acl in ec2_client.network_acls.items():
|
||||
if not network_acl.default:
|
||||
report = Check_Report_AWS(self.metadata(), network_acl)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=network_acl
|
||||
)
|
||||
|
||||
if not network_acl.in_use:
|
||||
report.status = "FAIL"
|
||||
|
||||
+3
-1
@@ -14,7 +14,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_all_ports(Check):
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have all ports open to the Internet."
|
||||
|
||||
+3
-1
@@ -23,7 +23,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_any_port(Check):
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have any port open to the Internet."
|
||||
|
||||
+3
-1
@@ -17,7 +17,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_high_risk_tcp_ports(Check
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have any high-risk port open to the Internet."
|
||||
|
||||
+3
-1
@@ -18,7 +18,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_port_mongodb_27017_27018(
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have MongoDB ports 27017 and 27018 open to the Internet."
|
||||
|
||||
+3
-1
@@ -18,7 +18,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_ftp_port_20_21(Check)
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have FTP ports 20 and 21 open to the Internet."
|
||||
|
||||
+3
-1
@@ -18,7 +18,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22(Check):
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have SSH port 22 open to the Internet."
|
||||
|
||||
+3
-1
@@ -18,7 +18,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_3389(Check):
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have Microsoft RDP port 3389 open to the Internet."
|
||||
|
||||
+3
-1
@@ -20,7 +20,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_cassandra_7199_9
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have Casandra ports 7199, 8888 and 9160 open to the Internet."
|
||||
|
||||
+3
-1
@@ -20,7 +20,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_elasticsearch_ki
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have Elasticsearch/Kibana ports 9200, 9300 and 5601 open to the Internet."
|
||||
|
||||
+3
-1
@@ -18,7 +18,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_kafka_9092(Check
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have Kafka port 9092 open to the Internet."
|
||||
|
||||
+3
-1
@@ -18,7 +18,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_memcached_11211(
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have Memcached port 11211 open to the Internet."
|
||||
|
||||
+3
-1
@@ -18,7 +18,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_mysql_3306(Check
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have MySQL port 3306 open to the Internet."
|
||||
|
||||
+3
-1
@@ -18,7 +18,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_oracle_1521_2483
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have Oracle ports 1521 and 2483 open to the Internet."
|
||||
|
||||
+3
-1
@@ -18,7 +18,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_postgres_5432(Ch
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have Postgres port 5432 open to the Internet."
|
||||
|
||||
+3
-1
@@ -18,7 +18,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_redis_6379(Check
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have Redis port 6379 open to the Internet."
|
||||
|
||||
+3
-1
@@ -20,7 +20,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_sql_server_1433_
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have Microsoft SQL Server ports 1433 and 1434 open to the Internet."
|
||||
|
||||
+3
-1
@@ -18,7 +18,9 @@ class ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_telnet_23(Check)
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) does not have Telnet port 23 open to the Internet."
|
||||
|
||||
+3
-1
@@ -16,7 +16,9 @@ class ec2_securitygroup_allow_wide_open_public_ipv4(Check):
|
||||
and vpc_client.vpcs[security_group.vpc_id].in_use
|
||||
and len(security_group.network_interfaces) > 0
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata(), security_group)
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=security_group
|
||||
)
|
||||
report.resource_details = security_group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Security group {security_group.name} ({security_group.id}) has no potential wide-open non-RFC1918 address."
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user