prowler-cloud 5.15.0__py3-none-any.whl → 5.16.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. prowler/CHANGELOG.md +35 -0
  2. prowler/config/config.py +1 -1
  3. prowler/providers/aws/aws_regions_by_service.json +1 -20
  4. prowler/providers/aws/services/apigateway/apigateway_service.py +4 -1
  5. prowler/providers/aws/services/bedrock/bedrock_api_key_no_administrative_privileges/bedrock_api_key_no_administrative_privileges.metadata.json +1 -1
  6. prowler/providers/aws/services/bedrock/bedrock_api_key_no_long_term_credentials/bedrock_api_key_no_long_term_credentials.metadata.json +1 -1
  7. prowler/providers/aws/services/ec2/ec2_instance_account_imdsv2_enabled/ec2_instance_account_imdsv2_enabled.metadata.json +2 -1
  8. prowler/providers/aws/services/ec2/ec2_instance_imdsv2_enabled/ec2_instance_imdsv2_enabled.metadata.json +3 -1
  9. prowler/providers/aws/services/ec2/ec2_instance_uses_single_eni/ec2_instance_uses_single_eni.metadata.json +1 -1
  10. prowler/providers/aws/services/glue/glue_data_catalogs_connection_passwords_encryption_enabled/glue_data_catalogs_connection_passwords_encryption_enabled.metadata.json +17 -11
  11. prowler/providers/aws/services/glue/glue_data_catalogs_metadata_encryption_enabled/glue_data_catalogs_metadata_encryption_enabled.metadata.json +17 -10
  12. prowler/providers/aws/services/glue/glue_data_catalogs_not_publicly_accessible/glue_data_catalogs_not_publicly_accessible.metadata.json +18 -11
  13. prowler/providers/aws/services/glue/glue_database_connections_ssl_enabled/glue_database_connections_ssl_enabled.metadata.json +18 -12
  14. prowler/providers/aws/services/glue/glue_development_endpoints_cloudwatch_logs_encryption_enabled/glue_development_endpoints_cloudwatch_logs_encryption_enabled.metadata.json +17 -11
  15. prowler/providers/aws/services/glue/glue_development_endpoints_job_bookmark_encryption_enabled/glue_development_endpoints_job_bookmark_encryption_enabled.metadata.json +17 -12
  16. prowler/providers/aws/services/glue/glue_development_endpoints_s3_encryption_enabled/glue_development_endpoints_s3_encryption_enabled.metadata.json +17 -11
  17. prowler/providers/aws/services/glue/glue_etl_jobs_amazon_s3_encryption_enabled/glue_etl_jobs_amazon_s3_encryption_enabled.metadata.json +21 -14
  18. prowler/providers/aws/services/glue/glue_etl_jobs_cloudwatch_logs_encryption_enabled/glue_etl_jobs_cloudwatch_logs_encryption_enabled.metadata.json +19 -12
  19. prowler/providers/aws/services/glue/glue_etl_jobs_job_bookmark_encryption_enabled/glue_etl_jobs_job_bookmark_encryption_enabled.metadata.json +17 -12
  20. prowler/providers/aws/services/glue/glue_etl_jobs_logging_enabled/glue_etl_jobs_logging_enabled.metadata.json +18 -12
  21. prowler/providers/aws/services/glue/glue_ml_transform_encrypted_at_rest/glue_ml_transform_encrypted_at_rest.metadata.json +20 -12
  22. prowler/providers/aws/services/iam/iam_inline_policy_allows_privilege_escalation/iam_inline_policy_allows_privilege_escalation.metadata.json +3 -1
  23. prowler/providers/aws/services/iam/iam_policy_allows_privilege_escalation/iam_policy_allows_privilege_escalation.metadata.json +3 -1
  24. prowler/providers/aws/services/iam/iam_policy_cloudshell_admin_not_attached/iam_policy_cloudshell_admin_not_attached.metadata.json +1 -1
  25. prowler/providers/aws/services/iam/iam_role_administratoraccess_policy/iam_role_administratoraccess_policy.metadata.json +1 -1
  26. prowler/providers/aws/services/iam/iam_role_cross_account_readonlyaccess_policy/iam_role_cross_account_readonlyaccess_policy.metadata.json +1 -1
  27. prowler/providers/aws/services/iam/iam_role_cross_service_confused_deputy_prevention/iam_role_cross_service_confused_deputy_prevention.metadata.json +1 -1
  28. prowler/providers/aws/services/inspector2/inspector2_active_findings_exist/inspector2_active_findings_exist.metadata.json +23 -13
  29. prowler/providers/aws/services/inspector2/inspector2_is_enabled/inspector2_is_enabled.metadata.json +18 -12
  30. prowler/providers/aws/services/kafka/kafka_cluster_encryption_at_rest_uses_cmk/kafka_cluster_encryption_at_rest_uses_cmk.metadata.json +24 -13
  31. prowler/providers/aws/services/kafka/kafka_cluster_enhanced_monitoring_enabled/kafka_cluster_enhanced_monitoring_enabled.metadata.json +24 -14
  32. prowler/providers/aws/services/kafka/kafka_cluster_in_transit_encryption_enabled/kafka_cluster_in_transit_encryption_enabled.metadata.json +23 -15
  33. prowler/providers/aws/services/kafka/kafka_cluster_is_public/kafka_cluster_is_public.metadata.json +23 -14
  34. prowler/providers/aws/services/kafka/kafka_cluster_mutual_tls_authentication_enabled/kafka_cluster_mutual_tls_authentication_enabled.metadata.json +26 -15
  35. prowler/providers/aws/services/kafka/kafka_cluster_unrestricted_access_disabled/kafka_cluster_unrestricted_access_disabled.metadata.json +27 -15
  36. prowler/providers/aws/services/kafka/kafka_cluster_uses_latest_version/kafka_cluster_uses_latest_version.metadata.json +23 -14
  37. prowler/providers/aws/services/kafka/kafka_connector_in_transit_encryption_enabled/kafka_connector_in_transit_encryption_enabled.metadata.json +18 -13
  38. prowler/providers/aws/services/kms/kms_cmk_are_used/kms_cmk_are_used.metadata.json +16 -12
  39. prowler/providers/aws/services/kms/kms_cmk_not_deleted_unintentionally/kms_cmk_not_deleted_unintentionally.metadata.json +16 -10
  40. prowler/providers/aws/services/kms/kms_cmk_not_multi_region/kms_cmk_not_multi_region.metadata.json +21 -14
  41. prowler/providers/aws/services/kms/kms_cmk_rotation_enabled/kms_cmk_rotation_enabled.metadata.json +19 -13
  42. prowler/providers/aws/services/kms/kms_key_not_publicly_accessible/kms_key_not_publicly_accessible.metadata.json +22 -14
  43. prowler/providers/aws/services/memorydb/memorydb_cluster_auto_minor_version_upgrades/memorydb_cluster_auto_minor_version_upgrades.metadata.json +23 -14
  44. prowler/providers/aws/services/redshift/redshift_cluster_enhanced_vpc_routing/redshift_cluster_enhanced_vpc_routing.metadata.json +1 -1
  45. prowler/providers/aws/services/s3/s3_bucket_shadow_resource_vulnerability/s3_bucket_shadow_resource_vulnerability.metadata.json +1 -1
  46. prowler/providers/aws/services/servicecatalog/servicecatalog_portfolio_shared_within_organization_only/servicecatalog_portfolio_shared_within_organization_only.metadata.json +17 -13
  47. prowler/providers/aws/services/sns/sns_subscription_not_using_http_endpoints/sns_subscription_not_using_http_endpoints.metadata.json +18 -11
  48. prowler/providers/aws/services/sns/sns_topics_kms_encryption_at_rest_enabled/sns_topics_kms_encryption_at_rest_enabled.metadata.json +23 -12
  49. prowler/providers/aws/services/sns/sns_topics_not_publicly_accessible/sns_topics_not_publicly_accessible.metadata.json +21 -12
  50. prowler/providers/aws/services/trustedadvisor/trustedadvisor_errors_and_warnings/trustedadvisor_errors_and_warnings.metadata.json +15 -9
  51. prowler/providers/aws/services/trustedadvisor/trustedadvisor_premium_support_plan_subscribed/trustedadvisor_premium_support_plan_subscribed.metadata.json +18 -10
  52. prowler/providers/aws/services/vpc/vpc_endpoint_connections_trust_boundaries/vpc_endpoint_connections_trust_boundaries.metadata.json +1 -1
  53. prowler/providers/aws/services/vpc/vpc_endpoint_services_allowed_principals_trust_boundaries/vpc_endpoint_services_allowed_principals_trust_boundaries.metadata.json +1 -1
  54. prowler/providers/aws/services/waf/waf_global_rule_with_conditions/waf_global_rule_with_conditions.metadata.json +21 -12
  55. prowler/providers/aws/services/waf/waf_global_rulegroup_not_empty/waf_global_rulegroup_not_empty.metadata.json +18 -12
  56. prowler/providers/aws/services/waf/waf_global_webacl_logging_enabled/waf_global_webacl_logging_enabled.metadata.json +19 -11
  57. prowler/providers/aws/services/waf/waf_global_webacl_with_rules/waf_global_webacl_with_rules.metadata.json +18 -11
  58. prowler/providers/aws/services/waf/waf_regional_rule_with_conditions/waf_regional_rule_with_conditions.metadata.json +17 -11
  59. prowler/providers/aws/services/waf/waf_regional_rulegroup_not_empty/waf_regional_rulegroup_not_empty.metadata.json +17 -11
  60. prowler/providers/aws/services/waf/waf_regional_webacl_with_rules/waf_regional_webacl_with_rules.metadata.json +18 -11
  61. prowler/providers/aws/services/wafv2/wafv2_webacl_logging_enabled/wafv2_webacl_logging_enabled.metadata.json +19 -12
  62. prowler/providers/aws/services/wafv2/wafv2_webacl_rule_logging_enabled/wafv2_webacl_rule_logging_enabled.metadata.json +19 -12
  63. prowler/providers/aws/services/wafv2/wafv2_webacl_with_rules/wafv2_webacl_with_rules.metadata.json +22 -13
  64. prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py +1 -1
  65. prowler/providers/iac/lib/arguments/arguments.py +2 -2
  66. prowler/providers/mongodbatlas/services/clusters/clusters_service.py +23 -3
  67. {prowler_cloud-5.15.0.dist-info → prowler_cloud-5.16.0.dist-info}/METADATA +4 -2
  68. {prowler_cloud-5.15.0.dist-info → prowler_cloud-5.16.0.dist-info}/RECORD +71 -71
  69. {prowler_cloud-5.15.0.dist-info → prowler_cloud-5.16.0.dist-info}/LICENSE +0 -0
  70. {prowler_cloud-5.15.0.dist-info → prowler_cloud-5.16.0.dist-info}/WHEEL +0 -0
  71. {prowler_cloud-5.15.0.dist-info → prowler_cloud-5.16.0.dist-info}/entry_points.txt +0 -0
