prowler-cloud 5.15.1__py3-none-any.whl → 5.16.1__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 (72) hide show
  1. prowler/CHANGELOG.md +34 -0
  2. prowler/config/config.py +1 -1
  3. prowler/lib/outputs/compliance/prowler_threatscore/prowler_threatscore.py +15 -4
  4. prowler/providers/aws/aws_regions_by_service.json +1 -20
  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_object_versioning/s3_bucket_object_versioning.metadata.json +1 -1
  46. prowler/providers/aws/services/s3/s3_bucket_shadow_resource_vulnerability/s3_bucket_shadow_resource_vulnerability.metadata.json +1 -1
  47. prowler/providers/aws/services/servicecatalog/servicecatalog_portfolio_shared_within_organization_only/servicecatalog_portfolio_shared_within_organization_only.metadata.json +17 -13
  48. prowler/providers/aws/services/sns/sns_subscription_not_using_http_endpoints/sns_subscription_not_using_http_endpoints.metadata.json +18 -11
  49. prowler/providers/aws/services/sns/sns_topics_kms_encryption_at_rest_enabled/sns_topics_kms_encryption_at_rest_enabled.metadata.json +23 -12
  50. prowler/providers/aws/services/sns/sns_topics_not_publicly_accessible/sns_topics_not_publicly_accessible.metadata.json +21 -12
  51. prowler/providers/aws/services/trustedadvisor/trustedadvisor_errors_and_warnings/trustedadvisor_errors_and_warnings.metadata.json +15 -9
  52. prowler/providers/aws/services/trustedadvisor/trustedadvisor_premium_support_plan_subscribed/trustedadvisor_premium_support_plan_subscribed.metadata.json +18 -10
  53. prowler/providers/aws/services/vpc/vpc_endpoint_connections_trust_boundaries/vpc_endpoint_connections_trust_boundaries.metadata.json +1 -1
  54. prowler/providers/aws/services/vpc/vpc_endpoint_services_allowed_principals_trust_boundaries/vpc_endpoint_services_allowed_principals_trust_boundaries.metadata.json +1 -1
  55. prowler/providers/aws/services/waf/waf_global_rule_with_conditions/waf_global_rule_with_conditions.metadata.json +21 -12
  56. prowler/providers/aws/services/waf/waf_global_rulegroup_not_empty/waf_global_rulegroup_not_empty.metadata.json +18 -12
  57. prowler/providers/aws/services/waf/waf_global_webacl_logging_enabled/waf_global_webacl_logging_enabled.metadata.json +19 -11
  58. prowler/providers/aws/services/waf/waf_global_webacl_with_rules/waf_global_webacl_with_rules.metadata.json +18 -11
  59. prowler/providers/aws/services/waf/waf_regional_rule_with_conditions/waf_regional_rule_with_conditions.metadata.json +17 -11
  60. prowler/providers/aws/services/waf/waf_regional_rulegroup_not_empty/waf_regional_rulegroup_not_empty.metadata.json +17 -11
  61. prowler/providers/aws/services/waf/waf_regional_webacl_with_rules/waf_regional_webacl_with_rules.metadata.json +18 -11
  62. prowler/providers/aws/services/wafv2/wafv2_webacl_logging_enabled/wafv2_webacl_logging_enabled.metadata.json +19 -12
  63. prowler/providers/aws/services/wafv2/wafv2_webacl_rule_logging_enabled/wafv2_webacl_rule_logging_enabled.metadata.json +19 -12
  64. prowler/providers/aws/services/wafv2/wafv2_webacl_with_rules/wafv2_webacl_with_rules.metadata.json +22 -13
  65. prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py +1 -1
  66. prowler/providers/iac/lib/arguments/arguments.py +2 -2
  67. prowler/providers/mongodbatlas/services/clusters/clusters_service.py +23 -3
  68. {prowler_cloud-5.15.1.dist-info → prowler_cloud-5.16.1.dist-info}/METADATA +4 -2
  69. {prowler_cloud-5.15.1.dist-info → prowler_cloud-5.16.1.dist-info}/RECORD +72 -72
  70. {prowler_cloud-5.15.1.dist-info → prowler_cloud-5.16.1.dist-info}/LICENSE +0 -0
  71. {prowler_cloud-5.15.1.dist-info → prowler_cloud-5.16.1.dist-info}/WHEEL +0 -0
  72. {prowler_cloud-5.15.1.dist-info → prowler_cloud-5.16.1.dist-info}/entry_points.txt +0 -0
@@ -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": ""
@@ -1,28 +1,35 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "waf_global_webacl_with_rules",
4
- "CheckTitle": "Check if AWS WAF Classic Global WebACL has at least one rule or rule group.",
4
+ "CheckTitle": "AWS WAF Classic global Web ACL has at least one rule or rule group",
5
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",
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:webacl/web-acl-id",
12
+ "ResourceIdTemplate": "",
11
13
  "Severity": "medium",
12
14
  "ResourceType": "AwsWafWebAcl",
