mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-07-23 20:42:02 +00:00
chore(aws): add resource metadata to services from f to o (#6545)
This commit is contained in:
committed by
GitHub
parent
9e7104fb7f
commit
ec5f2b3753
+3
-5
@@ -21,11 +21,9 @@ class firehose_stream_encrypted_at_rest(Check):
|
||||
"""
|
||||
findings = []
|
||||
for stream in firehose_client.delivery_streams.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = stream.region
|
||||
report.resource_id = stream.name
|
||||
report.resource_arn = stream.arn
|
||||
report.resource_tags = stream.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=stream
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"Firehose Stream {stream.name} does have at rest encryption enabled."
|
||||
|
||||
@@ -6,10 +6,12 @@ class fms_policy_compliant(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
if fms_client.fms_admin_account:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=fms_client.fms_policies
|
||||
)
|
||||
report.region = fms_client.region
|
||||
report.resource_arn = fms_client.policy_arn_template
|
||||
report.resource_id = fms_client.audited_account
|
||||
report.region = fms_client.region
|
||||
report.status = "PASS"
|
||||
report.status_extended = "FMS enabled with all compliant accounts."
|
||||
non_compliant_policy = False
|
||||
@@ -20,10 +22,12 @@ class fms_policy_compliant(Check):
|
||||
policy_to_account.status == "NON_COMPLIANT"
|
||||
or not policy_to_account.status
|
||||
):
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=policy
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"FMS with non-compliant policy {policy.name} for account {policy_to_account.account_id}."
|
||||
report.resource_id = policy.id
|
||||
report.resource_arn = policy.arn
|
||||
report.region = fms_client.region
|
||||
non_compliant_policy = True
|
||||
break
|
||||
if non_compliant_policy:
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class fsx_file_system_copy_tags_to_backups_enabled(Check):
|
||||
findings = []
|
||||
for file_system in fsx_client.file_systems.values():
|
||||
if file_system.copy_tags_to_backups is not None:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = file_system.region
|
||||
report.resource_id = file_system.id
|
||||
report.resource_arn = file_system.arn
|
||||
report.resource_tags = file_system.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=file_system
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"FSx file system {file_system.id} has copy tags to backups enabled."
|
||||
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class fsx_file_system_copy_tags_to_volumes_enabled(Check):
|
||||
findings = []
|
||||
for file_system in fsx_client.file_systems.values():
|
||||
if file_system.copy_tags_to_volumes is not None:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = file_system.region
|
||||
report.resource_id = file_system.id
|
||||
report.resource_arn = file_system.arn
|
||||
report.resource_tags = file_system.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=file_system
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"FSx file system {file_system.id} has copy tags to volumes enabled."
|
||||
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class fsx_windows_file_system_multi_az_enabled(Check):
|
||||
findings = []
|
||||
for file_system in fsx_client.file_systems.values():
|
||||
if file_system.type == "WINDOWS":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = file_system.region
|
||||
report.resource_id = file_system.id
|
||||
report.resource_arn = file_system.arn
|
||||
report.resource_tags = file_system.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=file_system
|
||||
)
|
||||
if len(file_system.subnet_ids) > 1:
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"FSx Windows file system {file_system.id} is configured for Multi-AZ deployment."
|
||||
|
||||
+1
-5
@@ -6,11 +6,7 @@ class glacier_vaults_policy_public_access(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for vault in glacier_client.vaults.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = vault.region
|
||||
report.resource_id = vault.name
|
||||
report.resource_arn = vault.arn
|
||||
report.resource_tags = vault.tags
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=vault)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Vault {vault.name} has policy which does not allow access to everyone."
|
||||
|
||||
|
||||
+3
-2
@@ -8,12 +8,13 @@ class glue_data_catalogs_connection_passwords_encryption_enabled(Check):
|
||||
for data_catalog in glue_client.data_catalogs.values():
|
||||
# Check only if there are Glue Tables
|
||||
if data_catalog.tables or glue_client.provider.scan_unused_services:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=data_catalog
|
||||
)
|
||||
report.resource_id = glue_client.audited_account
|
||||
report.resource_arn = glue_client._get_data_catalog_arn_template(
|
||||
data_catalog.region
|
||||
)
|
||||
report.region = data_catalog.region
|
||||
report.status = "FAIL"
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
|
||||
+3
-2
@@ -8,12 +8,13 @@ class glue_data_catalogs_metadata_encryption_enabled(Check):
|
||||
for data_catalog in glue_client.data_catalogs.values():
|
||||
# Check only if there are Glue Tables
|
||||
if data_catalog.tables or glue_client.provider.scan_unused_services:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=data_catalog
|
||||
)
|
||||
report.resource_id = glue_client.audited_account
|
||||
report.resource_arn = glue_client._get_data_catalog_arn_template(
|
||||
data_catalog.region
|
||||
)
|
||||
report.region = data_catalog.region
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
"Glue data catalog settings have metadata encryption disabled."
|
||||
|
||||
+3
-2
@@ -7,8 +7,9 @@ class glue_data_catalogs_not_publicly_accessible(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for data_catalog in glue_client.data_catalogs.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = data_catalog.region
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=data_catalog
|
||||
)
|
||||
report.resource_id = glue_client.audited_account
|
||||
report.resource_arn = glue_client._get_data_catalog_arn_template(
|
||||
data_catalog.region
|
||||
|
||||
+1
-5
@@ -6,11 +6,7 @@ class glue_database_connections_ssl_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for conn in glue_client.connections:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = conn.name
|
||||
report.resource_arn = conn.arn
|
||||
report.region = conn.region
|
||||
report.resource_tags = conn.tags
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=conn)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"Glue connection {conn.name} has SSL connection disabled."
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class glue_development_endpoints_cloudwatch_logs_encryption_enabled(Check):
|
||||
findings = []
|
||||
for endpoint in glue_client.dev_endpoints:
|
||||
no_sec_configs = True
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = endpoint.name
|
||||
report.resource_arn = endpoint.arn
|
||||
report.region = endpoint.region
|
||||
report.resource_tags = endpoint.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=endpoint
|
||||
)
|
||||
for sec_config in glue_client.security_configs:
|
||||
if sec_config.name == endpoint.security:
|
||||
no_sec_configs = False
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class glue_development_endpoints_job_bookmark_encryption_enabled(Check):
|
||||
findings = []
|
||||
for endpoint in glue_client.dev_endpoints:
|
||||
no_sec_configs = True
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = endpoint.name
|
||||
report.resource_arn = endpoint.arn
|
||||
report.region = endpoint.region
|
||||
report.resource_tags = endpoint.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=endpoint
|
||||
)
|
||||
for sec_config in glue_client.security_configs:
|
||||
if sec_config.name == endpoint.security:
|
||||
no_sec_configs = False
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class glue_development_endpoints_s3_encryption_enabled(Check):
|
||||
findings = []
|
||||
for endpoint in glue_client.dev_endpoints:
|
||||
no_sec_configs = True
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = endpoint.name
|
||||
report.resource_arn = endpoint.arn
|
||||
report.region = endpoint.region
|
||||
report.resource_tags = endpoint.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=endpoint
|
||||
)
|
||||
for sec_config in glue_client.security_configs:
|
||||
if sec_config.name == endpoint.security:
|
||||
no_sec_configs = False
|
||||
|
||||
+1
-5
@@ -7,11 +7,7 @@ class glue_etl_jobs_amazon_s3_encryption_enabled(Check):
|
||||
findings = []
|
||||
for job in glue_client.jobs:
|
||||
no_sec_configs = True
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = job.name
|
||||
report.resource_arn = job.arn
|
||||
report.region = job.region
|
||||
report.resource_tags = job.tags
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=job)
|
||||
for sec_config in glue_client.security_configs:
|
||||
if sec_config.name == job.security:
|
||||
no_sec_configs = False
|
||||
|
||||
+1
-5
@@ -7,11 +7,7 @@ class glue_etl_jobs_cloudwatch_logs_encryption_enabled(Check):
|
||||
findings = []
|
||||
for job in glue_client.jobs:
|
||||
no_sec_configs = True
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = job.name
|
||||
report.resource_arn = job.arn
|
||||
report.region = job.region
|
||||
report.resource_tags = job.tags
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=job)
|
||||
for sec_config in glue_client.security_configs:
|
||||
if sec_config.name == job.security:
|
||||
no_sec_configs = False
|
||||
|
||||
+1
-5
@@ -7,11 +7,7 @@ class glue_etl_jobs_job_bookmark_encryption_enabled(Check):
|
||||
findings = []
|
||||
for job in glue_client.jobs:
|
||||
no_sec_configs = True
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = job.name
|
||||
report.resource_arn = job.arn
|
||||
report.region = job.region
|
||||
report.resource_tags = job.tags
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=job)
|
||||
for sec_config in glue_client.security_configs:
|
||||
if sec_config.name == job.security:
|
||||
no_sec_configs = False
|
||||
|
||||
+1
-5
@@ -20,11 +20,7 @@ class glue_etl_jobs_logging_enabled(Check):
|
||||
"""
|
||||
findings = []
|
||||
for job in glue_client.jobs:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = job.name
|
||||
report.resource_arn = job.arn
|
||||
report.region = job.region
|
||||
report.resource_tags = job.tags
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=job)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"Glue job {job.name} does not have logging enabled."
|
||||
|
||||
+4
-6
@@ -6,12 +6,10 @@ class glue_ml_transform_encrypted_at_rest(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
|
||||
for ml_transform_arn, ml_transform in glue_client.ml_transforms.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = ml_transform.id
|
||||
report.resource_arn = ml_transform_arn
|
||||
report.region = ml_transform.region
|
||||
report.resource_tags = ml_transform.tags
|
||||
for ml_transform in glue_client.ml_transforms.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=ml_transform
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"Glue ML Transform {ml_transform.name} is encrypted at rest."
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class guardduty_centrally_managed(Check):
|
||||
findings = []
|
||||
for detector in guardduty_client.detectors:
|
||||
if detector.id and detector.enabled_in_account:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = detector.region
|
||||
report.resource_id = detector.id
|
||||
report.resource_arn = detector.arn
|
||||
report.resource_tags = detector.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=detector
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"GuardDuty detector {detector.id} is not centrally managed."
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class guardduty_ec2_malware_protection_enabled(Check):
|
||||
findings = []
|
||||
for detector in guardduty_client.detectors:
|
||||
if detector.status:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = detector.region
|
||||
report.resource_id = detector.id
|
||||
report.resource_arn = detector.arn
|
||||
report.resource_tags = detector.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=detector
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"GuardDuty detector {detector.id} does not have Malware Protection for EC2 enabled."
|
||||
if detector.ec2_malware_protection:
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class guardduty_eks_audit_log_enabled(Check):
|
||||
findings = []
|
||||
for detector in guardduty_client.detectors:
|
||||
if detector.status:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = detector.region
|
||||
report.resource_id = detector.id
|
||||
report.resource_arn = detector.arn
|
||||
report.resource_tags = detector.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=detector
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"GuardDuty detector {detector.id} does not have EKS Audit Log Monitoring enabled."
|
||||
if detector.eks_audit_log_protection:
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class guardduty_eks_runtime_monitoring_enabled(Check):
|
||||
findings = []
|
||||
for detector in guardduty_client.detectors:
|
||||
if detector.status:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = detector.region
|
||||
report.resource_id = detector.id
|
||||
report.resource_arn = detector.arn
|
||||
report.resource_tags = detector.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=detector
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"GuardDuty detector {detector.id} does not have EKS Runtime Monitoring enabled."
|
||||
if detector.eks_runtime_monitoring:
|
||||
|
||||
+3
-5
@@ -6,11 +6,9 @@ class guardduty_is_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for detector in guardduty_client.detectors:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = detector.region
|
||||
report.resource_id = detector.id
|
||||
report.resource_arn = detector.arn
|
||||
report.resource_tags = detector.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=detector
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"GuardDuty detector {detector.id} enabled."
|
||||
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class guardduty_lambda_protection_enabled(Check):
|
||||
findings = []
|
||||
for detector in guardduty_client.detectors:
|
||||
if detector.status:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = detector.region
|
||||
report.resource_id = detector.id
|
||||
report.resource_arn = detector.arn
|
||||
report.resource_tags = detector.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=detector
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"GuardDuty detector {detector.id} does not have Lambda Protection enabled."
|
||||
if detector.lambda_protection:
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class guardduty_no_high_severity_findings(Check):
|
||||
findings = []
|
||||
for detector in guardduty_client.detectors:
|
||||
if detector.id and detector.enabled_in_account:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = detector.region
|
||||
report.resource_id = detector.id
|
||||
report.resource_arn = detector.arn
|
||||
report.resource_tags = detector.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=detector
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"GuardDuty detector {detector.id} does not have high severity findings."
|
||||
if len(detector.findings) > 0:
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class guardduty_rds_protection_enabled(Check):
|
||||
findings = []
|
||||
for detector in guardduty_client.detectors:
|
||||
if detector.status:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = detector.region
|
||||
report.resource_id = detector.id
|
||||
report.resource_arn = detector.arn
|
||||
report.resource_tags = detector.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=detector
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
"GuardDuty detector does not have RDS Protection enabled."
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class guardduty_s3_protection_enabled(Check):
|
||||
findings = []
|
||||
for detector in guardduty_client.detectors:
|
||||
if detector.status:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = detector.region
|
||||
report.resource_id = detector.id
|
||||
report.resource_arn = detector.arn
|
||||
report.resource_tags = detector.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=detector
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
"GuardDuty detector does not have S3 Protection enabled."
|
||||
|
||||
+1
-3
@@ -8,9 +8,7 @@ class iam_administrator_access_with_mfa(Check):
|
||||
response = iam_client.groups
|
||||
|
||||
for group in response:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = group.name
|
||||
report.resource_arn = group.arn
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=group)
|
||||
report.region = iam_client.region
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Group {group.name} has no policies."
|
||||
|
||||
@@ -16,7 +16,9 @@ class iam_avoid_root_usage(Check):
|
||||
|
||||
for user in response:
|
||||
if user["user"] == "<root_account>":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = user["user"]
|
||||
report.resource_arn = user["arn"]
|
||||
|
||||
+3
-4
@@ -9,11 +9,10 @@ class iam_aws_attached_policy_no_administrative_privileges(Check):
|
||||
for policy in iam_client.policies:
|
||||
# Check only for attached AWS policies
|
||||
if policy.attached and policy.type == "AWS":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = policy.arn
|
||||
report.resource_id = policy.name
|
||||
report.resource_tags = policy.tags
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"{policy.type} policy {policy.name} is attached but does not allow '*:*' administrative privileges."
|
||||
if policy.document:
|
||||
|
||||
+7
-6
@@ -6,7 +6,9 @@ class iam_check_saml_providers_sts(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
if not iam_client.saml_providers and iam_client.saml_providers is not None:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=iam_client.saml_providers
|
||||
)
|
||||
report.resource_id = iam_client.audited_account
|
||||
report.resource_arn = iam_client.audited_account_arn
|
||||
report.region = iam_client.region
|
||||
@@ -14,11 +16,10 @@ class iam_check_saml_providers_sts(Check):
|
||||
report.status_extended = "No SAML Providers found."
|
||||
findings.append(report)
|
||||
|
||||
for provider_arn, provider in iam_client.saml_providers.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = provider.name
|
||||
report.resource_arn = provider_arn
|
||||
report.resource_tags = provider.tags
|
||||
for provider in iam_client.saml_providers.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=provider
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"SAML Provider {provider.name} has been found."
|
||||
|
||||
+3
-4
@@ -9,11 +9,10 @@ class iam_customer_attached_policy_no_administrative_privileges(Check):
|
||||
for policy in iam_client.policies:
|
||||
# Check only for attached custom policies
|
||||
if policy.attached and policy.type == "Custom":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = policy.arn
|
||||
report.resource_id = policy.name
|
||||
report.resource_tags = policy.tags
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"{policy.type} policy {policy.name} is attached but does not allow '*:*' administrative privileges."
|
||||
if policy.document:
|
||||
|
||||
+3
-4
@@ -9,11 +9,10 @@ class iam_customer_unattached_policy_no_administrative_privileges(Check):
|
||||
for policy in iam_client.policies:
|
||||
# Check only for cutomer unattached policies
|
||||
if not policy.attached and policy.type == "Custom":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = policy.arn
|
||||
report.resource_id = policy.name
|
||||
report.resource_tags = policy.tags
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"{policy.type} policy {policy.name} is unattached and does not allow '*:*' administrative privileges."
|
||||
if policy.document:
|
||||
|
||||
+1
-3
@@ -8,10 +8,8 @@ class iam_group_administrator_access_policy(Check):
|
||||
def execute(self) -> List[Check_Report_AWS]:
|
||||
findings = []
|
||||
for group in iam_client.groups:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=group)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = group.arn
|
||||
report.resource_id = group.name
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"IAM Group {group.name} does not have AdministratorAccess policy."
|
||||
|
||||
+3
-3
@@ -11,11 +11,11 @@ class iam_inline_policy_allows_privilege_escalation(Check):
|
||||
|
||||
for policy in iam_client.policies:
|
||||
if policy.type == "Inline":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=policy
|
||||
)
|
||||
report.resource_id = f"{policy.entity}/{policy.name}"
|
||||
report.resource_arn = policy.arn
|
||||
report.region = iam_client.region
|
||||
report.resource_tags = policy.tags
|
||||
report.status = "PASS"
|
||||
|
||||
resource_type_str = report.resource_arn.split(":")[-1].split("/")[0]
|
||||
|
||||
+3
-3
@@ -8,11 +8,11 @@ class iam_inline_policy_no_administrative_privileges(Check):
|
||||
findings = []
|
||||
for policy in iam_client.policies:
|
||||
if policy.type == "Inline":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = policy.arn
|
||||
report.resource_id = f"{policy.entity}/{policy.name}"
|
||||
report.resource_tags = policy.tags
|
||||
report.status = "PASS"
|
||||
|
||||
resource_type_str = report.resource_arn.split(":")[-1].split("/")[0]
|
||||
|
||||
+3
-3
@@ -12,11 +12,11 @@ class iam_inline_policy_no_full_access_to_cloudtrail(Check):
|
||||
for policy in iam_client.policies:
|
||||
# Check only inline policies
|
||||
if policy.type == "Inline":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = policy.arn
|
||||
report.resource_id = f"{policy.entity}/{policy.name}"
|
||||
report.resource_tags = policy.tags
|
||||
report.status = "PASS"
|
||||
|
||||
resource_type_str = report.resource_arn.split(":")[-1].split("/")[0]
|
||||
|
||||
+3
-3
@@ -11,11 +11,11 @@ class iam_inline_policy_no_full_access_to_kms(Check):
|
||||
|
||||
for policy in iam_client.policies:
|
||||
if policy.type == "Inline":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = policy.arn
|
||||
report.resource_id = f"{policy.entity}/{policy.name}"
|
||||
report.resource_tags = policy.tags
|
||||
report.status = "PASS"
|
||||
|
||||
resource_type_str = report.resource_arn.split(":")[-1].split("/")[0]
|
||||
|
||||
+3
-4
@@ -8,11 +8,10 @@ class iam_no_custom_policy_permissive_role_assumption(Check):
|
||||
for policy in iam_client.policies:
|
||||
# Check only custom policies
|
||||
if policy.type == "Custom":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = policy.arn
|
||||
report.resource_id = policy.name
|
||||
report.resource_tags = policy.tags
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Custom Policy {policy.name} does not allow permissive STS Role assumption."
|
||||
if policy.document:
|
||||
|
||||
+3
-4
@@ -9,11 +9,10 @@ class iam_no_expired_server_certificates_stored(Check):
|
||||
findings = []
|
||||
|
||||
for certificate in iam_client.server_certificates:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=certificate
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = certificate.id
|
||||
report.resource_arn = certificate.arn
|
||||
report.resource_tags = certificate.tags
|
||||
expiration_days = (datetime.now(timezone.utc) - certificate.expiration).days
|
||||
if expiration_days >= 0:
|
||||
report.status = "FAIL"
|
||||
|
||||
@@ -12,7 +12,9 @@ class iam_no_root_access_key(Check):
|
||||
):
|
||||
for user in iam_client.credential_report:
|
||||
if user["user"] == "<root_account>":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = user["user"]
|
||||
report.resource_arn = user["arn"]
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class iam_password_policy_expires_passwords_within_90_days_or_less(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
if iam_client.password_policy:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=iam_client.password_policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = iam_client.password_policy_arn_template
|
||||
report.resource_id = iam_client.audited_account
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class iam_password_policy_lowercase(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
if iam_client.password_policy:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=iam_client.password_policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = iam_client.password_policy_arn_template
|
||||
report.resource_id = iam_client.audited_account
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class iam_password_policy_minimum_length_14(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
if iam_client.password_policy:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=iam_client.password_policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = iam_client.password_policy_arn_template
|
||||
report.resource_id = iam_client.audited_account
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class iam_password_policy_number(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
if iam_client.password_policy:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=iam_client.password_policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = iam_client.password_policy_arn_template
|
||||
report.resource_id = iam_client.audited_account
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class iam_password_policy_reuse_24(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
if iam_client.password_policy:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=iam_client.password_policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = iam_client.password_policy_arn_template
|
||||
report.resource_id = iam_client.audited_account
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class iam_password_policy_symbol(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
if iam_client.password_policy:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=iam_client.password_policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = iam_client.password_policy_arn_template
|
||||
report.resource_id = iam_client.audited_account
|
||||
|
||||
+3
-1
@@ -6,7 +6,9 @@ class iam_password_policy_uppercase(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
if iam_client.password_policy:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=iam_client.password_policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = iam_client.password_policy_arn_template
|
||||
report.resource_id = iam_client.audited_account
|
||||
|
||||
+3
-4
@@ -11,11 +11,10 @@ class iam_policy_allows_privilege_escalation(Check):
|
||||
|
||||
for policy in iam_client.policies:
|
||||
if policy.type == "Custom":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = policy.name
|
||||
report.resource_arn = policy.arn
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_tags = policy.tags
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Custom Policy {report.resource_arn} does not allow privilege escalation."
|
||||
|
||||
|
||||
+9
-10
@@ -10,31 +10,30 @@ class iam_policy_attached_only_to_group_or_roles(Check):
|
||||
if user.attached_policies or user.inline_policies:
|
||||
if user.attached_policies:
|
||||
for policy in user.attached_policies:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"User {user.name} has the policy {policy['PolicyName']} attached."
|
||||
report.resource_id = f"{user.name}/{policy['PolicyName']}"
|
||||
report.resource_arn = user.arn
|
||||
report.resource_tags = user.tags
|
||||
findings.append(report)
|
||||
if user.inline_policies:
|
||||
for policy in user.inline_policies:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"User {user.name} has the inline policy {policy} attached."
|
||||
report.resource_id = f"{user.name}/{policy}"
|
||||
report.resource_arn = user.arn
|
||||
report.resource_tags = user.tags
|
||||
findings.append(report)
|
||||
|
||||
else:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = user.name
|
||||
report.resource_arn = user.arn
|
||||
report.resource_tags = user.tags
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"User {user.name} has no inline or attached policies."
|
||||
|
||||
+4
-1
@@ -6,7 +6,10 @@ class iam_policy_cloudshell_admin_not_attached(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
if iam_client.entities_attached_to_cloudshell_policy:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(),
|
||||
resource_metadata=iam_client.entities_attached_to_cloudshell_policy,
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = iam_client.audited_account
|
||||
report.resource_arn = f"arn:{iam_client.audited_partition}:iam::aws:policy/AWSCloudShellFullAccess"
|
||||
|
||||
+3
-4
@@ -11,11 +11,10 @@ class iam_policy_no_full_access_to_cloudtrail(Check):
|
||||
for policy in iam_client.policies:
|
||||
# Check only custom policies
|
||||
if policy.type == "Custom":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = policy.arn
|
||||
report.resource_id = policy.name
|
||||
report.resource_tags = policy.tags
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Custom Policy {policy.name} does not allow '{critical_service}:*' privileges."
|
||||
|
||||
|
||||
+3
-4
@@ -11,11 +11,10 @@ class iam_policy_no_full_access_to_kms(Check):
|
||||
for policy in iam_client.policies:
|
||||
# Check only custom policies
|
||||
if policy.type == "Custom":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=policy
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = policy.arn
|
||||
report.resource_id = policy.name
|
||||
report.resource_tags = policy.tags
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Custom Policy {policy.name} does not allow '{critical_service}:*' privileges."
|
||||
|
||||
|
||||
+3
-4
@@ -10,11 +10,10 @@ class iam_role_administratoraccess_policy(Check):
|
||||
if (
|
||||
not role.is_service_role
|
||||
): # Avoid service roles since they cannot be modified by the user
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=role
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = role.arn
|
||||
report.resource_id = role.name
|
||||
report.resource_tags = role.tags
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"IAM Role {role.name} does not have AdministratorAccess policy."
|
||||
for policy in role.attached_policies:
|
||||
|
||||
+3
-4
@@ -10,11 +10,10 @@ class iam_role_cross_account_readonlyaccess_policy(Check):
|
||||
if (
|
||||
not role.is_service_role
|
||||
): # Avoid service roles since they cannot be modified by the user
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=role
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = role.arn
|
||||
report.resource_id = role.name
|
||||
report.resource_tags = role.tags
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"IAM Role {role.name} does not have ReadOnlyAccess policy."
|
||||
|
||||
+3
-4
@@ -10,11 +10,10 @@ class iam_role_cross_service_confused_deputy_prevention(Check):
|
||||
for role in iam_client.roles:
|
||||
# This check should only be performed against service roles (avoid Service Linked Roles since the trust relationship cannot be changed)
|
||||
if role.is_service_role and "aws-service-role" not in role.arn:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=role
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = role.arn
|
||||
report.resource_id = role.name
|
||||
report.resource_tags = role.tags
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"IAM Service Role {role.name} does not prevent against a cross-service confused deputy attack."
|
||||
if not is_policy_public(
|
||||
|
||||
+4
-1
@@ -13,7 +13,10 @@ class iam_root_credentials_management_enabled(Check):
|
||||
and organizations_client.organization.status == "ACTIVE"
|
||||
and iam_client.organization_features is not None
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(),
|
||||
resource_metadata=iam_client.organization_features,
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = iam_client.audited_account_arn
|
||||
report.resource_id = iam_client.audited_account
|
||||
|
||||
+4
-1
@@ -14,7 +14,10 @@ class iam_root_hardware_mfa_enabled(Check):
|
||||
):
|
||||
if iam_client.account_summary:
|
||||
virtual_mfa = False
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(),
|
||||
resource_metadata=iam_client.account_summary,
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = "<root_account>"
|
||||
report.resource_arn = iam_client.mfa_arn_template
|
||||
|
||||
@@ -13,7 +13,9 @@ class iam_root_mfa_enabled(Check):
|
||||
if iam_client.credential_report:
|
||||
for user in iam_client.credential_report:
|
||||
if user["user"] == "<root_account>":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = user["user"]
|
||||
report.resource_arn = user["arn"]
|
||||
|
||||
+12
-4
@@ -25,7 +25,9 @@ class iam_rotate_access_key_90_days(Check):
|
||||
user["access_key_1_last_rotated"] == "N/A"
|
||||
and user["access_key_2_last_rotated"] == "N/A"
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = user["user"]
|
||||
report.resource_arn = user["arn"]
|
||||
@@ -47,7 +49,9 @@ class iam_rotate_access_key_90_days(Check):
|
||||
) - parser.parse(user["access_key_1_last_rotated"])
|
||||
if access_key_1_last_rotated.days > maximum_expiration_days:
|
||||
old_access_keys = True
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = f"{user['user']}-access-key-1"
|
||||
report.resource_arn = user["arn"]
|
||||
@@ -64,7 +68,9 @@ class iam_rotate_access_key_90_days(Check):
|
||||
) - parser.parse(user["access_key_2_last_rotated"])
|
||||
if access_key_2_last_rotated.days > maximum_expiration_days:
|
||||
old_access_keys = True
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = f"{user['user']}-access-key-2"
|
||||
report.resource_arn = user["arn"]
|
||||
@@ -74,7 +80,9 @@ class iam_rotate_access_key_90_days(Check):
|
||||
findings.append(report)
|
||||
|
||||
if not old_access_keys:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = user["user"]
|
||||
report.resource_arn = user["arn"]
|
||||
|
||||
+4
-1
@@ -6,7 +6,10 @@ class iam_securityaudit_role_created(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
if iam_client.entities_role_attached_to_securityaudit_policy is not None:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(),
|
||||
resource_metadata=iam_client.entities_role_attached_to_securityaudit_policy,
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = "SecurityAudit"
|
||||
report.resource_arn = (
|
||||
|
||||
+4
-1
@@ -6,7 +6,10 @@ class iam_support_role_created(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
if iam_client.entities_role_attached_to_support_policy is not None:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(),
|
||||
resource_metadata=iam_client.entities_role_attached_to_support_policy,
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = iam_client.audited_account
|
||||
report.resource_arn = (
|
||||
|
||||
+3
-1
@@ -25,7 +25,9 @@ class iam_user_accesskey_unused(Check):
|
||||
user["access_key_1_active"] != "true"
|
||||
and user["access_key_2_active"] != "true"
|
||||
):
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = user["user"]
|
||||
report.resource_arn = user["arn"]
|
||||
|
||||
+1
-4
@@ -8,11 +8,8 @@ class iam_user_administrator_access_policy(Check):
|
||||
def execute(self) -> List[Check_Report_AWS]:
|
||||
findings = []
|
||||
for user in iam_client.users:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=user)
|
||||
report.region = iam_client.region
|
||||
report.resource_arn = user.arn
|
||||
report.resource_id = user.name
|
||||
report.resource_tags = user.tags
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"IAM User {user.name} does not have AdministratorAccess policy."
|
||||
|
||||
+1
-4
@@ -11,10 +11,7 @@ class iam_user_console_access_unused(Check):
|
||||
)
|
||||
findings = []
|
||||
for user in iam_client.users:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = user.name
|
||||
report.resource_arn = user.arn
|
||||
report.resource_tags = user.tags
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=user)
|
||||
report.region = iam_client.region
|
||||
if user.console_access and user.password_last_used:
|
||||
time_since_insertion = (
|
||||
|
||||
+1
-4
@@ -8,10 +8,7 @@ class iam_user_hardware_mfa_enabled(Check):
|
||||
response = iam_client.users
|
||||
|
||||
for user in response:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = user.name
|
||||
report.resource_arn = user.arn
|
||||
report.resource_tags = user.tags
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=user)
|
||||
report.region = iam_client.region
|
||||
if user.mfa_devices:
|
||||
report.status = "PASS"
|
||||
|
||||
+3
-1
@@ -9,7 +9,9 @@ class iam_user_mfa_enabled_console_access(Check):
|
||||
for user in response:
|
||||
# all the users but root (which by default does not support console password)
|
||||
if user["user"] != "<root_account>":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.resource_id = user["user"]
|
||||
report.resource_arn = user["arn"]
|
||||
report.region = iam_client.region
|
||||
|
||||
+1
-1
@@ -48,7 +48,7 @@ class iam_user_no_setup_initial_access_key(Check):
|
||||
return findings
|
||||
|
||||
def add_finding(self, user, status, status_extended, findings):
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=user)
|
||||
report.region = iam_client.region
|
||||
report.resource_id = user["user"]
|
||||
report.resource_arn = user["arn"]
|
||||
|
||||
+3
-1
@@ -9,7 +9,9 @@ class iam_user_two_active_access_key(Check):
|
||||
findings = []
|
||||
response = iam_client.credential_report
|
||||
for user in response:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=user
|
||||
)
|
||||
report.resource_id = user["user"]
|
||||
report.resource_arn = user["arn"]
|
||||
report.region = iam_client.region
|
||||
|
||||
+4
-1
@@ -13,7 +13,10 @@ class iam_user_with_temporary_credentials(Check):
|
||||
user_name = user_data[0]
|
||||
user_arn = user_data[1]
|
||||
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(),
|
||||
resource_metadata=iam_client.user_temporary_credentials_usage,
|
||||
)
|
||||
report.resource_id = user_name
|
||||
report.resource_arn = user_arn
|
||||
report.region = iam_client.region
|
||||
|
||||
+3
-4
@@ -9,10 +9,9 @@ class inspector2_active_findings_exist(Check):
|
||||
findings = []
|
||||
for inspector in inspector2_client.inspectors:
|
||||
if inspector.status == "ENABLED":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = inspector.id
|
||||
report.resource_arn = inspector.arn
|
||||
report.region = inspector.region
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=inspector
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
"Inspector2 is enabled with no active findings."
|
||||
|
||||
+3
-4
@@ -11,10 +11,9 @@ class inspector2_is_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for inspector in inspector2_client.inspectors:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.resource_id = inspector.id
|
||||
report.resource_arn = inspector.arn
|
||||
report.region = inspector.region
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=inspector
|
||||
)
|
||||
if inspector.status == "ENABLED":
|
||||
report.status = "PASS"
|
||||
report.status_extended = "Inspector2 is enabled for EC2 instances, ECR container images, Lambda functions and code."
|
||||
|
||||
+4
-6
@@ -7,12 +7,10 @@ class kafka_cluster_encryption_at_rest_uses_cmk(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
|
||||
for arn_cluster, cluster in kafka_client.clusters.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = cluster.region
|
||||
report.resource_id = cluster.id
|
||||
report.resource_arn = arn_cluster
|
||||
report.resource_tags = cluster.tags
|
||||
for cluster in kafka_client.clusters.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"Kafka cluster '{cluster.name}' does not have encryption at rest enabled with a CMK."
|
||||
|
||||
|
||||
+4
-6
@@ -6,12 +6,10 @@ class kafka_cluster_enhanced_monitoring_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
|
||||
for arn_cluster, cluster in kafka_client.clusters.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = cluster.region
|
||||
report.resource_id = cluster.id
|
||||
report.resource_arn = arn_cluster
|
||||
report.resource_tags = cluster.tags
|
||||
for cluster in kafka_client.clusters.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"Kafka cluster '{cluster.name}' has enhanced monitoring enabled."
|
||||
|
||||
+4
-6
@@ -6,12 +6,10 @@ class kafka_cluster_in_transit_encryption_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
|
||||
for arn_cluster, cluster in kafka_client.clusters.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = cluster.region
|
||||
report.resource_id = cluster.id
|
||||
report.resource_arn = arn_cluster
|
||||
report.resource_tags = cluster.tags
|
||||
for cluster in kafka_client.clusters.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"Kafka cluster '{cluster.name}' does not have encryption in transit enabled."
|
||||
|
||||
|
||||
+4
-6
@@ -6,12 +6,10 @@ class kafka_cluster_is_public(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
|
||||
for arn_cluster, cluster in kafka_client.clusters.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = cluster.region
|
||||
report.resource_id = cluster.id
|
||||
report.resource_arn = arn_cluster
|
||||
report.resource_tags = cluster.tags
|
||||
for cluster in kafka_client.clusters.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"Kafka cluster '{cluster.name}' is publicly accessible."
|
||||
|
||||
+4
-6
@@ -6,12 +6,10 @@ class kafka_cluster_mutual_tls_authentication_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
|
||||
for arn_cluster, cluster in kafka_client.clusters.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = cluster.region
|
||||
report.resource_id = cluster.id
|
||||
report.resource_arn = arn_cluster
|
||||
report.resource_tags = cluster.tags
|
||||
for cluster in kafka_client.clusters.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"Kafka cluster '{cluster.name}' does not have mutual TLS authentication enabled."
|
||||
|
||||
|
||||
+4
-6
@@ -6,12 +6,10 @@ class kafka_cluster_unrestricted_access_disabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
|
||||
for arn_cluster, cluster in kafka_client.clusters.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = cluster.region
|
||||
report.resource_id = cluster.id
|
||||
report.resource_arn = arn_cluster
|
||||
report.resource_tags = cluster.tags
|
||||
for cluster in kafka_client.clusters.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"Kafka cluster '{cluster.name}' has unrestricted access enabled."
|
||||
|
||||
+4
-6
@@ -6,12 +6,10 @@ class kafka_cluster_uses_latest_version(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
|
||||
for arn_cluster, cluster in kafka_client.clusters.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = cluster.region
|
||||
report.resource_id = cluster.id
|
||||
report.resource_arn = arn_cluster
|
||||
report.resource_tags = cluster.tags
|
||||
for cluster in kafka_client.clusters.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"Kafka cluster '{cluster.name}' is using the latest version."
|
||||
|
||||
+4
-5
@@ -6,11 +6,10 @@ class kafka_connector_in_transit_encryption_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
|
||||
for arn_connector, connector in kafkaconnect_client.connectors.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = connector.region
|
||||
report.resource_id = connector.name
|
||||
report.resource_arn = arn_connector
|
||||
for connector in kafkaconnect_client.connectors.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=connector
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"Kafka connector {connector.name} does not have encryption in transit enabled."
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ class Kafka(AWSService):
|
||||
self.clusters[cluster.get("ClusterArn", "")] = Cluster(
|
||||
id=arn.split(":")[-1].split("/")[-1],
|
||||
name=cluster.get("ClusterName", ""),
|
||||
arn=arn,
|
||||
region=regional_client.region,
|
||||
tags=list(cluster.get("Tags", {})),
|
||||
state=cluster.get("State", ""),
|
||||
@@ -98,6 +99,7 @@ class EncryptionInTransit(BaseModel):
|
||||
class Cluster(BaseModel):
|
||||
id: str
|
||||
name: str
|
||||
arn: str
|
||||
region: str
|
||||
tags: list
|
||||
kafka_version: str
|
||||
|
||||
+3
-5
@@ -18,11 +18,9 @@ class kinesis_stream_data_retention_period(Check):
|
||||
"""
|
||||
findings = []
|
||||
for stream in kinesis_client.streams.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = stream.region
|
||||
report.resource_id = stream.name
|
||||
report.resource_arn = stream.arn
|
||||
report.resource_tags = stream.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=stream
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"Kinesis Stream {stream.name} does not have an adequate data retention period ({stream.retention_period}hrs)."
|
||||
|
||||
|
||||
+3
-5
@@ -7,11 +7,9 @@ class kinesis_stream_encrypted_at_rest(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for stream in kinesis_client.streams.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = stream.region
|
||||
report.resource_id = stream.name
|
||||
report.resource_arn = stream.arn
|
||||
report.resource_tags = stream.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=stream
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"Kinesis Stream {stream.name} is not encrypted at rest."
|
||||
|
||||
@@ -8,11 +8,9 @@ class kms_cmk_are_used(Check):
|
||||
for key in kms_client.keys:
|
||||
# Only check CMKs keys
|
||||
if key.manager == "CUSTOMER":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = key.region
|
||||
report.resource_id = key.id
|
||||
report.resource_arn = key.arn
|
||||
report.resource_tags = key.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=key
|
||||
)
|
||||
if key.state != "Enabled":
|
||||
if key.state == "PendingDeletion":
|
||||
report.status = "PASS"
|
||||
|
||||
+3
-5
@@ -8,15 +8,13 @@ class kms_cmk_not_deleted_unintentionally(Check):
|
||||
for key in kms_client.keys:
|
||||
if key.manager == "CUSTOMER":
|
||||
if key.state != "Disabled" or kms_client.provider.scan_unused_services:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = key.region
|
||||
report.resource_tags = key.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=key
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"KMS CMK {key.id} is not scheduled for deletion."
|
||||
)
|
||||
report.resource_id = key.id
|
||||
report.resource_arn = key.arn
|
||||
if key.state == "PendingDeletion":
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"KMS CMK {key.id} is scheduled for deletion, revert it if it was unintentionally."
|
||||
|
||||
+1
-7
@@ -6,9 +6,7 @@ class kms_cmk_rotation_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for key in kms_client.keys:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = key.region
|
||||
report.resource_tags = key.tags
|
||||
report = Check_Report_AWS(metadata=self.metadata(), resource_metadata=key)
|
||||
# Only check enabled CMKs keys
|
||||
if (
|
||||
key.manager == "CUSTOMER"
|
||||
@@ -20,14 +18,10 @@ class kms_cmk_rotation_enabled(Check):
|
||||
report.status_extended = (
|
||||
f"KMS CMK {key.id} has automatic rotation enabled."
|
||||
)
|
||||
report.resource_id = key.id
|
||||
report.resource_arn = key.arn
|
||||
else:
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"KMS CMK {key.id} has automatic rotation disabled."
|
||||
)
|
||||
report.resource_id = key.id
|
||||
report.resource_arn = key.arn
|
||||
findings.append(report)
|
||||
return findings
|
||||
|
||||
+3
-5
@@ -10,13 +10,11 @@ class kms_key_not_publicly_accessible(Check):
|
||||
if (
|
||||
key.manager == "CUSTOMER" and key.state == "Enabled"
|
||||
): # only customer KMS have policies
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=key
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"KMS key {key.id} is not exposed to Public."
|
||||
report.resource_id = key.id
|
||||
report.resource_arn = key.arn
|
||||
report.resource_tags = key.tags
|
||||
report.region = key.region
|
||||
# If the "Principal" element value is set to { "AWS": "*" } and the policy statement is not using any Condition clauses to filter the access, the selected AWS KMS master key is publicly accessible.
|
||||
if is_policy_public(
|
||||
key.policy,
|
||||
|
||||
+4
-6
@@ -6,12 +6,10 @@ class lightsail_database_public(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
|
||||
for arn_database, database in lightsail_client.databases.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = database.region
|
||||
report.resource_id = database.id
|
||||
report.resource_arn = arn_database
|
||||
report.resource_tags = database.tags
|
||||
for database in lightsail_client.databases.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=database
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"Database '{database.name}' is public."
|
||||
|
||||
|
||||
+4
-6
@@ -5,12 +5,10 @@ from prowler.providers.aws.services.lightsail.lightsail_client import lightsail_
|
||||
class lightsail_instance_automated_snapshots(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for arn_instance, instance in lightsail_client.instances.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = instance.region
|
||||
report.resource_id = instance.id
|
||||
report.resource_arn = arn_instance
|
||||
report.resource_tags = instance.tags
|
||||
for instance in lightsail_client.instances.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"Instance '{instance.name}' does not have automated snapshots enabled."
|
||||
|
||||
+4
-6
@@ -6,12 +6,10 @@ class lightsail_instance_public(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
|
||||
for arn_instance, instance in lightsail_client.instances.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = instance.region
|
||||
report.resource_id = instance.id
|
||||
report.resource_arn = arn_instance
|
||||
report.resource_tags = instance.tags
|
||||
for instance in lightsail_client.instances.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=instance
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = (
|
||||
f"Instance '{instance.name}' is not publicly exposed."
|
||||
|
||||
@@ -66,6 +66,7 @@ class Lightsail(AWSService):
|
||||
self.instances[arn] = Instance(
|
||||
name=instance.get("name", ""),
|
||||
id=instance.get("supportCode", ""),
|
||||
arn=arn,
|
||||
tags=instance.get("tags", []),
|
||||
region=instance.get(
|
||||
"location", {"regionName": regional_client.region}
|
||||
@@ -106,6 +107,7 @@ class Lightsail(AWSService):
|
||||
self.databases[arn] = Database(
|
||||
name=database.get("name", ""),
|
||||
id=database.get("supportCode", ""),
|
||||
arn=arn,
|
||||
tags=database.get("tags", []),
|
||||
region=database.get(
|
||||
"location", {"regionName": regional_client.region}
|
||||
@@ -142,6 +144,7 @@ class Lightsail(AWSService):
|
||||
self.static_ips[arn] = StaticIP(
|
||||
name=static_ip.get("name", ""),
|
||||
id=static_ip.get("supportCode", ""),
|
||||
arn=arn,
|
||||
region=static_ip.get(
|
||||
"location", {"regionName": regional_client.region}
|
||||
).get("regionName", ""),
|
||||
@@ -169,6 +172,7 @@ class PortRange(BaseModel):
|
||||
class Instance(BaseModel):
|
||||
name: str
|
||||
id: str
|
||||
arn: str
|
||||
tags: List[Dict[str, str]]
|
||||
region: str
|
||||
availability_zone: str
|
||||
@@ -184,6 +188,7 @@ class Instance(BaseModel):
|
||||
class Database(BaseModel):
|
||||
name: str
|
||||
id: str
|
||||
arn: str
|
||||
tags: List[Dict[str, str]]
|
||||
region: str
|
||||
availability_zone: str
|
||||
@@ -197,6 +202,7 @@ class Database(BaseModel):
|
||||
class StaticIP(BaseModel):
|
||||
name: str
|
||||
id: str
|
||||
arn: str
|
||||
region: str
|
||||
availability_zone: str
|
||||
ip_address: str
|
||||
|
||||
+4
-6
@@ -6,12 +6,10 @@ class lightsail_static_ip_unused(Check):
|
||||
def execute(self) -> Check_Report_AWS:
|
||||
findings = []
|
||||
|
||||
for arn_static_ip, static_ip in lightsail_client.static_ips.items():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = static_ip.region
|
||||
report.resource_id = static_ip.id
|
||||
report.resource_arn = arn_static_ip
|
||||
report.resource_tags = []
|
||||
for static_ip in lightsail_client.static_ips.values():
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=static_ip
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"Static IP '{static_ip.name}' is not associated with any instance."
|
||||
|
||||
+3
-2
@@ -7,8 +7,9 @@ class macie_automated_sensitive_data_discovery_enabled(Check):
|
||||
findings = []
|
||||
for session in macie_client.sessions:
|
||||
if session.status == "ENABLED":
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = session.region
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=session
|
||||
)
|
||||
report.resource_arn = macie_client._get_session_arn_template(
|
||||
session.region
|
||||
)
|
||||
|
||||
@@ -7,8 +7,9 @@ class macie_is_enabled(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for session in macie_client.sessions:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = session.region
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=session
|
||||
)
|
||||
report.resource_arn = macie_client._get_session_arn_template(session.region)
|
||||
report.resource_id = macie_client.audited_account
|
||||
if session.status == "ENABLED":
|
||||
|
||||
+3
-4
@@ -6,10 +6,9 @@ class memorydb_cluster_auto_minor_version_upgrades(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for cluster in memorydb_client.clusters.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = cluster.region
|
||||
report.resource_id = cluster.name
|
||||
report.resource_arn = cluster.arn
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=cluster
|
||||
)
|
||||
if cluster.auto_minor_version_upgrade:
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"Memory DB Cluster {cluster.name} has minor version upgrade enabled."
|
||||
|
||||
+3
-5
@@ -8,11 +8,9 @@ class mq_broker_active_deployment_mode(Check):
|
||||
findings = []
|
||||
for broker in mq_client.brokers.values():
|
||||
if broker.engine_type == EngineType.ACTIVEMQ:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = broker.region
|
||||
report.resource_id = broker.id
|
||||
report.resource_arn = broker.arn
|
||||
report.resource_tags = broker.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=broker
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"MQ Apache ActiveMQ Broker {broker.name} does not have an active/standby deployment mode."
|
||||
if broker.deployment_mode == DeploymentMode.ACTIVE_STANDBY_MULTI_AZ:
|
||||
|
||||
+3
-5
@@ -6,11 +6,9 @@ class mq_broker_auto_minor_version_upgrades(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for broker in mq_client.brokers.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = broker.region
|
||||
report.resource_id = broker.id
|
||||
report.resource_arn = broker.arn
|
||||
report.resource_tags = broker.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=broker
|
||||
)
|
||||
report.status = "PASS"
|
||||
report.status_extended = f"MQ Broker {broker.name} does have automated minor version upgrades enabled."
|
||||
|
||||
|
||||
+3
-5
@@ -20,11 +20,9 @@ class mq_broker_cluster_deployment_mode(Check):
|
||||
findings = []
|
||||
for broker in mq_client.brokers.values():
|
||||
if broker.engine_type == EngineType.RABBITMQ:
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = broker.region
|
||||
report.resource_id = broker.id
|
||||
report.resource_arn = broker.arn
|
||||
report.resource_tags = broker.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=broker
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"MQ RabbitMQ Broker {broker.name} does not have a cluster deployment mode."
|
||||
if broker.deployment_mode == DeploymentMode.CLUSTER_MULTI_AZ:
|
||||
|
||||
+3
-5
@@ -16,11 +16,9 @@ class mq_broker_logging_enabled(Check):
|
||||
"""
|
||||
findings = []
|
||||
for broker in mq_client.brokers.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = broker.region
|
||||
report.resource_id = broker.id
|
||||
report.resource_arn = broker.arn
|
||||
report.resource_tags = broker.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=broker
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = (
|
||||
f"MQ Broker {broker.name} does not have logging enabled."
|
||||
|
||||
+3
-5
@@ -6,11 +6,9 @@ class mq_broker_not_publicly_accessible(Check):
|
||||
def execute(self):
|
||||
findings = []
|
||||
for broker in mq_client.brokers.values():
|
||||
report = Check_Report_AWS(self.metadata())
|
||||
report.region = broker.region
|
||||
report.resource_id = broker.id
|
||||
report.resource_arn = broker.arn
|
||||
report.resource_tags = broker.tags
|
||||
report = Check_Report_AWS(
|
||||
metadata=self.metadata(), resource_metadata=broker
|
||||
)
|
||||
report.status = "FAIL"
|
||||
report.status_extended = f"MQ Broker {broker.name} is publicly accessible."
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user