@@ -1,29 +1,38 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "memorydb_cluster_auto_minor_version_upgrades",
4
- "CheckTitle": "Ensure Memory DB clusters have minor version upgrade enabled.",
5
- "CheckType": [],
4
+ "CheckTitle": "MemoryDB cluster has automatic minor version upgrades enabled",
5
+ "CheckType": [
6
+ "Software and Configuration Checks/Patch Management",
7
+ "Software and Configuration Checks/AWS Security Best Practices"
8
+ ],
6
9
  "ServiceName": "memorydb",
7
10
  "SubServiceName": "",
8
- "ResourceIdTemplate": "arn:aws:memorydb:region:account-id:db-cluster",
11
+ "ResourceIdTemplate": "",
9
12
  "Severity": "medium",
10
- "ResourceType": "AwsMemoryDb",
11
- "Description": "Ensure Memory DB clusters have minor version upgrade enabled.",
12
- "Risk": "Auto Minor Version Upgrade is a feature that you can enable to have your database automatically upgraded when a new minor database engine version is available. Minor version upgrades often patch security vulnerabilities and fix bugs and therefore should be applied.",
13
- "RelatedUrl": "https://docs.aws.amazon.com/memorydb/latest/devguide/engine-versions.html",
13
+ "ResourceType": "Other",
14
+ "Description": "**MemoryDB clusters** are evaluated for the `auto_minor_version_upgrade` setting that automatically applies new minor engine versions.",
15
+ "Risk": "Without automatic minor upgrades, clusters may run **known-vulnerable engine versions**.\n- Exploitable CVEs enable unauthorized reads/writes (confidentiality, integrity)\n- Unpatched bugs can cause **DoS** or data loss (availability)\n- Version drift raises operational risk and slows incident response",
16
+ "RelatedUrl": "",
17
+ "AdditionalURLs": [
18
+ "https://docs.aws.amazon.com/memorydb/latest/devguide/engine-versions.html",
19
+ "https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Upgrading.html#USER_UpgradeDBInstance.Upgrading.AutoMinorVersionUpgrades"
20
+ ],
14
21
  "Remediation": {
15
22
  "Code": {
16
- "CLI": "aws memorydb update-cluster --cluster-name <cluster-name> --auto-minor-version-upgrade ",
17
- "NativeIaC": "",
18
- "Other": "",
19
- "Terraform": ""
23
+ "CLI": "aws memorydb update-cluster --cluster-name <cluster-name> --auto-minor-version-upgrade",
24
+ "NativeIaC": "```yaml\n# Enable automatic minor version upgrades for a MemoryDB cluster\nResources:\n <example_resource_name>:\n Type: AWS::MemoryDB::Cluster\n Properties:\n ClusterName: <example_resource_name>\n ACLName: <example_acl_name>\n NodeType: <example_node_type>\n NumShards: 1\n AutoMinorVersionUpgrade: true # Critical: enables automatic minor version upgrades\n```",
25
+ "Other": "1. In the AWS Console, go to MemoryDB > Clusters\n2. Select the cluster <cluster-name> and click Edit\n3. Enable \"Auto minor version upgrade\"\n4. Click Save changes",
26
+ "Terraform": "```hcl\nresource \"aws_memorydb_cluster\" \"<example_resource_name>\" {\n name = \"<example_resource_name>\"\n acl_name = \"<example_acl_name>\"\n node_type = \"<example_node_type>\"\n num_shards = 1\n\n auto_minor_version_upgrade = true # Critical: enables automatic minor version upgrades\n}\n```"
20
27
  },
21
28
  "Recommendation": {
22
- "Text": "Enable auto minor version upgrade for all Memory DB clusters.",
23
- "Url": "https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Upgrading.html#USER_UpgradeDBInstance.Upgrading.AutoMinorVersionUpgrades"
29
+ "Text": "Enable **automatic minor version upgrades** (`auto_minor_version_upgrade=true`) for all clusters. Schedule updates in a maintenance window, validate in staging, and keep rollback plans. Apply **defense in depth** with strict ACLs and monitoring to limit exposure between releases.",
30
+ "Url": "https://hub.prowler.com/check/memorydb_cluster_auto_minor_version_upgrades"
24
31
  }
25
32
  },