13
- "Description": "Ensure that every AWS WAF Classic Global WebACL contains at least one rule or rule group.",
14
- "Risk": "An empty AWS WAF Classic Global web ACL allows all web traffic to bypass inspection, potentially exposing resources to unauthorized access and attacks.",
15
- "RelatedUrl": "https://docs.aws.amazon.com/waf/latest/developerguide/waf-rules.html",
15
+ "Description": "**AWS WAF Classic global web ACLs** are evaluated for the presence of at least one **rule** or **rule group** that inspects HTTP(S) requests",
16
+ "Risk": "With no rules, the web ACL relies solely on its default action. If `allow`, hostile traffic reaches origins uninspected; if `block`, legitimate traffic can be denied.\n- SQLi/XSS can expose data (confidentiality)\n- Malicious requests can alter state (integrity)\n- Bots and scraping can drain resources (availability)",
17
+ "RelatedUrl": "",
18
+ "AdditionalURLs": [
19
+ "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-8",
20
+ "https://docs.aws.amazon.com/waf/latest/developerguide/classic-web-acl-editing.html",
21
+ "https://docs.aws.amazon.com/waf/latest/developerguide/waf-rules.html"
22
+ ],
16
23
  "Remediation": {
17
24
  "Code": {
18
- "CLI": "aws waf update-web-acl --web-acl-id <your-web-acl-id> --change-token <your-change-token> --updates '[{\"Action\":\"INSERT\",\"ActivatedRule\":{\"Priority\":1,\"RuleId\":\"<your-rule-id>\",\"Action\":{\"Type\":\"BLOCK\"}}}]' --default-action Type=ALLOW --region <your-region>",
19
- "NativeIaC": "",
20
- "Other": "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-8",
21
- "Terraform": ""
25
+ "CLI": "aws waf update-web-acl --web-acl-id <WEB_ACL_ID> --change-token <CHANGE_TOKEN> --updates '[{\"Action\":\"INSERT\",\"ActivatedRule\":{\"Priority\":1,\"RuleId\":\"<RULE_ID>\",\"Action\":{\"Type\":\"BLOCK\"}}}]'",
26
+ "NativeIaC": "```yaml\nResources:\n <example_resource_name>:\n Type: AWS::WAF::WebACL\n Properties:\n Name: <example_resource_name>\n MetricName: <example_metric_name>\n DefaultAction:\n Type: ALLOW\n Rules:\n - Action:\n Type: BLOCK\n Priority: 1\n RuleId: <example_rule_id> # Critical: Adds a rule so the Web ACL is not empty\n # This ensures the Web ACL has at least one rule, changing FAIL to PASS\n```",
27
+ "Other": "1. Open the AWS console and go to WAF\n2. In the left menu, click Switch to AWS WAF Classic\n3. At the top, set Filter to Global (CloudFront)\n4. Click Web ACLs and select your web ACL\n5. On the Rules tab, click Edit web ACL\n6. In Rules, select an existing rule or rule group and click Add rule to web ACL\n7. Click Save changes",
28
+ "Terraform": "```hcl\nresource \"aws_waf_web_acl\" \"<example_resource_name>\" {\n name = \"<example_resource_name>\"\n metric_name = \"<example_metric_name>\"\n\n default_action {\n type = \"ALLOW\"\n }\n\n rules { # Critical: Adds at least one rule so the Web ACL is not empty\n priority = 1\n rule_id = \"<example_rule_id>\"\n type = \"REGULAR\"\n action {\n type = \"BLOCK\"\n }\n }\n}\n```"
22
29
  },
23
30
  "Recommendation": {
24
- "Text": "Ensure that every AWS WAF Classic Global web ACL includes at least one rule or rule group to monitor and control web traffic effectively.",
25
- "Url": "https://docs.aws.amazon.com/waf/latest/developerguide/classic-web-acl-editing.html"
31
+ "Text": "Populate each global web ACL with effective protections:\n- Use rule groups and targeted rules (managed, rate-based, IP sets)\n- Apply least privilege: default `block` where feasible; explicitly `allow` required traffic\n- Layer defenses and enable logging to tune policies\n- *Consider migrating to WAFv2*",
32
+ "Url": "https://hub.prowler.com/check/waf_global_webacl_with_rules"
26
33
  }
27
34
  },
28
35
  "Categories": [],
