← Провайдер Cloudflare Terraform / terraform / additional-configurations
Настройка WAF Managed Rules с помощью Terraform
На этой странице приведены примеры развёртывания и настройки WAF Managed Rules в вашей зоне или аккаунте с помощью Terraform. Здесь рассматриваются следующие конфигурации:
- Развёртывание управляемых наборов правил на уровне зоны
- Развёртывание управляемых наборов правил на уровне аккаунта
- Настройка исключений
- Настройка протоколирования полезной нагрузки
- Настройка переопределений
- Настройка уровня паранойи OWASP, порогового значения и действия
Если вы используете Cloudflare API, см. следующие ресурсы:
- Развёртывание управляемого набора правил WAF через API
- Развёртывание управляемого набора правил WAF через API (аккаунт)
Дополнительную информацию о развёртывании и настройке управляемых наборов правил с помощью Rulesets API см. в Работа с управляемыми наборами правил в документации по Ruleset Engine.
Прежде чем начать
Получите нужные идентификаторы аккаунта, зоны и управляемого набора правил
Для конфигураций Terraform, приведённых на этой странице, требуется идентификатор зоны (или идентификатор аккаунта), в которой вы будете развёртывать управляемые наборы правил.
- Чтобы получить список аккаунтов, к которым у вас есть доступ, включая их идентификаторы, используйте Выведите список аккаунтов операцию.
- Чтобы получить список зон, к которым у вас есть доступ, включая их идентификаторы, используйте Выведите список зон операцию.
Для развёртывания управляемых наборов правил через Terraform необходимо использовать идентификаторы наборов правил. Чтобы найти идентификаторы управляемых наборов правил, используйте Список наборов правил аккаунта операция. Ответ будет включать описание и ID существующих управляемых наборов правил.
Идентификаторы управляемых наборов правил WAF также доступны в WAF Managed Rules страницу.
Импорт или удаление существующих наборов правил
Terraform исходит из того, что полностью контролирует наборы правил аккаунта и зоны. Если у вас уже настроены наборы правил в аккаунте или зоне, выполните одно из следующих действий:
- Импорт существующих наборов правил в Terraform с помощью
cf-terraformingинструмента. Его последние версии умеют генерировать определения ресурсов для существующих наборов правил и импортировать их конфигурацию в состояние Terraform. - Начните с нуля, выполнив удаление существующих наборов правил (наборы правил уровня аккаунта и зоны с
"kind": "root"и"kind": "zone", соответственно), а затем задать конфигурацию наборов правил в Terraform.
Развёртывание управляемых наборов правил на уровне зоны
В следующем примере два управляемых набора правил развёртываются в зоне с идентификатором <ZONE_ID> через Terraform, используя cloudflare_ruleset ресурс с двумя правилами, которые выполняют управляемые наборы правил.
Необходимые разрешения API-токена
Хотя бы одно из следующих права доступа токена требуется:
Zone WAF Write
Настройте cloudflare_ruleset ↗ ресурс:
# Configure a ruleset at the zone level for the "http_request_firewall_managed" phase
resource "cloudflare_ruleset" "zone_level_managed_waf" {
zone_id = var.cloudflare_zone_id
name = "Managed WAF entry point ruleset"
description = "Zone-level WAF Managed Rules config"
kind = "zone"
phase = "http_request_firewall_managed"
rules = [
{
# Execute Cloudflare Managed Ruleset
ref = "execute_cloudflare_managed_ruleset"
description = "Execute Cloudflare Managed Ruleset on my zone-level phase entry point ruleset"
expression = "true"
action = "execute"
action_parameters = {
id = "efb7b8c949ac4650a09736fc376e9aee"
}
},
{
# Execute Cloudflare OWASP Core Ruleset
ref = "execute_cloudflare_owasp_core_ruleset"
description = "Execute Cloudflare OWASP Core Ruleset on my zone-level phase entry point ruleset"
expression = "true"
action = "execute"
action_parameters = {
id = "4814384a9e5d4991b9815dcfc25d2f1f"
}
},
]
}# Configure a ruleset at the zone level for the "http_request_firewall_managed" phase
resource "cloudflare_ruleset" "zone_level_managed_waf" {
zone_id = "<ZONE_ID>"
name = "Managed WAF entry point ruleset"
description = "Zone-level WAF Managed Rules config"
kind = "zone"
phase = "http_request_firewall_managed"
# Execute Cloudflare Managed Ruleset
rules {
ref = "execute_cloudflare_managed_ruleset"
description = "Execute Cloudflare Managed Ruleset on my zone-level phase entry point ruleset"
expression = "true"
action = "execute"
action_parameters {
id = "efb7b8c949ac4650a09736fc376e9aee"
}
}
# Execute Cloudflare OWASP Core Ruleset
rules {
ref = "execute_cloudflare_owasp_core_ruleset"
description = "Execute Cloudflare OWASP Core Ruleset on my zone-level phase entry point ruleset"
expression = "true"
action = "execute"
action_parameters {
id = "4814384a9e5d4991b9815dcfc25d2f1f"
}
}
}Развёртывание управляемых наборов правил на уровне аккаунта
В следующем примере два управляемых набора правил развёртываются в аккаунте с идентификатором <ACCOUNT_ID> через Terraform, используя cloudflare_ruleset ресурс с двумя правилами, которые выполняют управляемые наборы правил для двух хостов, принадлежащих зонам Enterprise.
Необходимые разрешения API-токена
Все перечисленные ниже права доступа токена обязательны:
Account WAF WriteAccount Rulesets Write
Настройте cloudflare_ruleset ↗ ресурс:
resource "cloudflare_ruleset" "account_level_managed_waf" {
account_id = var.cloudflare_account_id
name = "Managed WAF entry point ruleset"
description = "Account-level WAF Managed Rules config"
kind = "root"
phase = "http_request_firewall_managed"
rules = [
{
# Execute Cloudflare Managed Ruleset
ref = "execute_cloudflare_managed_ruleset_api_store"
description = "Execute Cloudflare Managed Ruleset on my account-level phase entry point ruleset"
expression = "http.host in {\"api.example.com\" \"store.example.com\"} and cf.zone.plan eq \"ENT\""
action = "execute"
action_parameters = {
id = "efb7b8c949ac4650a09736fc376e9aee"
}
},
{
# Execute Cloudflare OWASP Core Ruleset
ref = "execute_owasp_core_ruleset_api_store"
description = "Execute Cloudflare OWASP Core Ruleset on my account-level phase entry point ruleset"
expression = "http.host in {\"api.example.com\" \"store.example.com\"} and cf.zone.plan eq \"ENT\""
action = "execute"
action_parameters = {
id = "4814384a9e5d4991b9815dcfc25d2f1f"
}
},
]
}resource "cloudflare_ruleset" "account_level_managed_waf" {
account_id = "<ACCOUNT_ID>"
name = "Managed WAF entry point ruleset"
description = "Account-level WAF Managed Rules config"
kind = "root"
phase = "http_request_firewall_managed"
# Execute Cloudflare Managed Ruleset
rules {
ref = "execute_cloudflare_managed_ruleset_api_store"
description = "Execute Cloudflare Managed Ruleset on my account-level phase entry point ruleset"
expression = "http.host in {\"api.example.com\" \"store.example.com\"} and cf.zone.plan eq \"ENT\""
action = "execute"
action_parameters {
id = "efb7b8c949ac4650a09736fc376e9aee"
}
}
# Execute Cloudflare OWASP Core Ruleset
rules {
ref = "execute_owasp_core_ruleset_api_store"
description = "Execute Cloudflare OWASP Core Ruleset on my account-level phase entry point ruleset"
expression = "http.host in {\"api.example.com\" \"store.example.com\"} and cf.zone.plan eq \"ENT\""
action = "execute"
action_parameters {
id = "4814384a9e5d4991b9815dcfc25d2f1f"
}
}
}Настройка исключений
В следующем примере добавляются два исключения для управляемого набора правил Cloudflare:
- Первое правило пропускает выполнение всего управляемого набора правил Cloudflare (с идентификатором
) для конкретных URL согласно выражению правила. - Второе правило пропускает выполнение двух правил из управляемого набора правил Cloudflare для определённых URL-адресов в соответствии с выражением правила.
Добавьте два исключения в cloudflare_ruleset ресурс перед правилом, разворачивающим управляемый набор правил Cloudflare:
resource "cloudflare_ruleset" "zone_level_managed_waf" {
# (...)
rules = [
{
# Skip execution of the entire Cloudflare Managed Ruleset for specific URLs
ref = "skip_cloudflare_managed_ruleset_example_com"
description = "Skip Cloudflare Managed Ruleset"
expression = "(http.request.uri.path eq \"/status\" and http.request.uri.query contains \"skip=rulesets\")"
action = "skip"
action_parameters = {
rulesets = ["efb7b8c949ac4650a09736fc376e9aee"]
}
},
{
# Skip execution of two rules in the Cloudflare Managed Ruleset for specific URLs
ref = "skip_wordpress_sqli_rules_example_com"
description = "Skip WordPress and SQLi rules"
expression = "(http.request.uri.path eq \"/status\" and http.request.uri.query contains \"skip=rules\")"
action = "skip"
action_parameters = {
rules = {
# Format: "<RULESET_ID>" = ["<RULE_ID_1>", "<RULE_ID_2>"]
"efb7b8c949ac4650a09736fc376e9aee" = ["5de7edfa648c4d6891dc3e7f84534ffa", "e3a567afc347477d9702d9047e97d760"]
}
}
},
{
# Execute Cloudflare Managed Ruleset
ref = "execute_cloudflare_managed_ruleset"
description = "Execute Cloudflare Managed Ruleset on my zone-level phase entry point ruleset"
expression = "true"
action = "execute"
action_parameters = {
id = "efb7b8c949ac4650a09736fc376e9aee"
}
},
# (...)
]
}resource "cloudflare_ruleset" "zone_level_managed_waf" {
# (...)
# Skip execution of the entire Cloudflare Managed Ruleset for specific URLs
rules {
ref = "skip_cloudflare_managed_ruleset_example_com"
description = "Skip Cloudflare Managed Ruleset"
expression = "(http.request.uri.path eq \"/status\" and http.request.uri.query contains \"skip=rulesets\")"
action = "skip"
action_parameters {
rulesets = ["efb7b8c949ac4650a09736fc376e9aee"]
}
}
# Skip execution of two rules in the Cloudflare Managed Ruleset for specific URLs
rules {
ref = "skip_wordpress_sqli_rules_example_com"
description = "Skip WordPress and SQLi rules"
expression = "(http.request.uri.path eq \"/status\" and http.request.uri.query contains \"skip=rules\")"
action = "skip"
action_parameters {
rules = {
# Format: "<RULESET_ID>" = "<RULE_ID_1>,<RULE_ID_2>,..."
"efb7b8c949ac4650a09736fc376e9aee" = "5de7edfa648c4d6891dc3e7f84534ffa,e3a567afc347477d9702d9047e97d760"
}
}
}
# Execute Cloudflare Managed Ruleset
rules {
ref = "execute_cloudflare_managed_ruleset"
description = "Execute Cloudflare Managed Ruleset on my zone-level phase entry point ruleset"
expression = "true"
action = "execute"
action_parameters {
id = "efb7b8c949ac4650a09736fc376e9aee"
}
}
# (...)
}Настройка переопределений
В следующем примере добавляются три переопределения для управляемого набора правил Cloudflare:
- Переопределение правила с ID
5de7edfa648c4d6891dc3e7f84534ffaзадав для действия значениеlog. - Переопределение правила с ID
75a0060762034a6cb663fd51a02344cbотключение правила. - Переопределение тега для
wordpressтегом, задав для действия всех правил с этим тегом значениеjs_challenge.
Следующая конфигурация включает три переопределения в правиле, которое выполняет управляемый набор правил Cloudflare:
# (...)
# Execute Cloudflare Managed Ruleset
rules = [{
ref = "execute_cloudflare_managed_ruleset"
description = "Execute Cloudflare Managed Ruleset on my zone-level phase entry point ruleset"
expression = "true"
action = "execute"
action_parameters = {
id = "efb7b8c949ac4650a09736fc376e9aee"
overrides = {
rules = [
{
id = "5de7edfa648c4d6891dc3e7f84534ffa"
action = "log"
enabled = true
},
{
id = "75a0060762034a6cb663fd51a02344cb"
enabled = false
},
]
categories = [{
category = "wordpress"
action = "js_challenge"
enabled = true
}]
}
}
}]
# (...) # (...)
# Execute Cloudflare Managed Ruleset
rules {
ref = "execute_cloudflare_managed_ruleset"
description = "Execute Cloudflare Managed Ruleset on my zone-level phase entry point ruleset"
expression = "true"
action = "execute"
action_parameters {
id = "efb7b8c949ac4650a09736fc376e9aee"
overrides {
rules {
id = "5de7edfa648c4d6891dc3e7f84534ffa"
action = "log"
enabled = true
}
rules {
id = "75a0060762034a6cb663fd51a02344cb"
enabled = false
}
categories {
category = "wordpress"
action = "js_challenge"
enabled = true
}
}
}
}
# (...)Настройка протоколирования полезной нагрузки
В этом примере включается журналирование полезной нагрузки для совпавших правил управляемого набора правил Cloudflare, задав открытый ключ, используемый для шифрования регистрируемой полезной нагрузки.
На основе правила, разворачивающего Cloudflare Managed Ruleset, следующая конфигурация правила добавляет matched_data объект с открытым ключом, используемым для шифрования полезной нагрузки:
# (...)
# Execute Cloudflare Managed Ruleset
rules = [{
ref = "execute_cloudflare_managed_ruleset"
description = "Execute Cloudflare Managed Ruleset on my zone-level phase entry point ruleset"
expression = "true"
action = "execute"
action_parameters = {
id = "efb7b8c949ac4650a09736fc376e9aee"
matched_data = {
public_key = "Ycig/Zr/pZmklmFUN99nr+taURlYItL91g+NcHGYpB8="
}
}
}]
# (...) # (...)
# Execute Cloudflare Managed Ruleset
rules {
ref = "execute_cloudflare_managed_ruleset"
description = "Execute Cloudflare Managed Ruleset on my zone-level phase entry point ruleset"
expression = "true"
action = "execute"
action_parameters {
id = "efb7b8c949ac4650a09736fc376e9aee"
matched_data {
public_key = "Ycig/Zr/pZmklmFUN99nr+taURlYItL91g+NcHGYpB8="
}
}
}
# (...)Настройка уровня паранойи OWASP, порогового значения и действия
Управляемый набор правил OWASP поддерживает следующие конфигурации:
-
Включите все правила до определённого уровня паранойи, создав переопределения тегов, которые отключают все правила, связанные с более высокими уровнями паранойи.
-
Настройте действие, которое будет выполняться, если вычисленная оценка угрозы превышает пороговое значение, создав переопределение для последнего правила в Cloudflare OWASP Core Ruleset (правило с ID
), включая actionсвойство. -
Настройте пороговое значение оценки, создав переопределение для последнего правила в Cloudflare OWASP Core Ruleset (правило с ID
), включая score_thresholdсвойство.
Дополнительную информацию о доступных значениях конфигурации см. в Cloudflare OWASP Core Ruleset страница в документации по WAF.
Следующее правило из примера для cloudflare_ruleset ресурс Terraform выполняет следующую настройку:
- Разворачивает управляемый набор правил OWASP.
- Устанавливает уровень паранойи OWASP на PL2.
- Устанавливает пороговое значение оценки на
60(Низкая). - Устанавливает действие набора правил на
log.
# (...)
# Execute Cloudflare OWASP Core Ruleset
rules = [{
ref = "execute_owasp_core_ruleset"
description = "Execute Cloudflare OWASP Core Ruleset"
expression = "true"
action = "execute"
action_parameters = {
id = "4814384a9e5d4991b9815dcfc25d2f1f"
overrides = {
# By default, all PL1 to PL4 rules are enabled.
# Set the paranoia level to PL2 by disabling rules with
# tags "paranoia-level-3" and "paranoia-level-4".
categories = [
{
category = "paranoia-level-3"
enabled = false
},
{
category = "paranoia-level-4"
enabled = false
},
]
rules = [{
id = "6179ae15870a4bb7b2d480d4843b323c"
action = "log"
score_threshold = 60
}]
}
}
}]
# (...) # (...)
# Execute Cloudflare OWASP Core Ruleset
rules {
ref = "execute_owasp_core_ruleset"
description = "Execute Cloudflare OWASP Core Ruleset"
expression = "true"
action = "execute"
action_parameters {
id = "4814384a9e5d4991b9815dcfc25d2f1f"
overrides {
# By default, all PL1 to PL4 rules are enabled.
# Set the paranoia level to PL2 by disabling rules with
# tags "paranoia-level-3" and "paranoia-level-4".
categories {
category = "paranoia-level-3"
enabled = false
}
categories {
category = "paranoia-level-4"
enabled = false
}
rules {
id = "6179ae15870a4bb7b2d480d4843b323c"
action = "log"
score_threshold = 60
}
}
}
}
# (...)