26
- "Categories": [],
33
+ "Categories": [
34
+ "vulnerabilities"
35
+ ],
27
36
  "DependsOn": [],
28
37
  "RelatedTo": [],
29
38
  "Notes": ""
@@ -26,7 +26,7 @@
26
26
  }
27
27
  },
28
28
  "Categories": [
29
- "trustboundaries"
29
+ "trust-boundaries"
30
30
  ],
31
31
  "DependsOn": [],
32
32
  "RelatedTo": [],
@@ -26,7 +26,7 @@
26
26
  }
27
27
  },
28
28
  "Categories": [
29
- "trustboundaries"
29
+ "trust-boundaries"
30
30
  ],
31
31
  "DependsOn": [],
32
32
  "RelatedTo": [],
@@ -1,32 +1,36 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "servicecatalog_portfolio_shared_within_organization_only",
4
- "CheckTitle": "Service Catalog portfolios should be shared within an AWS organization only",
4
+ "CheckTitle": "Service Catalog portfolio is shared only within the AWS Organization",
5
5
  "CheckType": [
6
- "Software and Configuration Checks/AWS Security Best Practices"
6
+ "Software and Configuration Checks/AWS Security Best Practices",
7
+ "TTPs/Initial Access/Unauthorized Access"
7
8
  ],
8
9
  "ServiceName": "servicecatalog",
9
10
  "SubServiceName": "",
10
- "ResourceIdTemplate": "arn:aws:servicecatalog:{region}:{account-id}:portfolio/{portfolio-id}",
11
+ "ResourceIdTemplate": "",
11
12
  "Severity": "high",
12
- "ResourceType": "AwsServiceCatalogPortfolio",
13
- "Description": "This control checks whether AWS Service Catalog shares portfolios within an organization when the integration with AWS Organizations is enabled. The control fails if portfolios aren't shared within an organization.",
14
- "Risk": "Sharing Service Catalog portfolios outside of an organization may result in access granted to unintended AWS accounts, potentially exposing sensitive resources.",
15
- "RelatedUrl": "https://docs.aws.amazon.com/servicecatalog/latest/adminguide/catalogs_portfolios_sharing.html",
13
+ "ResourceType": "Other",
14
+ "Description": "**AWS Service Catalog portfolios** are assessed to confirm sharing occurs via **AWS Organizations** integration, not direct `ACCOUNT` shares. It reviews shared portfolios and identifies those targeted to individual accounts instead of organizational scopes.",
15
+ "Risk": "Sharing with individual accounts enables recipients to import and launch products outside centralized guardrails, inheriting launch roles. This can cause unauthorized provisioning, data exposure, and configuration drift-impacting confidentiality, integrity, and availability through misused privileges and uncontrolled costs.",
16
+ "RelatedUrl": "",
17
+ "AdditionalURLs": [
18
+ "https://docs.aws.amazon.com/servicecatalog/latest/adminguide/catalogs_portfolios_sharing.html"
19
+ ],
16
20
  "Remediation": {
17
21
  "Code": {
18
22
  "CLI": "aws servicecatalog create-portfolio-share --portfolio-id <portfolio-id> --organization-ids <org-id>",
19
- "NativeIaC": "",
20
- "Other": "https://docs.aws.amazon.com/servicecatalog/latest/adminguide/catalogs_portfolios_sharing.html",
21
- "Terraform": ""
23
+ "NativeIaC": "```yaml\n# CloudFormation: Share Service Catalog portfolio only within the AWS Organization\nResources:\n <example_resource_name>:\n Type: AWS::ServiceCatalog::PortfolioShare\n Properties:\n PortfolioId: <example_resource_id>\n OrganizationNode: # CRITICAL: share within AWS Organizations\n Type: ORGANIZATION # Shares the portfolio with the entire org\n Value: <example_resource_id> # e.g., o-xxxxxxxxxx\n```",
24
+ "Other": "1. In the AWS Console, go to Service Catalog > Portfolios and open the target portfolio\n2. Open the Shares/Sharing tab\n3. Remove every share of Type \"Account\" (stop sharing with each account)\n4. Click Share, choose \"AWS Organizations\", set Type to \"Organization\", enter your Org ID (o-xxxxxxxxxx), and share\n5. Verify no remaining shares of Type \"Account\" exist",
25
+ "Terraform": "```hcl\n# Share Service Catalog portfolio only within the AWS Organization\nresource \"aws_servicecatalog_portfolio_share\" \"<example_resource_name>\" {\n portfolio_id = \"<example_resource_id>\"\n\n organization_node { # CRITICAL: share within AWS Organizations\n type = \"ORGANIZATION\" # Shares the portfolio with the entire org\n value = \"<example_resource_id>\" # e.g., o-xxxxxxxxxx\n }\n}\n```"
22
26
  },
23
27
  "Recommendation": {
24
- "Text": "Configure AWS Service Catalog to share portfolios only within your AWS Organization for more secure access management.",
25
- "Url": "https://docs.aws.amazon.com/servicecatalog/latest/adminguide/catalogs_portfolios_sharing.html"
28
+ "Text": "Prefer **organizational sharing** for portfolios and avoid `ACCOUNT` targets. Enforce **least privilege** on portfolio access and launch roles, and review shares regularly. Apply **separation of duties** and **defense in depth** so only governed accounts consume products and blast radius remains constrained.",
29
+ "Url": "https://hub.prowler.com/check/servicecatalog_portfolio_shared_within_organization_only"
26
30
  }
27
31
  },
28
32
  "Categories": [
29
- "trustboundaries"
33
+ "trust-boundaries"
30
34
  ],
31
35
  "DependsOn": [],
