← Провайдер Cloudflare Terraform / terraform / additional-configurations
Настройка пользовательских правил WAF с помощью Terraform
На этой странице приведены примеры создания Пользовательские правила WAF в зоне или аккаунте с помощью Terraform. Примеры охватывают следующие сценарии:
- Добавление пользовательского правила в зону
- Создание и развёртывание пользовательского набора правил
В документации WAF есть дополнительные примеры Terraform, см. Дополнительные ресурсы.
Если вы используете Cloudflare API, см. следующие ресурсы в документации по WAF:
Дополнительную информацию о развёртывании и настройке пользовательских наборов правил с помощью Rulesets API см. в Работа с пользовательскими наборами правил в документации по Ruleset Engine.
Прежде чем начать
Получите нужные идентификаторы аккаунта или зоны
Для конфигураций Terraform, приведённых на этой странице, требуется идентификатор зоны (или идентификатор аккаунта), в которой вы будете развёртывать наборы правил.
- Чтобы получить список аккаунтов, к которым у вас есть доступ, включая их идентификаторы, используйте Выведите список аккаунтов операцию.
- Чтобы получить список зон, к которым у вас есть доступ, включая их идентификаторы, используйте Выведите список зон операцию.
Импорт или удаление существующих наборов правил
Terraform исходит из того, что полностью контролирует наборы правил аккаунта и зоны. Если у вас уже настроены наборы правил в аккаунте или зоне, выполните одно из следующих действий:
- Импорт существующих наборов правил в Terraform с помощью
cf-terraformingинструмента. Его последние версии умеют генерировать определения ресурсов для существующих наборов правил и импортировать их конфигурацию в состояние Terraform. - Начните с нуля, выполнив удаление существующих наборов правил (наборы правил уровня аккаунта и зоны с
"kind": "root"и"kind": "zone", соответственно), а затем задать конфигурацию наборов правил в Terraform.
Добавление пользовательского правила в зону
В следующем примере настраивается пользовательское правило во входном наборе правил зоны для http_request_firewall_custom фаза для зоны с ID <ZONE_ID>. Это правило заблокирует весь трафик на нестандартных портах HTTP(S):
Необходимые разрешения API-токена
Хотя бы одно из следующих права доступа токена требуется:
Zone WAF Write
Настройте cloudflare_ruleset ↗ ресурс:
resource "cloudflare_ruleset" "zone_custom_firewall" {
zone_id = var.cloudflare_zone_id
name = "Phase entry point ruleset for custom rules in my zone"
description = ""
kind = "zone"
phase = "http_request_firewall_custom"
rules = [{
ref = "block_non_default_ports"
description = "Block ports other than 80 and 443"
expression = "(not cf.edge.server_port in {80 443})"
action = "block"
}]
}resource "cloudflare_ruleset" "zone_custom_firewall" {
zone_id = "<ZONE_ID>"
name = "Phase entry point ruleset for custom rules in my zone"
description = ""
kind = "zone"
phase = "http_request_firewall_custom"
rules {
ref = "block_non_default_ports"
description = "Block ports other than 80 and 443"
expression = "(not cf.edge.server_port in {80 443})"
action = "block"
}
}Чтобы создать ещё одно пользовательское правило, добавьте новый rules объект в тот же cloudflare_ruleset ресурс.
Создание и развёртывание пользовательского набора правил
В следующем примере создаётся пользовательский набор правил в аккаунте с ID <ACCOUNT_ID> содержащий одно пользовательское правило. Затем этот пользовательский набор правил разворачивается с помощью отдельного cloudflare_ruleset ресурс Terraform. Если вы не развернёте пользовательский набор правил, он не будет выполнен.
Следующая конфигурация создаёт пользовательский набор правил с одним правилом:
Необходимые разрешения API-токена
Все перечисленные ниже права доступа токена обязательны:
Account WAF WriteAccount Rulesets Write
Настройте cloudflare_ruleset ↗ ресурс:
resource "cloudflare_ruleset" "account_firewall_custom_ruleset" {
account_id = var.cloudflare_account_id
name = "Custom ruleset blocking traffic in non-standard HTTP(S) ports"
description = ""
kind = "custom"
phase = "http_request_firewall_custom"
rules = [{
ref = "block_non_default_ports"
description = "Block ports other than 80 and 443"
expression = "(not cf.edge.server_port in {80 443})"
action = "block"
}]
}resource "cloudflare_ruleset" "account_firewall_custom_ruleset" {
account_id = "<ACCOUNT_ID>"
name = "Custom ruleset blocking traffic in non-standard HTTP(S) ports"
description = ""
kind = "custom"
phase = "http_request_firewall_custom"
rules {
ref = "block_non_default_ports"
description = "Block ports other than 80 and 443"
expression = "(not cf.edge.server_port in {80 443})"
action = "block"
}
}Чтобы создать ещё одно пользовательское правило в пользовательском наборе правил, добавьте новый rules объект в тот же cloudflare_ruleset ресурс.
Следующая конфигурация развёртывает пользовательский набор правил на уровне аккаунта. Она определяет зависимость от account_firewall_custom_ruleset ресурс и использует ID созданного пользовательского набора правил в action_parameters:
Необходимые разрешения API-токена
Все перечисленные ниже права доступа токена обязательны:
Account WAF WriteAccount Rulesets Write
Настройте cloudflare_ruleset ↗ ресурс:
resource "cloudflare_ruleset" "account_firewall_custom_entrypoint" {
account_id = var.cloudflare_account_id
name = "Account-level entry point ruleset for the http_request_firewall_custom phase deploying a custom ruleset"
description = ""
kind = "root"
phase = "http_request_firewall_custom"
depends_on = [cloudflare_ruleset.account_firewall_custom_ruleset]
rules = [{
ref = "deploy_custom_ruleset_example_com"
description = "Deploy custom ruleset for example.com"
expression = "(cf.zone.name eq \"example.com\") and (cf.zone.plan eq \"ENT\")"
action = "execute"
action_parameters = {
id = cloudflare_ruleset.account_firewall_custom_ruleset.id
}
}]
}resource "cloudflare_ruleset" "account_firewall_custom_entrypoint" {
account_id = "<ACCOUNT_ID>"
name = "Account-level entry point ruleset for the http_request_firewall_custom phase deploying a custom ruleset"
description = ""
kind = "root"
phase = "http_request_firewall_custom"
depends_on = [cloudflare_ruleset.account_firewall_custom_ruleset]
rules {
ref = "deploy_custom_ruleset_example_com"
description = "Deploy custom ruleset for example.com"
expression = "(cf.zone.name eq \"example.com\") and (cf.zone.plan eq \"ENT\")"
action = "execute"
action_parameters {
id = cloudflare_ruleset.account_firewall_custom_ruleset.id
}
}
}Дополнительную информацию о настройке и развёртывании пользовательских наборов правил см. в Работа с пользовательскими наборами правил в документации по Ruleset Engine.