@@ -1,28 +1,34 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "waf_regional_rule_with_conditions",
4
- "CheckTitle": "AWS WAF Classic Regional Rules Should Have at Least One Condition.",
4
+ "CheckTitle": "AWS WAF Classic Regional rule has at least one condition",
5
5
  "CheckType": [
6
+ "Software and Configuration Checks/AWS 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-regional:region:account-id:rule/rule-id",
11
+ "ResourceIdTemplate": "",
11
12
  "Severity": "medium",
12
13
  "ResourceType": "AwsWafRegionalRule",
13
- "Description": "Ensure that every AWS WAF Classic Regional Rule contains at least one condition.",
14
- "Risk": "An AWS WAF Classic Regional 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-regional-rule-not-empty.html",
14
+ "Description": "**AWS WAF Classic Regional rules** have one or more **conditions (predicates)** attached (IP, byte/regex, geo, size, SQLi/XSS) to define which requests the rule evaluates",
15
+ "Risk": "An empty rule never matches, letting traffic bypass that control. This weakens defense-in-depth and can impact **confidentiality** (data exfiltration), **integrity** (SQLi/XSS), and **availability** (missing rate/size limits), depending on Web ACL order and default action.",
16
+ "RelatedUrl": "",
17
+ "AdditionalURLs": [
18
+ "https://docs.aws.amazon.com/waf/latest/developerguide/classic-web-acl-rules-editing.html",
19
+ "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-2",
20
+ "https://docs.aws.amazon.com/config/latest/developerguide/waf-regional-rule-not-empty.html"
21
+ ],
16
22
  "Remediation": {
17
23
  "Code": {
18
- "CLI": "aws waf-regional 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-2",
21
- "Terraform": ""
24
+ "CLI": "aws waf-regional update-rule --rule-id <example_rule_id> --change-token $(aws waf-regional get-change-token --query ChangeToken --output text) --updates '[{\"Action\":\"INSERT\",\"Predicate\":{\"Negated\":false,\"Type\":\"IPMatch\",\"DataId\":\"<example_ipset_id>\"}}]'",
25
+ "NativeIaC": "```yaml\n# Add at least one condition to a WAF Classic Regional Rule\nResources:\n <example_resource_name>:\n Type: AWS::WAFRegional::Rule\n Properties:\n Name: <example_resource_name>\n MetricName: <example_metric_name>\n Predicates:\n - Negated: false # CRITICAL: ensures the predicate is applied as-is\n Type: IPMatch # CRITICAL: predicate type\n DataId: <example_ipset_id> # CRITICAL: attaches an existing IP set as a condition\n```",
26
+ "Other": "1. Open the AWS Console and go to AWS WAF, then select Switch to AWS WAF Classic\n2. In the left pane, choose Regional and click Rules\n3. Select the target rule and choose Add rule\n4. Click Add condition, set When a request to does, choose IP match (or another type), and select an existing condition (e.g., an IP set)\n5. Click Update to save the rule with the condition",
27
+ "Terraform": "```hcl\n# WAF Classic Regional rule with at least one condition\nresource \"aws_wafregional_rule\" \"<example_resource_name>\" {\n name = \"<example_resource_name>\"\n metric_name = \"<example_metric_name>\"\n\n predicate { \n data_id = \"<example_ipset_id>\" # CRITICAL: attaches existing IP set as the condition\n type = \"IPMatch\" # CRITICAL: predicate type\n negated = false # CRITICAL: apply condition directly\n }\n}\n```"
22
28
  },
23
29
  "Recommendation": {
24
- "Text": "Ensure that every AWS WAF Classic Regional 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"
30
+ "Text": "Define precise **conditions** for each rule (e.g., IP, pattern, geo, size) and avoid placeholder rules. Apply **least privilege** filtering, review rule order, and use layered controls for **defense in depth**. Regularly validate and monitor rule effectiveness.",
31
+ "Url": "https://hub.prowler.com/check/waf_regional_rule_with_conditions"
26
32
  }
27
33
  },
28
34
  "Categories": [],
@@ -1,28 +1,34 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "waf_regional_rulegroup_not_empty",
4
- "CheckTitle": "Check if AWS WAF Classic Regional rule group has at least one rule.",
4
+ "CheckTitle": "AWS WAF Classic Regional rule group has at least one rule",
5
5
  "CheckType": [
6
+ "Software and Configuration Checks/AWS 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:rulegroup/rule-group-name/rule-group-id",
11
+ "ResourceIdTemplate": "",
11
12
  "Severity": "medium",
12
13
  "ResourceType": "AwsWafRegionalRuleGroup",
13
- "Description": "Ensure that every AWS WAF Classic Regional rule group contains at least one rule.",
14
- "Risk": "A WAF Classic Regional 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 Regional rule groups** are evaluated to confirm they contain at least one **rule**. Groups with no rule entries are considered empty.",
15
+ "Risk": "An empty rule group contributes no filtering in a web ACL, letting requests bypass inspection within that group. This erodes **defense in depth** and can enable injection, brute-force, or bot traffic to reach applications, threatening **confidentiality**, **integrity**, and **availability**.",
16
+ "RelatedUrl": "",
17
+ "AdditionalURLs": [
18
+ "https://docs.aws.amazon.com/cli/latest/reference/waf-regional/update-rule-group.html",
19
+ "https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-groups.html",
20
+ "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-3"
21
+ ],
16
22
  "Remediation": {
17
23
  "Code": {
18
- "CLI": "aws waf-regional 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-3",
21
- "Terraform": ""
24
+ "CLI": "aws waf-regional 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>",
25
+ "NativeIaC": "```yaml\n# CloudFormation: Ensure WAF Classic Regional Rule Group has at least one rule\nResources:\n <example_resource_name>:\n Type: AWS::WAFRegional::RuleGroup\n Properties:\n Name: <example_resource_name>\n MetricName: <example_resource_name>\n ActivatedRules:\n - Priority: 1 # Critical: adds a rule so the rule group is not empty\n RuleId: <example_resource_id> # Critical: references an existing rule to include in the group\n Action:\n Type: BLOCK\n```",
26
+ "Other": "1. In the AWS Console, go to AWS WAF & Shield and switch to AWS WAF Classic\n2. Select the correct Region, then choose Rule groups\n3. Open the target rule group and click Edit rule group\n4. Click Add rule to rule group, select an existing rule, choose an action (e.g., BLOCK), and click Update\n5. Save changes to ensure the rule group contains at least one rule",
27
+ "Terraform": "```hcl\n# Ensure WAF Classic Regional Rule Group has at least one rule\nresource \"aws_wafregional_rule_group\" \"<example_resource_name>\" {\n name = \"<example_resource_name>\"\n metric_name = \"<example_resource_name>\"\n\n # Critical: adds a rule so the rule group is not empty\n activated_rule {\n priority = 1\n rule_id = \"<example_resource_id>\" # existing rule ID\n action {\n type = \"BLOCK\"\n }\n }\n}\n```"
22
28
  },
23
29
  "Recommendation": {
24
- "Text": "Ensure that every AWS WAF Classic Regional 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": "Apply **least privilege**: populate each rule group with vetted rules aligned to your threat model, using `ALLOW`, `BLOCK`, or `COUNT` actions as appropriate. Remove or disable unused groups to avoid false assurance. Validate behavior in staging and monitor metrics to maintain **defense in depth**.",
31
+ "Url": "https://hub.prowler.com/check/waf_regional_rulegroup_not_empty"
26
32
  }
27
33
  },
28
34
  "Categories": [],
@@ -1,28 +1,35 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "waf_regional_webacl_with_rules",
4
- "CheckTitle": "Check if AWS WAF Classic Regional WebACL has at least one rule or rule group.",
4
+ "CheckTitle": "AWS WAF Classic Regional Web ACL has at least one rule or rule group",
5
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",
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-regional:region:account-id:webacl/web-acl-id",
12
+ "ResourceIdTemplate": "",
11
13
  "Severity": "medium",
12
14
  "ResourceType": "AwsWafRegionalWebAcl",
13
- "Description": "Ensure that every AWS WAF Classic Regional WebACL contains at least one rule or rule group.",
14
- "Risk": "An empty AWS WAF Classic Regional web ACL allows all web traffic to bypass inspection, potentially exposing resources to unauthorized access and attacks.",
15
- "RelatedUrl": "https://docs.aws.amazon.com/waf/latest/developerguide/waf-rules.html",
15
+ "Description": "**AWS WAF Classic Regional web ACL** contains at least one **rule** or **rule group** to inspect and act on HTTP(S) requests. An ACL with no entries is considered empty.",
16
+ "Risk": "With no rules, the web ACL performs no inspection, letting malicious traffic through.\n- **Confidentiality**: data exposure via SQLi/XSS\n- **Integrity**: unauthorized actions or tampering\n- **Availability**: abuse/bot traffic causing degradation or denial",
17
+ "RelatedUrl": "",
18
+ "AdditionalURLs": [
19
+ "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-4",
20
+ "https://docs.aws.amazon.com/waf/latest/developerguide/classic-web-acl-editing.html",
21
+ "https://docs.aws.amazon.com/waf/latest/developerguide/waf-rules.html"
22
+ ],
16
23
  "Remediation": {
17
24
  "Code": {
18
- "CLI": "aws waf-regional update-web-acl --web-acl-id <your-web-acl-id> --change-token <your-change-token> --updates '[{\"Action\":\"INSERT\",\"ActivatedRule\":{\"Priority\":1,\"RuleId\":\"<your-rule-id>\",\"Action\":{\"Type\":\"BLOCK\"}}}]' --default-action Type=ALLOW --region <your-region>",
19
- "NativeIaC": "",
20
- "Other": "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-4",
21
- "Terraform": ""
25
+ "CLI": "aws waf-regional update-web-acl --web-acl-id <your-web-acl-id> --change-token $(aws waf-regional get-change-token --query 'ChangeToken' --output text) --updates '[{\"Action\":\"INSERT\",\"ActivatedRule\":{\"Priority\":1,\"RuleId\":\"<your-rule-id>\",\"Action\":{\"Type\":\"BLOCK\"}}}]'",
26
+ "NativeIaC": "```yaml\n# CloudFormation: Ensure the Web ACL has at least one rule\nResources:\n <example_resource_name>:\n Type: AWS::WAFRegional::WebACL\n Properties:\n Name: \"<example_resource_name>\"\n MetricName: \"<example_resource_name>\"\n DefaultAction:\n Type: ALLOW\n # Critical: adding any rule to the Web ACL makes it non-empty and passes the check\n Rules:\n - Action:\n Type: BLOCK\n Priority: 1\n RuleId: \"<example_resource_id>\" # Rule to insert into the Web ACL\n```",
27
+ "Other": "1. Open the AWS Console and go to AWS WAF\n2. In the left pane, click Web ACLs and switch to AWS WAF Classic if prompted\n3. Select the Regional Web ACL and open the Rules tab\n4. Click Edit web ACL\n5. In Rules, select an existing rule or rule group and choose Add rule to web ACL\n6. Click Save changes",
28
+ "Terraform": "```hcl\n# Terraform: Ensure the Web ACL has at least one rule\nresource \"aws_wafregional_web_acl\" \"<example_resource_name>\" {\n name = \"<example_resource_name>\"\n metric_name = \"<example_resource_name>\"\n\n default_action {\n type = \"ALLOW\"\n }\n\n # Critical: add at least one rule so the Web ACL is not empty\n rules {\n priority = 1\n rule_id = \"<example_resource_id>\"\n action {\n type = \"BLOCK\"\n }\n }\n}\n```"
22
29
  },
23
30
  "Recommendation": {
24
- "Text": "Ensure that every AWS WAF Classic Regional web ACL includes at least one rule or rule group to monitor and control web traffic effectively.",
25
- "Url": "https://docs.aws.amazon.com/waf/latest/developerguide/classic-web-acl-editing.html"
31
+ "Text": "Populate each web ACL with at least one **rule** or **rule group** that inspects requests and enforces **least privilege**. Apply defense in depth by combining managed and custom rules, include rate controls where appropriate, and review regularly. *Default to blocking undesired traffic; only permit required patterns*.",
32
+ "Url": "https://hub.prowler.com/check/waf_regional_webacl_with_rules"
26
33
  }
27
34
  },
28
35
  "Categories": [],
@@ -1,28 +1,35 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "wafv2_webacl_logging_enabled",
4
- "CheckTitle": "Check if AWS WAFv2 WebACL logging is enabled",
4
+ "CheckTitle": "AWS WAFv2 Web ACL has logging enabled",
5
5
  "CheckType": [
6
- "Logging and Monitoring"
6
+ "Software and Configuration Checks/AWS Security Best Practices",
7
+ "Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices"
7
8
  ],
8
9
  "ServiceName": "wafv2",
9
10
  "SubServiceName": "",
10
- "ResourceIdTemplate": "arn:partition:wafv2:region:account-id:webacl/webacl-id",
11
+ "ResourceIdTemplate": "",
11
12
  "Severity": "medium",
12
13
  "ResourceType": "AwsWafv2WebAcl",
13
- "Description": "Check if AWS WAFv2 logging is enabled",
14
- "Risk": "Enabling AWS WAFv2 logging helps monitor and analyze traffic patterns for enhanced security.",
15
- "RelatedUrl": "https://docs.aws.amazon.com/waf/latest/developerguide/logging.html",
14
+ "Description": "**AWS WAFv2 Web ACLs** with **logging** capture details of inspected requests and rule evaluations. The assessment determines for each Web ACL whether logging is configured to record traffic analyzed by that ACL.",
15
+ "Risk": "Without **WAF logging**, visibility into allowed/blocked requests is lost, degrading detection and response. **SQLi**, **credential stuffing**, and **bot/DDoS probes** can go unnoticed, risking data exposure (C), undetected rule misuse (I), and service instability from unseen abuse (A).",
16
+ "RelatedUrl": "",
17
+ "AdditionalURLs": [
18
+ "https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/WAF/enable-web-acls-logging.html",
19
+ "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-11",
20
+ "https://docs.aws.amazon.com/cli/latest/reference/wafv2/put-logging-configuration.html",
21
+ "https://docs.aws.amazon.com/waf/latest/developerguide/logging.html"
22
+ ],
16
23
  "Remediation": {
17
24
  "Code": {
18
- "CLI": "aws wafv2 update-web-acl-logging-configuration --scope REGIONAL --web-acl-arn arn:partition:wafv2:region:account-id:webacl/webacl-id --logging-configuration '{\"LogDestinationConfigs\": [\"arn:partition:logs:region:account-id:log-group:log-group-name\"]}'",
19
- "NativeIaC": "https://docs.prowler.com/checks/aws/logging-policies/bc_aws_logging_33#terraform",
20
- "Other": "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-11",
21
- "Terraform": "https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/WAF/enable-web-acls-logging.html"
25
+ "CLI": "aws wafv2 put-logging-configuration --logging-configuration ResourceArn=<WEB_ACL_ARN>,LogDestinationConfigs=<DESTINATION_ARN>",
26
+ "NativeIaC": "```yaml\n# CloudFormation: Enable logging for a WAFv2 Web ACL\nResources:\n <example_resource_name>:\n Type: AWS::WAFv2::LoggingConfiguration\n Properties:\n ResourceArn: arn:aws:wafv2:<region>:<account-id>:regional/webacl/<example_resource_name>/<example_resource_id> # CRITICAL: target Web ACL to log\n LogDestinationConfigs: # CRITICAL: where logs are sent\n - arn:aws:logs:<region>:<account-id>:log-group:aws-waf-logs-<example_resource_name>\n```",
27
+ "Other": "1. In the AWS Console, go to AWS WAF & Shield > Web ACLs\n2. Select the target Web ACL\n3. Open the Logging and metrics (or Logging) section and click Enable logging\n4. Choose a log destination (CloudWatch Logs log group, S3 bucket, or Kinesis Data Firehose)\n5. Click Save to enable logging",
28
+ "Terraform": "```hcl\n# Enable logging for a WAFv2 Web ACL\nresource \"aws_wafv2_web_acl_logging_configuration\" \"<example_resource_name>\" {\n resource_arn = \"<example_resource_arn>\" # CRITICAL: target Web ACL ARN\n log_destination_configs = [\"<example_destination_arn>\"] # CRITICAL: log destination ARN\n}\n```"
22
29
  },
23
30
  "Recommendation": {
24
- "Text": "Enable AWS WAFv2 logging for your Web ACLs to monitor and analyze traffic patterns effectively.",
25
- "Url": "https://docs.aws.amazon.com/waf/latest/developerguide/logging.html"
31
+ "Text": "Enable **logging** on all WAFv2 Web ACLs to a centralized destination. Apply **least privilege** for log delivery, **redact sensitive fields**, and filter to retain high-value events. Integrate with monitoring/SIEM for **alerting and correlation**, and review routinely as part of **defense in depth**.",
32
+ "Url": "https://hub.prowler.com/check/wafv2_webacl_logging_enabled"
26
33
  }
27
34
  },
28
35
  "Categories": [
@@ -1,28 +1,35 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "wafv2_webacl_rule_logging_enabled",
4
- "CheckTitle": "Check if AWS WAFv2 WebACL rule or rule group has Amazon CloudWatch metrics enabled.",
4
+ "CheckTitle": "AWS WAFv2 Web ACL has Amazon CloudWatch metrics enabled for all rules and rule groups",
5
5
  "CheckType": [
6
+ "Software and Configuration Checks/AWS Security Best Practices/Runtime Behavior Analysis",
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": "wafv2",
9
11
  "SubServiceName": "",
10
- "ResourceIdTemplate": "arn:partition:wafv2:region:account-id:webacl/webacl-id",
12
+ "ResourceIdTemplate": "",
11
13
  "Severity": "medium",
12
- "ResourceType": "AwsWafv2RuleGroup",
13
- "Description": "This control checks whether an AWS WAF rule or rule group has Amazon CloudWatch metrics enabled. The control fails if the rule or rule group doesn't have CloudWatch metrics enabled.",
14
- "Risk": "Without CloudWatch Metrics enabled on AWS WAF rules or rule groups, it's challenging to monitor traffic flow effectively. This reduces visibility into potential security threats, such as malicious activities or unusual traffic patterns.",
15
- "RelatedUrl": "https://docs.aws.amazon.com/waf/latest/APIReference/API_UpdateRuleGroup.html",
14
+ "ResourceType": "AwsWafv2WebAcl",
15
+ "Description": "**AWS WAFv2 Web ACLs** are assessed to confirm that every associated **rule** and **rule group** has **CloudWatch metrics** enabled for visibility into rule evaluations and traffic",
16
+ "Risk": "Absent **CloudWatch metrics**, WAF telemetry is lost, masking spikes, rule bypasses, and misconfigurations. This delays detection of SQLi/XSS probes and bot floods, risking data confidentiality, request integrity, and application availability.",
17
+ "RelatedUrl": "",
18
+ "AdditionalURLs": [
19
+ "https://support.icompaas.com/support/solutions/articles/62000233644-ensure-aws-wafv2-webacl-rule-or-rule-group-has-amazon-cloudwatch-metrics-enabled",
20
+ "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html",
21
+ "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-12"
22
+ ],
16
23
  "Remediation": {
17
24
  "Code": {
18
- "CLI": "aws wafv2 update-rule-group --id <rule-group-id> --scope <scope> --name <rule-group-name> --cloudwatch-metrics-enabled true",
19
- "NativeIaC": "",
20
- "Other": "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-12",
21
- "Terraform": ""
25
+ "CLI": "",
26
+ "NativeIaC": "```yaml\n# CloudFormation: Enable CloudWatch metrics on WAFv2 Web ACL rules\nResources:\n <example_resource_name>:\n Type: AWS::WAFv2::WebACL\n Properties:\n Name: <example_resource_name>\n Scope: REGIONAL\n DefaultAction:\n Allow: {}\n VisibilityConfig:\n SampledRequestsEnabled: true\n CloudWatchMetricsEnabled: true\n MetricName: <metric_name>\n Rules:\n - Name: <example_rule_name>\n Priority: 1\n Statement:\n ManagedRuleGroupStatement:\n VendorName: AWS\n Name: AWSManagedRulesCommonRuleSet\n OverrideAction:\n None: {}\n VisibilityConfig:\n SampledRequestsEnabled: true\n CloudWatchMetricsEnabled: true # Critical: enables CloudWatch metrics for this rule\n MetricName: <rule_metric_name> # Required with CloudWatch metrics\n```",
27
+ "Other": "1. In AWS Console, go to AWS WAF & Shield > Web ACLs, select the Web ACL\n2. Open the Rules tab, edit each rule, and enable CloudWatch metrics (Visibility configuration > CloudWatch metrics enabled), then Save\n3. For rule groups: go to AWS WAF & Shield > Rule groups, select the rule group, edit Visibility configuration, enable CloudWatch metrics, then Save",
28
+ "Terraform": "```hcl\n# Terraform: Enable CloudWatch metrics on WAFv2 Web ACL rules\nresource \"aws_wafv2_web_acl\" \"<example_resource_name>\" {\n name = \"<example_resource_name>\"\n scope = \"REGIONAL\"\n\n default_action { allow {} }\n\n visibility_config {\n cloudwatch_metrics_enabled = true\n metric_name = \"<metric_name>\"\n sampled_requests_enabled = true\n }\n\n rule {\n name = \"<example_rule_name>\"\n priority = 1\n\n statement {\n managed_rule_group_statement {\n vendor_name = \"AWS\"\n name = \"AWSManagedRulesCommonRuleSet\"\n }\n }\n\n override_action { none {} }\n\n visibility_config {\n cloudwatch_metrics_enabled = true # Critical: enables CloudWatch metrics for this rule\n metric_name = \"<rule_metric_name>\" # Required with CloudWatch metrics\n sampled_requests_enabled = true\n }\n }\n}\n```"
22
29
  },
23
30
  "Recommendation": {
24
- "Text": "Ensure that CloudWatch Metrics are enabled for AWS WAF rules and rule groups. This provides detailed insights into traffic, enabling timely identification of security risks.",
25
- "Url": "https://docs.aws.amazon.com/waf/latest/APIReference/API_UpdateWebACL.html"
31
+ "Text": "Enable **CloudWatch metrics** for all WAF rules and rule groups (*including managed rule groups*). Use consistent metric names, centralize dashboards and alerts, and review trends to validate rule efficacy. Integrate with a SIEM for **defense in depth** and tune rules based on telemetry.",
32
+ "Url": "https://hub.prowler.com/check/wafv2_webacl_rule_logging_enabled"
26
33
  }
27
34
  },
28
35
  "Categories": [
@@ -1,31 +1,40 @@
1
1
  {
2
2
  "Provider": "aws",
3
3
  "CheckID": "wafv2_webacl_with_rules",
4
- "CheckTitle": "Check if AWS WAFv2 WebACL has at least one rule or rule group.",
4
+ "CheckTitle": "AWS WAFv2 Web ACL has at least one rule or rule group attached",
5
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",
6
8
  "Software and Configuration Checks/Industry and Regulatory Standards/NIST 800-53 Controls"
7
9
  ],
8
10
  "ServiceName": "wafv2",
9
11
  "SubServiceName": "",
10
- "ResourceIdTemplate": "arn:partition:wafv2:region:account-id:webacl/webacl-id",
11
- "Severity": "medium",
12
+ "ResourceIdTemplate": "",
13
+ "Severity": "high",
12
14
  "ResourceType": "AwsWafv2WebAcl",
13
- "Description": "Check if AWS WAFv2 WebACL has at least one rule or rule group associated with it.",
14
- "Risk": "An empty AWS WAF web ACL allows all web traffic to pass without inspection or control, exposing resources to potential security threats and attacks.",
15
- "RelatedUrl": "https://docs.aws.amazon.com/waf/latest/APIReference/API_Rule.html",
15
+ "Description": "**AWS WAFv2 web ACLs** are evaluated for the presence of at least one configured **rule** or **rule group** that defines how HTTP(S) requests are inspected and acted upon.",
16
+ "Risk": "Without rules, traffic is governed only by the web ACL `DefaultAction`, often allowing requests without inspection. This increases risks to **confidentiality** (data exfiltration via injection), **integrity** (XSS/parameter tampering), and **availability** (layer-7 DDoS, bot abuse).",
17
+ "RelatedUrl": "",
18
+ "AdditionalURLs": [
19
+ "https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-editing.html",
20
+ "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-10",
21
+ "https://support.icompaas.com/support/solutions/articles/62000233642-ensure-aws-wafv2-webacl-has-at-least-one-rule-or-rule-group"
22
+ ],
16
23
  "Remediation": {
17
24
  "Code": {
18
- "CLI": "aws wafv2 update-web-acl --id <web-acl-id> --scope <scope> --default-action <default-action> --rules <rules>",
19
- "NativeIaC": "https://docs.prowler.com/checks/aws/networking-policies/bc_aws_networking_64/",
20
- "Other": "https://docs.aws.amazon.com/securityhub/latest/userguide/waf-controls.html#waf-10",
21
- "Terraform": ""
25
+ "CLI": "",
26
+ "NativeIaC": "```yaml\n# CloudFormation: Add at least one rule to the WAFv2 WebACL\nResources:\n <example_resource_name>:\n Type: AWS::WAFv2::WebACL\n Properties:\n Scope: REGIONAL\n DefaultAction:\n Allow: {}\n VisibilityConfig:\n SampledRequestsEnabled: true\n CloudWatchMetricsEnabled: true\n MetricName: <example_resource_name>\n Rules: # CRITICAL: Adding any rule/rule group here fixes the finding by making the Web ACL non-empty\n - Name: <example_rule_name>\n Priority: 0\n Statement:\n ManagedRuleGroupStatement:\n VendorName: AWS\n Name: AWSManagedRulesCommonRuleSet # Uses an AWS managed rule group\n OverrideAction:\n Count: {} # Non-blocking to minimize impact\n VisibilityConfig:\n SampledRequestsEnabled: true\n CloudWatchMetricsEnabled: true\n MetricName: <example_rule_name>\n```",
27
+ "Other": "1. In the AWS Console, go to AWS WAF\n2. Open Web ACLs and select the failing Web ACL\n3. Go to the Rules tab and click Add rules\n4. Choose Add managed rule group, select AWS > AWSManagedRulesCommonRuleSet\n5. Set action to Count (to avoid blocking), then Add rule and Save\n6. Verify the Web ACL now shows at least one rule",
28
+ "Terraform": "```hcl\n# Terraform: Ensure the WAFv2 Web ACL has at least one rule\nresource \"aws_wafv2_web_acl\" \"<example_resource_name>\" {\n name = \"<example_resource_name>\"\n scope = \"REGIONAL\"\n\n default_action {\n allow {}\n }\n\n visibility_config {\n cloudwatch_metrics_enabled = true\n metric_name = \"<example_resource_name>\"\n sampled_requests_enabled = true\n }\n\n rule { # CRITICAL: Presence of this rule makes the Web ACL non-empty and passes the check\n name = \"<example_rule_name>\"\n priority = 0\n statement {\n managed_rule_group_statement {\n name = \"AWSManagedRulesCommonRuleSet\"\n vendor_name = \"AWS\" # Minimal managed rule group\n }\n }\n override_action { count {} } # Non-blocking\n visibility_config {\n cloudwatch_metrics_enabled = true\n metric_name = \"<example_rule_name>\"\n sampled_requests_enabled = true\n }\n }\n}\n```"
22
29
  },
23
30
  "Recommendation": {
24
- "Text": "Ensure that each AWS WAF web ACL contains at least one rule or rule group to effectively manage and inspect incoming HTTP(S) web requests.",
25
- "Url": "https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-editing.html"
31
+ "Text": "Populate each web ACL with targeted rules or managed rule groups to enforce least-privilege web access: cover common exploits (SQLi/XSS), IP reputation, and rate limits, scoped to your apps. Use a conservative `DefaultAction`, monitor metrics/logs, and continually tune-supporting **defense in depth** and **zero trust**.",
32
+ "Url": "https://hub.prowler.com/check/wafv2_webacl_with_rules"
26
33
  }
27
34
  },
28
- "Categories": [],
35
+ "Categories": [
36
+ "internet-exposed"
37
+ ],
29
38
  "DependsOn": [],
30
39
  "RelatedTo": [],
31
40
  "Notes": ""
@@ -77,7 +77,7 @@ class CloudStorage(GCPService):
77
77
  Bucket(
78
78
  name=bucket["name"],
79
79
  id=bucket["id"],
80
- region=bucket["location"],
80
+ region=bucket["location"].lower(),
81
81
  uniform_bucket_level_access=bucket["iamConfiguration"][
82
82
  "uniformBucketLevelAccess"
83
83
  ]["enabled"],
@@ -35,9 +35,9 @@ def init_parser(self):
35
35
  "--scanner",
36
36
  dest="scanners",
37
37
  nargs="+",
38
- default=["vuln", "misconfig", "secret"],
38
+ default=["misconfig", "secret"],
39
39
  choices=SCANNERS_CHOICES,
40
- help="Comma-separated list of scanners to scan. Default: vuln, misconfig, secret",
40
+ help="Comma-separated list of scanners to scan. Default: misconfig, secret",
41
41
  )
42
42
  iac_scan_subparser.add_argument(
43
43
  "--exclude-path",
@@ -17,6 +17,28 @@ class Clusters(MongoDBAtlasService):
17
17
  super().__init__(__class__.__name__, provider)
18
18
  self.clusters = self._list_clusters()
19
19
 
20
+ def _extract_location(self, cluster_data: dict) -> str:
21
+ """
22
+ Extract location from cluster data and convert to lowercase
23
+
24
+ Args:
25
+ cluster_data: Cluster data from API
26
+
27
+ Returns:
28
+ str: Location in lowercase, empty string if not found
29
+ """
30
+ try:
31
+ replication_specs = cluster_data.get("replicationSpecs", [])
32
+ if replication_specs and len(replication_specs) > 0:
33
+ region_configs = replication_specs[0].get("regionConfigs", [])
34
+ if region_configs and len(region_configs) > 0:
35
+ region_name = region_configs[0].get("regionName", "")
36
+ if region_name:
37
+ return region_name.lower()
38
+ except (KeyError, IndexError, AttributeError):
39
+ pass
40
+ return ""
41
+
20
42
  def _list_clusters(self):
21
43
  """
22
44
  List all MongoDB Atlas clusters across all projects
@@ -89,9 +111,7 @@ class Clusters(MongoDBAtlasService):
89
111
  "connectionStrings", {}
90
112
  ),
91
113
  tags=cluster_data.get("tags", []),
92
- location=cluster_data.get("replicationSpecs", {})[0]
93
- .get("regionConfigs", {})[0]
94
- .get("regionName", ""),
114
+ location=self._extract_location(cluster_data),
95
115
  )
96
116
 
97
117
  # Use a unique key combining project_id and cluster_name
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: prowler-cloud
3
- Version: 5.15.1
3
+ Version: 5.16.1
4
4
  Summary: Prowler is an Open Source security tool to perform AWS, GCP and Azure security best practices assessments, audits, incident response, continuous monitoring, hardening and forensics readiness. It contains hundreds of controls covering CIS, NIST 800, NIST CSF, CISA, RBI, FedRAMP, PCI-DSS, GDPR, HIPAA, FFIEC, SOC2, GXP, AWS Well-Architected Framework Security Pillar, AWS Foundational Technical Review (FTR), ENS (Spanish National Security Scheme) and your custom security frameworks.
5
5
  License: Apache-2.0
6
6
  Author: Toni de la Fuente
@@ -114,6 +114,7 @@ Description-Content-Type: text/markdown
114
114
  <a href="https://hub.docker.com/r/toniblyx/prowler"><img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/toniblyx/prowler"></a>
115
115
  <a href="https://gallery.ecr.aws/prowler-cloud/prowler"><img width="120" height=19" alt="AWS ECR Gallery" src="https://user-images.githubusercontent.com/3985464/151531396-b6535a68-c907-44eb-95a1-a09508178616.png"></a>
116
116
  <a href="https://codecov.io/gh/prowler-cloud/prowler"><img src="https://codecov.io/gh/prowler-cloud/prowler/graph/badge.svg?token=OflBGsdpDl"/></a>
117
+ <a href="https://insights.linuxfoundation.org/project/prowler-cloud-prowler"><img src="https://insights.linuxfoundation.org/api/badge/health-score?project=prowler-cloud-prowler"/></a>
117
118
  </p>
118
119
  <p align="center">
119
120
  <a href="https://github.com/prowler-cloud/prowler/releases"><img alt="Version" src="https://img.shields.io/github/v/release/prowler-cloud/prowler"></a>
@@ -367,11 +368,12 @@ python prowler-cli.py -v
367
368
  # ✏️ High level architecture
368
369
 
369
370
  ## Prowler App
370
- **Prowler App** is composed of three key components:
371
+ **Prowler App** is composed of four key components:
371
372
 
372
373
  - **Prowler UI**: A web-based interface, built with Next.js, providing a user-friendly experience for executing Prowler scans and visualizing results.
373
374
  - **Prowler API**: A backend service, developed with Django REST Framework, responsible for running Prowler scans and storing the generated results.
374
375
  - **Prowler SDK**: A Python SDK designed to extend the functionality of the Prowler CLI for advanced capabilities.
376
+ - **Prowler MCP Server**: A Model Context Protocol server that provides AI tools for Lighthouse, the AI-powered security assistant. This is a critical dependency for Lighthouse functionality.
375
377
 
376
378
  ![Prowler App Architecture](docs/products/img/prowler-app-architecture.png)
377
379