32
36
  "RelatedTo": [],
@@ -1,26 +1,33 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "sns_subscription_not_using_http_endpoints",
4
- "CheckTitle": "Ensure there are no SNS subscriptions using HTTP endpoints",
5
- "CheckType": [],
4
+ "CheckTitle": "SNS subscription uses an HTTPS endpoint",
5
+ "CheckType": [
6
+ "Software and Configuration Checks/AWS Security Best Practices/Network Reachability",
7
+ "Effects/Data Exposure"
8
+ ],
6
9
  "ServiceName": "sns",
7
10
  "SubServiceName": "",
8
- "ResourceIdTemplate": "arn:aws:sns:region:account-id:topic",
11
+ "ResourceIdTemplate": "",
9
12
  "Severity": "high",
10
13
  "ResourceType": "AwsSnsTopic",
11
- "Description": "Ensure there are no SNS subscriptions using HTTP endpoints",
12
- "Risk": "When you use HTTPS, messages are automatically encrypted during transit, even if the SNS topic itself isn't encrypted. Without HTTPS, a network-based attacker can eavesdrop on network traffic or manipulate it using an attack such as man-in-the-middle.",
13
- "RelatedUrl": "https://docs.aws.amazon.com/sns/latest/dg/sns-security-best-practices.html#enforce-encryption-data-in-transit",
14
+ "Description": "Amazon SNS subscriptions are evaluated for endpoint protocol. Subscriptions using `http` are identified, while **HTTPS** endpoints indicate encrypted delivery in transit.",
15
+ "Risk": "Using **HTTP** leaves SNS deliveries unencrypted, compromising **confidentiality** via eavesdropping. MITM attackers can modify payloads or headers, damaging **integrity**, inject malicious content into downstream systems, or capture subscription data for spoofing and unauthorized actions.",
16
+ "RelatedUrl": "",
17
+ "AdditionalURLs": [
18
+ "https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-subscription.html",
19
+ "https://docs.aws.amazon.com/sns/latest/dg/sns-security-best-practices.html#enforce-encryption-data-in-transit"
20
+ ],
14
21
  "Remediation": {
15
22
  "Code": {
16
23
  "CLI": "",
17
- "NativeIaC": "",
18
- "Other": "",
19
- "Terraform": ""
24
+ "NativeIaC": "```yaml\n# CloudFormation: Ensure SNS subscription uses HTTPS\nResources:\n <example_resource_name>:\n Type: AWS::SNS::Subscription\n Properties:\n TopicArn: <example_resource_id>\n Protocol: https # Critical: use HTTPS protocol to remediate HTTP usage\n Endpoint: https://<example_endpoint> # Critical: HTTPS endpoint URL\n```",
25
+ "Other": "1. Open the Amazon SNS console and go to Subscriptions\n2. Select the subscription with Protocol set to HTTP and click Delete\n3. Click Create subscription\n4. Choose the same Topic ARN, set Protocol to HTTPS, and enter your HTTPS endpoint URL\n5. Create the subscription and confirm it from your endpoint if required",
26
+ "Terraform": "```hcl\n# Terraform: Ensure SNS subscription uses HTTPS\nresource \"aws_sns_topic_subscription\" \"<example_resource_name>\" {\n topic_arn = \"<example_resource_id>\"\n protocol = \"https\" # Critical: enforce HTTPS protocol\n endpoint = \"https://<example_endpoint>\" # Critical: HTTPS endpoint URL\n}\n```"
20
27
  },
21
28
  "Recommendation": {
22
- "Text": "To enforce only encrypted connections over HTTPS, add the aws:SecureTransport condition in the IAM policy that's attached to unencrypted SNS topics. This forces message publishers to use HTTPS instead of HTTP",
23
- "Url": "https://docs.aws.amazon.com/sns/latest/dg/sns-security-best-practices.html#enforce-encryption-data-in-transit"
29
+ "Text": "Require **HTTPS** for all SNS subscription endpoints. Prefer domain-based endpoints, verify SNS message signatures, and apply **least privilege**. Enforce TLS using IAM conditions like `aws:SecureTransport`, and use private connectivity (VPC endpoints) where possible for defense in depth.",
30
+ "Url": "https://hub.prowler.com/check/sns_subscription_not_using_http_endpoints"
24
31
  }
25
32
  },
