Skip to content

Commit ac31b33

Browse files
authored
[WAF] Add Terraform v5 examples (#30591)
* Leaked creds: Add TF v5 example * Content scanning: Add TF v5 example * Cloudflare Managed Ruleset: Add TF v5 example
1 parent 48349f4 commit ac31b33

7 files changed

Lines changed: 127 additions & 13 deletions

File tree

src/content/docs/waf/detections/leaked-credentials/terraform-examples.mdx

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ tags:
1414
- Terraform
1515
---
1616

17-
import { Render } from "~/components";
17+
import { Details, Render, Tabs, TabItem } from "~/components";
1818

1919
The following Terraform configuration examples address common scenarios for managing, configuring, and using leaked credentials detection.
2020

@@ -41,11 +41,42 @@ This example adds a [custom rule](/waf/custom-rules/) that challenges requests w
4141

4242
To use the [`cf.waf.credential_check.username_and_password_leaked`](/ruleset-engine/rules-language/fields/reference/cf.waf.credential_check.username_and_password_leaked/) field you must [enable leaked credentials detection](#enable-leaked-credentials-detection).
4343

44-
<Render file="v4-code-snippets" product="terraform" />
44+
<Tabs syncKey="terraformVersion">
45+
<TabItem label="Terraform (v5)">
46+
47+
<Details header="Required API token permissions">
48+
49+
At least one of the following [token permissions](/fundamentals/api/reference/permissions/) is required:
50+
51+
- `Zone WAF Write`
52+
53+
</Details>
54+
55+
Configure the [`cloudflare_ruleset`](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/ruleset) resource:
4556

4657
```tf
4758
resource "cloudflare_ruleset" "zone_custom_firewall_leaked_creds" {
48-
zone_id = "<ZONE_ID>"
59+
zone_id = var.cloudflare_zone_id
60+
name = "Phase entry point ruleset for custom rules in my zone"
61+
description = ""
62+
kind = "zone"
63+
phase = "http_request_firewall_custom"
64+
65+
rules = [{
66+
ref = "challenge_leaked_username_password"
67+
description = "Challenge requests with a leaked username and password"
68+
expression = "(cf.waf.credential_check.username_and_password_leaked)"
69+
action = "managed_challenge"
70+
}]
71+
}
72+
```
73+
74+
</TabItem>
75+
<TabItem label="Terraform (v4)">
76+
77+
```tf
78+
resource "cloudflare_ruleset" "zone_custom_firewall_leaked_creds" {
79+
zone_id = var.cloudflare_zone_id
4980
name = "Phase entry point ruleset for custom rules in my zone"
5081
description = ""
5182
kind = "zone"
@@ -60,6 +91,9 @@ resource "cloudflare_ruleset" "zone_custom_firewall_leaked_creds" {
6091
}
6192
```
6293

94+
</TabItem>
95+
</Tabs>
96+
6397
## More resources
6498

6599
For additional Terraform configuration examples, refer to [WAF custom rules configuration using Terraform](/terraform/additional-configurations/waf-custom-rules/).

src/content/docs/waf/detections/malicious-uploads/terraform-examples.mdx

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ tags:
1414
- Terraform
1515
---
1616

17-
import { Render, GlossaryTooltip } from "~/components";
17+
import { Details, GlossaryTooltip, Render, Tabs, TabItem } from "~/components";
1818

1919
The following Terraform configuration examples address common scenarios for managing, configuring, and using WAF content scanning.
2020

@@ -41,11 +41,42 @@ This example adds a [custom rule](/waf/custom-rules/) that blocks requests with
4141

4242
To use the [`cf.waf.content_scan.has_malicious_obj`](/ruleset-engine/rules-language/fields/reference/cf.waf.content_scan.has_malicious_obj/) field you must [enable content scanning](#enable-waf-content-scanning).
4343

44-
<Render file="v4-code-snippets" product="terraform" />
44+
<Tabs syncKey="terraformVersion">
45+
<TabItem label="Terraform (v5)">
46+
47+
<Details header="Required API token permissions">
48+
49+
At least one of the following [token permissions](/fundamentals/api/reference/permissions/) is required:
50+
51+
- `Zone WAF Write`
52+
53+
</Details>
54+
55+
Configure the [`cloudflare_ruleset`](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/ruleset) resource:
4556

4657
```tf
4758
resource "cloudflare_ruleset" "zone_custom_firewall_malicious_uploads" {
48-
zone_id = "<ZONE_ID>"
59+
zone_id = var.cloudflare_zone_id
60+
name = "Phase entry point ruleset for custom rules in my zone"
61+
description = ""
62+
kind = "zone"
63+
phase = "http_request_firewall_custom"
64+
65+
rules = [{
66+
ref = "block_malicious_uploads"
67+
description = "Block requests uploading malicious content objects"
68+
expression = "(cf.waf.content_scan.has_malicious_obj and http.request.uri.path eq \"/upload.php\")"
69+
action = "block"
70+
}]
71+
}
72+
```
73+
74+
</TabItem>
75+
<TabItem label="Terraform (v4)">
76+
77+
```tf
78+
resource "cloudflare_ruleset" "zone_custom_firewall_malicious_uploads" {
79+
zone_id = var.cloudflare_zone_id
4980
name = "Phase entry point ruleset for custom rules in my zone"
5081
description = ""
5182
kind = "zone"
@@ -60,6 +91,9 @@ resource "cloudflare_ruleset" "zone_custom_firewall_malicious_uploads" {
6091
}
6192
```
6293

94+
</TabItem>
95+
</Tabs>
96+
6397
## More resources
6498

6599
For additional Terraform configuration examples, refer to [WAF custom rules configuration using Terraform](/terraform/additional-configurations/waf-custom-rules/).

src/content/docs/waf/managed-rules/reference/cloudflare-managed-ruleset.mdx

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ sidebar:
88
order: 2
99
---
1010

11-
import { Render, Tabs, TabItem, Markdown } from "~/components";
11+
import { Details, Markdown, Render, Tabs, TabItem } from "~/components";
1212

1313
export const availableActions =
1414
"The available actions are: _Block_, _Log_, _Non-Interactive Challenge_, _Managed Challenge_, and _Interactive Challenge_.";
@@ -167,12 +167,55 @@ To deploy the Cloudflare Managed Ruleset for a given zone via API, create a rule
167167

168168
The following example deploys the Cloudflare Managed Ruleset for a zone and overrides the action and status of a specific rule.
169169

170-
<Render file="v4-code-snippets" product="terraform" />
170+
<Tabs syncKey="terraformVersion">
171+
<TabItem label="Terraform (v5)">
172+
173+
<Details header="Required API token permissions">
174+
175+
At least one of the following [token permissions](/fundamentals/api/reference/permissions/) is required:
176+
177+
- `Zone WAF Write`
178+
179+
</Details>
180+
181+
Configure the [`cloudflare_ruleset`](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/ruleset) resource:
171182

172183
```tf
173184
# Configure a ruleset at the zone level for the "http_request_firewall_managed" phase
174185
resource "cloudflare_ruleset" "zone_level_managed_waf" {
175-
zone_id = "<ZONE_ID>"
186+
zone_id = var.cloudflare_zone_id
187+
name = "Managed WAF entry point ruleset"
188+
description = "Zone-level WAF Managed Rules config"
189+
kind = "zone"
190+
phase = "http_request_firewall_managed"
191+
192+
# Execute Cloudflare Managed Ruleset
193+
rules = [{
194+
ref = "execute_cloudflare_managed_ruleset"
195+
description = "Execute Cloudflare Managed Ruleset on my zone-level phase entry point ruleset"
196+
expression = "true"
197+
action = "execute"
198+
action_parameters = {
199+
id = "efb7b8c949ac4650a09736fc376e9aee"
200+
overrides = {
201+
rules = [{
202+
id = "5de7edfa648c4d6891dc3e7f84534ffa"
203+
action = "log"
204+
enabled = true
205+
}]
206+
}
207+
}
208+
}]
209+
}
210+
```
211+
212+
</TabItem>
213+
<TabItem label="Terraform (v4)">
214+
215+
```tf
216+
# Configure a ruleset at the zone level for the "http_request_firewall_managed" phase
217+
resource "cloudflare_ruleset" "zone_level_managed_waf" {
218+
zone_id = var.cloudflare_zone_id
176219
name = "Managed WAF entry point ruleset"
177220
description = "Zone-level WAF Managed Rules config"
178221
kind = "zone"
@@ -198,4 +241,7 @@ resource "cloudflare_ruleset" "zone_level_managed_waf" {
198241
}
199242
```
200243

244+
</TabItem>
245+
</Tabs>
246+
201247
For more information, refer to [WAF Managed Rules configuration using Terraform](/terraform/additional-configurations/waf-managed-rulesets/).

src/content/partials/waf/detections/leaked-credentials-configure-location-terraform.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Use the `cloudflare_leaked_credential_check_rule` resource to add a custom detec
66

77
```terraform
88
resource "cloudflare_leaked_credential_check_rule" "custom_location_example" {
9-
zone_id = "<ZONE_ID>"
9+
zone_id = var.cloudflare_zone_id
1010
username = "lookup_json_string(http.request.body.raw, \"user\")"
1111
password = "lookup_json_string(http.request.body.raw, \"secret\")"
1212
}

src/content/partials/waf/detections/leaked-credentials-enable-terraform.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Use the `cloudflare_leaked_credential_check` resource to enable leaked credentia
66

77
```terraform
88
resource "cloudflare_leaked_credential_check" "zone_lcc_example" {
9-
zone_id = "<ZONE_ID>"
9+
zone_id = var.cloudflare_zone_id
1010
enabled = true
1111
}
1212
```

src/content/partials/waf/detections/malicious-uploads-configure-expression-terraform.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Use the `cloudflare_content_scanning_expression` resource to add a custom scan e
66

77
```terraform
88
resource "cloudflare_content_scanning_expression" "my_custom_scan_expression" {
9-
zone_id = <ZONE_ID>
9+
zone_id = var.cloudflare_zone_id
1010
payload = "lookup_json_string(http.request.body.raw, \"file\")"
1111
}
1212
```

src/content/partials/waf/detections/malicious-uploads-enable-terraform.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Use the `cloudflare_content_scanning` resource to enable content scanning for a
66

77
```terraform
88
resource "cloudflare_content_scanning" "zone_content_scanning_example" {
9-
zone_id = "<ZONE_ID>"
9+
zone_id = var.cloudflare_zone_id
1010
enabled = true
1111
}
1212
```

0 commit comments

Comments
 (0)