26
33
  "Categories": [
@@ -1,26 +1,37 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "sns_topics_kms_encryption_at_rest_enabled",
4
- "CheckTitle": "Ensure there are no SNS Topics unencrypted",
5
- "CheckType": [],
4
+ "CheckTitle": "SNS topic is encrypted at rest with KMS",
5
+ "CheckType": [
6
+ "Software and Configuration Checks/AWS Security Best Practices",
7
+ "Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices",
8
+ "Software and Configuration Checks/Industry and Regulatory Standards/NIST 800-53 Controls (USA)",
9
+ "Software and Configuration Checks/Industry and Regulatory Standards/NIST CSF Controls (USA)",
10
+ "Software and Configuration Checks/Industry and Regulatory Standards/PCI-DSS",
11
+ "Software and Configuration Checks/Industry and Regulatory Standards/ISO 27001 Controls"
12
+ ],
6
13
  "ServiceName": "sns",
7
14
  "SubServiceName": "",
8
- "ResourceIdTemplate": "arn:aws:sns:region:account-id:topic",
15
+ "ResourceIdTemplate": "",
9
16
  "Severity": "high",
10
17
  "ResourceType": "AwsSnsTopic",
11
- "Description": "Ensure there are no SNS Topics unencrypted",
12
- "Risk": "If not enabled sensitive information at rest is not protected.",
13
- "RelatedUrl": "https://docs.aws.amazon.com/sns/latest/dg/sns-server-side-encryption.html",
18
+ "Description": "**Amazon SNS topics** are assessed for **server-side encryption** with **AWS KMS**. Topics lacking a configured KMS key (e.g., missing `kms_master_key_id`) are identified as unencrypted at rest.",
19
+ "Risk": "Without KMS-backed SSE, SNS stores message bodies unencrypted at rest, undermining **confidentiality**.\n\nPrivileged insiders or compromised service components could access plaintext during persistence windows, causing data exposure. You also lose KMS controls such as key policies, rotation, and detailed audit trails.",
20
+ "RelatedUrl": "",
21
+ "AdditionalURLs": [
22
+ "https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/SNS/topic-encrypted-with-kms-customer-master-keys.html",
23
+ "https://docs.aws.amazon.com/sns/latest/dg/sns-server-side-encryption.html"
24
+ ],
14
25
  "Remediation": {
15
26
  "Code": {
16
- "CLI": "aws sns set-topic-attributes --topic-arn <TOPIC_ARN> --attribute-name 'KmsMasterKeyId' --attribute-value <KEY>",
17
- "NativeIaC": "https://docs.prowler.com/checks/aws/general-policies/general_15#cloudformation",
18
- "Other": "https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/SNS/topic-encrypted-with-kms-customer-master-keys.html",
19
- "Terraform": "https://docs.prowler.com/checks/aws/general-policies/general_15#terraform"
27
+ "CLI": "aws sns set-topic-attributes --topic-arn <TOPIC_ARN> --attribute-name KmsMasterKeyId --attribute-value alias/aws/sns",
28
+ "NativeIaC": "```yaml\n# CloudFormation: Enable SSE for an SNS topic\nResources:\n <example_resource_name>:\n Type: AWS::SNS::Topic\n Properties:\n KmsMasterKeyId: alias/aws/sns # Critical: Enables encryption at rest with AWS managed KMS key\n```",
29
+ "Other": "1. Open the AWS Console and go to Amazon SNS > Topics\n2. Select the topic and click Edit\n3. Under Encryption, enable encryption and choose the AWS managed key for SNS (alias/aws/sns)\n4. Click Save changes",
30
+ "Terraform": "```hcl\n# Enable SSE for an SNS topic\nresource \"aws_sns_topic\" \"<example_resource_name>\" {\n name = \"<example_resource_name>\"\n kms_master_key_id = \"alias/aws/sns\" # Critical: Enables encryption at rest\n}\n```"
20
31
  },
21
32
  "Recommendation": {
22
- "Text": "Use Amazon SNS with AWS KMS.",
23
- "Url": "https://docs.aws.amazon.com/sns/latest/dg/sns-server-side-encryption.html"
33
+ "Text": "Enable **server-side encryption** on all SNS topics with **AWS KMS**; prefer **customer-managed keys** for control.\n\nApply **least privilege** on key use, enforce rotation, and monitor key/access logs. Minimize sensitive data in messages and use end-to-end encryption *where feasible* to add defense in depth.",
34
+ "Url": "https://hub.prowler.com/check/sns_topics_kms_encryption_at_rest_enabled"
24
35
  }
25
36
  },
26
37
  "Categories": [
@@ -1,26 +1,35 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "sns_topics_not_publicly_accessible",
4
- "CheckTitle": "Check if SNS topics have policy set as Public",
5
- "CheckType": [],
4
+ "CheckTitle": "SNS topic is not publicly accessible",
5
+ "CheckType": [
6
+ "Software and Configuration Checks/AWS Security Best Practices",
7
+ "Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices",
8
+ "Effects/Data Exposure",
9
+ "TTPs/Initial Access"
10
+ ],
6
11
  "ServiceName": "sns",
7
12
  "SubServiceName": "",
8
- "ResourceIdTemplate": "arn:aws:sns:region:account-id:topic",
13
+ "ResourceIdTemplate": "",
9
14
  "Severity": "high",
10
15
  "ResourceType": "AwsSnsTopic",
11
- "Description": "Check if SNS topics have policy set as Public",
12
- "Risk": "Publicly accessible services could expose sensitive data to bad actors.",
13
- "RelatedUrl": "https://docs.aws.amazon.com/config/latest/developerguide/sns-topic-policy.html",
16
+ "Description": "**SNS topic policies** are analyzed for **public principals** (e.g., `*`). Topics that grant access without restrictive conditions such as `aws:SourceArn`, `aws:SourceAccount`, `aws:PrincipalOrgID`, or `sns:Endpoint` scoping are treated as publicly accessible.",
17
+ "Risk": "**Public SNS topics** allow anyone or unknown accounts to:\n- **Subscribe** and siphon messages (confidentiality)\n- **Publish** spoofed payloads that alter workflows (integrity)\n- **Flood** messages causing outages and costs (availability)\nThey also enable cross-account abuse and bypass expected trust boundaries.",
18
+ "RelatedUrl": "",
19
+ "AdditionalURLs": [
20
+ "https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/SNS/topics-everyone-publish.html",
21
+ "https://docs.aws.amazon.com/config/latest/developerguide/sns-topic-policy.html"
22
+ ],
14
23
  "Remediation": {
15
24
  "Code": {
16
- "CLI": "",
17
- "NativeIaC": "",
18
- "Other": "https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/SNS/topics-everyone-publish.html",
19
- "Terraform": "https://docs.prowler.com/checks/aws/general-policies/ensure-sns-topic-policy-is-not-public-by-only-allowing-specific-services-or-principals-to-access-it#terraform"
25
+ "CLI": "aws sns set-topic-attributes --topic-arn <TOPIC_ARN> --attribute-name Policy --attribute-value '{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::<ACCOUNT_ID>:root\"},\"Action\":\"sns:Publish\",\"Resource\":\"<TOPIC_ARN>\"}]}'",
26
+ "NativeIaC": "```yaml\n# CloudFormation: restrict SNS topic policy to the account (not public)\nResources:\n <example_resource_name>:\n Type: AWS::SNS::TopicPolicy\n Properties:\n Topics:\n - arn:aws:sns:<region>:<account_id>:<example_resource_name>\n PolicyDocument:\n Version: '2012-10-17'\n Statement:\n - Effect: Allow\n Action: sns:Publish\n Resource: arn:aws:sns:<region>:<account_id>:<example_resource_name>\n Principal:\n AWS: arn:aws:iam::<account_id>:root # Critical: restrict to account root to remove public access\n```",
27
+ "Other": "1. Open the Amazon SNS console and select Topics\n2. Choose the topic and go to the Access policy tab\n3. Edit the policy and remove any Principal set to \"*\" (Everyone/Public)\n4. Add a statement allowing only your account root: Principal = arn:aws:iam::<ACCOUNT_ID>:root with Action sns:Publish and Resource set to the topic ARN\n5. Save changes",
28
+ "Terraform": "```hcl\n# Restrict SNS topic policy to the account (not public)\nresource \"aws_sns_topic_policy\" \"<example_resource_name>\" {\n arn = \"<TOPIC_ARN>\"\n policy = jsonencode({\n Version = \"2012-10-17\"\n Statement = [{\n Effect = \"Allow\"\n Action = \"sns:Publish\"\n Resource = \"<TOPIC_ARN>\"\n Principal = { AWS = \"arn:aws:iam::<ACCOUNT_ID>:root\" } # Critical: restrict principal to the account to remove public access\n }]\n })\n}\n```"
20
29
  },
21
30
  "Recommendation": {
22
- "Text": "Ensure there is a business requirement for service to be public.",
23
- "Url": "https://docs.aws.amazon.com/config/latest/developerguide/sns-topic-policy.html"
31
+ "Text": "Restrict the **topic policy** to specific principals and minimal actions:\n- Avoid `Principal:*`\n- Allow only needed actions (e.g., `sns:Publish`)\n- Add conditions like `aws:SourceArn`, `aws:SourceAccount`, `aws:PrincipalOrgID`, or `sns:Endpoint`\nApply **least privilege**, separate duties, and review policies regularly.",
32
+ "Url": "https://hub.prowler.com/check/sns_topics_not_publicly_accessible"
24
33
  }
25
34
  },
26
35
  "Categories": [
@@ -1,26 +1,32 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "trustedadvisor_errors_and_warnings",
4
- "CheckTitle": "Check Trusted Advisor for errors and warnings.",
5
- "CheckType": [],
4
+ "CheckTitle": "Trusted Advisor check has no errors or warnings",
5
+ "CheckType": [
6
+ "Software and Configuration Checks/AWS Security Best Practices"
7
+ ],
6
8
  "ServiceName": "trustedadvisor",
7
9
  "SubServiceName": "",
8
- "ResourceIdTemplate": "arn:aws:service:region:account-id",
10
+ "ResourceIdTemplate": "",
9
11
  "Severity": "medium",
10
12
  "ResourceType": "Other",
11
- "Description": "Check Trusted Advisor for errors and warnings.",
12
- "Risk": "Improve the security of your application by closing gaps, enabling various AWS security features and examining your permissions.",
13
- "RelatedUrl": "https://aws.amazon.com/premiumsupport/technology/trusted-advisor/best-practice-checklist/",
13
+ "Description": "**AWS Trusted Advisor** check statuses are assessed to identify items in `warning` or `error`. The finding reflects the state reported by Trusted Advisor across categories such as **Security**, **Fault Tolerance**, **Service Limits**, and **Cost**, indicating where configurations or quotas require attention.",
14
+ "Risk": "Unaddressed **warnings/errors** can leave misconfigurations that impact CIA:\n- **Confidentiality**: public access or weak auth exposes data\n- **Integrity**: overly permissive settings allow unwanted changes\n- **Availability**: limit exhaustion or poor resilience triggers outages\nThey can also increase unnecessary cost.",
15
+ "RelatedUrl": "",
16
+ "AdditionalURLs": [
17
+ "https://aws.amazon.com/premiumsupport/technology/trusted-advisor/best-practice-checklist/",
18
+ "https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/TrustedAdvisor/checks.html"
19
+ ],
14
20
  "Remediation": {
15
21
  "Code": {
16
22
  "CLI": "",
17
23
  "NativeIaC": "",
18
- "Other": "https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/TrustedAdvisor/checks.html",
24
+ "Other": "1. Sign in to the AWS Console and open Trusted Advisor\n2. Go to Checks and filter Status to Warning and Error\n3. Open each failing check and click View details/Recommended actions\n4. Apply the listed fix to the affected resources\n5. Click Refresh on the check and repeat until all checks show OK",
19
25
  "Terraform": ""
20
26
  },
21
27
  "Recommendation": {
22
- "Text": "Review and act upon its recommendations.",
23
- "Url": "https://aws.amazon.com/premiumsupport/technology/trusted-advisor/best-practice-checklist/"
28
+ "Text": "Adopt a continuous process to remediate Trusted Advisor findings:\n- Prioritize **`error`** then `warning`\n- Assign ownership and SLAs\n- Integrate alerts with workflows\n- Enforce **least privilege**, segmentation, encryption, MFA, and tested backups\n- Reassess regularly to confirm fixes and prevent regression",
29
+ "Url": "https://hub.prowler.com/check/trustedadvisor_errors_and_warnings"
24
30
  }
25
31
  },
26
32
  "Categories": [],
@@ -1,29 +1,37 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "trustedadvisor_premium_support_plan_subscribed",
4
- "CheckTitle": "Check if a Premium support plan is subscribed",
5
- "CheckType": [],
4
+ "CheckTitle": "AWS account is subscribed to an AWS Premium Support plan",
5
+ "CheckType": [
6
+ "Software and Configuration Checks/AWS Security Best Practices"
7
+ ],
6
8
  "ServiceName": "trustedadvisor",
7
9
  "SubServiceName": "",
8
- "ResourceIdTemplate": "arn:aws:iam::AWS_ACCOUNT_NUMBER:root",
10
+ "ResourceIdTemplate": "",
9
11
  "Severity": "low",
10
12
  "ResourceType": "Other",
11
- "Description": "Check if a Premium support plan is subscribed.",
12
- "Risk": "Ensure that the appropriate support level is enabled for the necessary AWS accounts. For example, if an AWS account is being used to host production systems and environments, it is highly recommended that the minimum AWS Support Plan should be Business.",
13
- "RelatedUrl": "https://aws.amazon.com/premiumsupport/plans/",
13
+ "Description": "**AWS account** is subscribed to an **AWS Premium Support plan** (e.g., Business or Enterprise)",
14
+ "Risk": "Without **Premium Support**, critical incidents face slower response, reducing **availability** and delaying containment of security events. Limited Trusted Advisor coverage lets **misconfigurations** persist, risking **data exposure** and **privilege misuse**. Lack of expert guidance increases change risk during production impacts.",
15
+ "RelatedUrl": "",
16
+ "AdditionalURLs": [
17
+ "https://www.trendmicro.com/cloudoneconformity-staging/knowledge-base/aws/Support/support-plan.html",
18
+ "https://aws.amazon.com/premiumsupport/plans/"
19
+ ],
14
20
  "Remediation": {
15
21
  "Code": {
16
22
  "CLI": "",
17
23
  "NativeIaC": "",
18
- "Other": "https://www.trendmicro.com/cloudoneconformity-staging/knowledge-base/aws/Support/support-plan.html",
24
+ "Other": "1. Sign in to the AWS Management Console as the account root user\n2. Open https://console.aws.amazon.com/support/home#/plans\n3. Click \"Change plan\"\n4. Select \"Business Support\" (or higher) and click \"Continue\"\n5. Review and confirm the upgrade",
19
25
  "Terraform": ""
20
26
  },
21
27
  "Recommendation": {
22
- "Text": "It is recommended that you subscribe to the AWS Business Support tier or higher for all of your AWS production accounts. If you don't have premium support, you must have an action plan to handle issues which require help from AWS Support. AWS Support provides a mix of tools and technology, people, and programs designed to proactively help you optimize performance, lower costs, and innovate faster.",
23
- "Url": "https://www.trendmicro.com/cloudoneconformity-staging/knowledge-base/aws/Support/support-plan.html"
28
+ "Text": "Adopt **Business** or higher for production and mission-critical accounts.\n- Integrate Support into IR with defined contacts/severity\n- Enforce **least privilege** for case access\n- Use Trusted Advisor for proactive hardening\n- If opting out, ensure an equivalent 24/7 support and escalation path",
29
+ "Url": "https://hub.prowler.com/check/trustedadvisor_premium_support_plan_subscribed"
24
30
  }
25
31
  },
26
- "Categories": [],
32
+ "Categories": [
33
+ "resilience"
34
+ ],
27
35
  "DependsOn": [],
28
36
  "RelatedTo": [],
29
37
  "Notes": ""
@@ -26,7 +26,7 @@
26
26
  }
27
27
  },
28
28
  "Categories": [
29
- "trustboundaries"
29
+ "trust-boundaries"
30
30
  ],
31
31
  "DependsOn": [],
32
32
  "RelatedTo": [],
@@ -26,7 +26,7 @@
26
26
  }
27
27
  },
28
28
  "Categories": [
29
- "trustboundaries"
29
+ "trust-boundaries"
30
30
  ],
31
31
  "DependsOn": [],
32
32
  "RelatedTo": [],
@@ -1,31 +1,40 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "waf_global_rule_with_conditions",
4
- "CheckTitle": "AWS WAF Classic Global Rules Should Have at Least One Condition.",
4
+ "CheckTitle": "AWS WAF Classic Global rule has at least one condition",
5
5
  "CheckType": [
6
+ "Software and Configuration Checks/AWS Security Best Practices/Network Reachability",
7
+ "Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices",
6
8
  "Software and Configuration Checks/Industry and Regulatory Standards/NIST 800-53 Controls"
7
9
  ],
8
10
  "ServiceName": "waf",
9
11
  "SubServiceName": "",
10
- "ResourceIdTemplate": "arn:aws:waf:account-id:rule/rule-id",
12
+ "ResourceIdTemplate": "",
11
13
  "Severity": "medium",
12
14
  "ResourceType": "AwsWafRule",
13
- "Description": "Ensure that every AWS WAF Classic Global Rule contains at least one condition.",
14
- "Risk": "An AWS WAF Classic Global rule without any conditions cannot inspect or filter traffic, potentially allowing malicious requests to pass unchecked.",
15
- "RelatedUrl": "https://docs.aws.amazon.com/config/latest/developerguide/waf-global-rule-not-empty.html",
15
+ "Description": "**AWS WAF Classic global rules** contain at least one **condition** that matches HTTP(S) requests the rule evaluates for action (e.g., `allow`, `block`, `count`).",
16
+ "Risk": "**No-condition rules** never match traffic, providing no filtering. Malicious requests (SQLi/XSS, bots) can reach origins, impacting **confidentiality** (data exfiltration), **integrity** (tampering), and **availability** (service disruption). They may also create a false sense of coverage.",
17
+ "RelatedUrl": "",
18
+ "AdditionalURLs": [
19
+ "https://docs.aws.amazon.com/waf/latest/developerguide/classic-web-acl-rules-editing.html",
20
+ "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-6",
21
+ "https://docs.aws.amazon.com/config/latest/developerguide/waf-global-rule-not-empty.html"
22
+ ],
16
23
  "Remediation": {
17
24
  "Code": {
18
- "CLI": "aws waf update-rule --rule-id <your-rule-id> --change-token <your-change-token> --updates '[{\"Action\":\"INSERT\",\"Predicate\":{\"Negated\":false,\"Type\":\"IPMatch\",\"DataId\":\"<your-ipset-id>\"}}]' --region <your-region>",
19
- "NativeIaC": "",
20
- "Other": "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-6",
21
- "Terraform": ""
25
+ "CLI": "aws waf update-rule --rule-id <example_resource_id> --change-token <example_change_token> --updates '[{\"Action\":\"INSERT\",\"Predicate\":{\"Negated\":false,\"Type\":\"IPMatch\",\"DataId\":\"<example_resource_id>\"}}]' --region us-east-1",
26
+ "NativeIaC": "```yaml\n# CloudFormation: ensure the WAF Classic Global rule has at least one condition\nResources:\n <example_resource_name>:\n Type: AWS::WAF::Rule\n Properties:\n Name: <example_resource_name>\n MetricName: <example_metric_name>\n # Critical: add at least one predicate (condition) so the rule is not empty\n Predicates:\n - Negated: false # evaluate as-is\n Type: IPMatch\n DataId: <example_resource_id> # existing IPSet ID\n```",
27
+ "Other": "1. Open the AWS Console > AWS WAF, then click Switch to AWS WAF Classic\n2. In Global (CloudFront) scope, go to Rules and select the target rule\n3. Click Edit (or Add rule) > Add condition\n4. Choose a condition type (e.g., IP match), select an existing condition, set it to does (not negated)\n5. Click Update/Save to apply\n",
28
+ "Terraform": "```hcl\n# Ensure the WAF Classic Global rule has at least one condition\nresource \"aws_waf_rule\" \"<example_resource_name>\" {\n name = \"<example_resource_name>\"\n metric_name = \"<example_metric_name>\"\n\n # Critical: add at least one predicate (condition) so the rule is not empty\n predicate {\n data_id = \"<example_resource_id>\" # existing IPSet ID\n negated = false\n type = \"IPMatch\"\n }\n}\n```"
22
29
  },
23
30
  "Recommendation": {
24
- "Text": "Ensure that every AWS WAF Classic Global rule has at least one condition to properly inspect and manage web traffic.",
25
- "Url": "https://docs.aws.amazon.com/waf/latest/developerguide/classic-web-acl-rules-editing.html"
31
+ "Text": "Attach at least one precise **condition** to every rule, aligned to known threats and application context. Apply **least privilege** for traffic, use managed rule groups for **defense in depth**, and routinely review rules to remove placeholders. *If on Classic*, plan migration to WAFv2.",
32
+ "Url": "https://hub.prowler.com/check/waf_global_rule_with_conditions"
26
33
  }
27
34
  },
28
- "Categories": [],
35
+ "Categories": [
36
+ "internet-exposed"
37
+ ],
29
38
  "DependsOn": [],
30
39
  "RelatedTo": [],
31
40
  "Notes": ""
@@ -1,28 +1,34 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "waf_global_rulegroup_not_empty",
4
- "CheckTitle": "Check if AWS WAF Classic Global rule group has at least one rule.",
4
+ "CheckTitle": "AWS WAF Classic global rule group has at least one rule",
5
5
  "CheckType": [
6
+ "Software and Configuration Checks/AWS Security Best Practices/Network Reachability",
6
7
  "Software and Configuration Checks/Industry and Regulatory Standards/NIST 800-53 Controls"
7
8
  ],
8
9
  "ServiceName": "waf",
9
10
  "SubServiceName": "",
10
- "ResourceIdTemplate": "arn:aws:waf::account-id:rulegroup/rule-group-name/rule-group-id",
11
- "Severity": "medium",
11
+ "ResourceIdTemplate": "",
12
+ "Severity": "high",
12
13
  "ResourceType": "AwsWafRuleGroup",
13
- "Description": "Ensure that every AWS WAF Classic Global rule group contains at least one rule.",
14
- "Risk": "A WAF Classic Global rule group without any rules allows all incoming traffic to bypass inspection, increasing the risk of unauthorized access and potential attacks on resources.",
15
- "RelatedUrl": "https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-groups.html",
14
+ "Description": "**AWS WAF Classic global rule groups** are assessed for the presence of **one or more rules**. Empty groups are identified even when referenced by a web ACL, meaning the group adds no match logic.",
15
+ "Risk": "An empty rule group performs no inspection, so web requests pass without WAF scrutiny. This creates blind spots enabling:\n- **Confidentiality**: data exfiltration via SQLi/XSS\n- **Integrity**: parameter tampering\n- **Availability**: bot abuse and layer-7 DoS\n\nIt also creates a false sense of protection when attached.",
16
+ "RelatedUrl": "",
17
+ "AdditionalURLs": [
18
+ "https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-groups.html",
19
+ "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-7",
20
+ "https://docs.aws.amazon.com/waf/latest/developerguide/classic-rule-group-editing.html"
21
+ ],
16
22
  "Remediation": {
17
23
  "Code": {
18
- "CLI": "aws waf update-rule-group --rule-group-id <rule-group-id> --updates Action=INSERT,ActivatedRule={Priority=1,RuleId=<rule-id>,Action={Type=BLOCK}} --change-token <change-token> --region <region>",
19
- "NativeIaC": "",
20
- "Other": "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-7",
21
- "Terraform": ""
24
+ "CLI": "aws waf update-rule-group --rule-group-id <rule-group-id> --updates Action=INSERT,ActivatedRule={Priority=1,RuleId=<rule-id>,Action={Type=BLOCK}} --change-token <change-token> --region us-east-1",
25
+ "NativeIaC": "```yaml\n# CloudFormation: ensure the WAF Classic global rule group has at least one rule\nResources:\n <example_resource_name>:\n Type: AWS::WAF::RuleGroup\n Properties:\n Name: <example_resource_name>\n MetricName: examplemetric\n ActivatedRules:\n - Priority: 1 # Critical: adds a rule to the group (makes it non-empty)\n RuleId: <example_resource_id> # Critical: ID of the existing rule to add\n Action:\n Type: BLOCK # Critical: required action when activating the rule\n```",
26
+ "Other": "1. Open the AWS Console and go to AWS WAF, then switch to AWS WAF Classic\n2. At the top, set scope to Global (CloudFront)\n3. Go to Rule groups and select the target rule group\n4. Click Edit rule group\n5. Select an existing rule, choose its action (e.g., BLOCK), and click Add rule to rule group\n6. Click Update to save",
27
+ "Terraform": "```hcl\n# Terraform: ensure the WAF Classic global rule group has at least one rule\nresource \"aws_waf_rule_group\" \"<example_resource_name>\" {\n name = \"<example_resource_name>\"\n metric_name = \"examplemetric\"\n\n activated_rule {\n priority = 1 # Critical: adds a rule to the group (makes it non-empty)\n rule_id = \"<example_resource_id>\" # Critical: ID of the existing rule to add\n action {\n type = \"BLOCK\" # Critical: required action when activating the rule\n }\n }\n}\n```"
22
28
  },
23
29
  "Recommendation": {
24
- "Text": "Ensure that every AWS WAF Classic Global rule group contains at least one rule to enforce traffic inspection and defined actions such as allow, block, or count.",
25
- "Url": "https://docs.aws.amazon.com/waf/latest/developerguide/classic-rule-group-editing.html"
30
+ "Text": "Populate each rule group with **effective rules** aligned to application threats; choose `block` or `count` actions as appropriate. Prefer **managed rule groups** as a baseline and layer custom rules for **least privilege**. Avoid placeholder groups, test in staging, and monitor metrics to tune.",
31
+ "Url": "https://hub.prowler.com/check/waf_global_rulegroup_not_empty"
26
32
  }
27
33
  },
28
34
  "Categories": [],
@@ -1,31 +1,39 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "waf_global_webacl_logging_enabled",
4
- "CheckTitle": "Check if AWS WAF Classic Global WebACL has logging enabled.",
4
+ "CheckTitle": "AWS WAF Classic Global Web ACL has logging enabled",
5
5
  "CheckType": [
6
+ "Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices",
6
7
  "Software and Configuration Checks/Industry and Regulatory Standards/NIST 800-53 Controls"
7
8
  ],
8
9
  "ServiceName": "waf",
9
10
  "SubServiceName": "",
10
- "ResourceIdTemplate": "arn:aws:waf:account-id:webacl/web-acl-id",
11
+ "ResourceIdTemplate": "",
11
12
  "Severity": "medium",
12
13
  "ResourceType": "AwsWafWebAcl",
13
- "Description": "Ensure that every AWS WAF Classic Global WebACL has logging enabled.",
14
- "Risk": "Without logging enabled, there is no visibility into traffic patterns or potential security threats, which limits the ability to troubleshoot and monitor web traffic effectively.",
15
- "RelatedUrl": "https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-incident-response.html",
14
+ "Description": "**AWS WAF Classic global Web ACLs** have **logging** enabled to capture evaluated web requests and rule actions for each ACL",
15
+ "Risk": "Without **WAF logging**, you lose **visibility** into attacks (SQLi/XSS probes, bots, brute-force) and into allow/block decisions, limiting detection and forensics. This degrades **confidentiality**, **integrity**, and **availability**, and slows incident response and tuning.",
16
+ "RelatedUrl": "",
17
+ "AdditionalURLs": [
18
+ "https://docs.aws.amazon.com/waf/latest/developerguide/classic-logging.html",
19
+ "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-1",
20
+ "https://docs.aws.amazon.com/cli/latest/reference/waf/put-logging-configuration.html"
21
+ ],
16
22
  "Remediation": {
17
23
  "Code": {
18
- "CLI": "aws waf put-logging-configuration --logging-configuration ResourceArn=<web-acl-arn>,LogDestinationConfigs=<log-destination-arn>",
19
- "NativeIaC": "https://docs.prowler.com/checks/aws/logging-policies/bc_aws_logging_31/",
20
- "Other": "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-1",
24
+ "CLI": "aws waf put-logging-configuration --logging-configuration ResourceArn=<web_acl_arn>,LogDestinationConfigs=<kinesis_firehose_delivery_stream_arn>",
25
+ "NativeIaC": "",
26
+ "Other": "1. In the AWS console, create an Amazon Kinesis Data Firehose delivery stream named starting with \"aws-waf-logs-\" (for CloudFront/global, create it in us-east-1)\n2. Open the AWS WAF console and switch to AWS WAF Classic\n3. Select Filter: Global (CloudFront) and go to Web ACLs\n4. Open the target Web ACL and go to the Logging tab\n5. Click Enable logging and select the Firehose delivery stream created in step 1\n6. Click Enable/Save",
21
27
  "Terraform": ""
22
28
  },
23
29
  "Recommendation": {
24
- "Text": "Ensure logging is enabled for AWS WAF Classic Global Web ACLs to capture traffic details and maintain compliance.",
25
- "Url": "https://docs.aws.amazon.com/waf/latest/developerguide/classic-logging.html"
30
+ "Text": "Enable **logging** on all global Web ACLs and send records to a centralized logging platform. Apply **least privilege** to log destinations and redact sensitive fields. Monitor and alert on anomalies, and integrate logs with incident response for **defense in depth** and faster containment.",
31
+ "Url": "https://hub.prowler.com/check/waf_global_webacl_logging_enabled"
26
32
  }
27
33
  },
28
- "Categories": [],
34
+ "Categories": [
35
+ "logging"
36
+ ],
29
37
  "DependsOn": [],
30
38
  "RelatedTo": [],
31
39
  "Notes": ""