Создайте блок страны Cloudflare Geo WAF с помощью Terraform
Я пытаюсь написать скрипт terraform для применения блока страны в Cloudflare для одного из моих веб-сайтов. Однако я не совсем уверен, правильно ли я поступаю. Для контекста используется план Free Cloudflare.
Мой скрипт терраформирования ниже:
resource "cloudflare_ruleset" "country_block" {
zone_id = data.cloudflare_zone.zone.zone_id
name = "country block on ${local.web_host}"
kind = "zone"
phase = "http_request_firewall_custom"
rules {
action = "block"
expression = "(ip.geoip.country ne \"NZ\")"
enabled = true
}
}
Ошибка, которую я получаю,
Error: error creating ruleset country block on www.example.com: not entitled to use the firewall custom phase
Могу сделать вручную на портале CloudFlare, по правилам WAF Security - Firewall, вы получаете 5 бесплатно. Поэтому я предполагаю, что это возможно в terraform, хотя ошибка потенциально указывает на то, что требуется платный план.
2 ответа
Привет, вот мой рабочий пример Cloudflare Security — правила брандмауэра WAF (брандмауэр веб-приложений)
Убедитесь, что ваш токен API имеет необходимые разрешения. Взгляните на https://developers.cloudflare.com/terraform/tutorial/initialize-terraform/
variable "zone_id" {
default = "removed_value"
}
resource "cloudflare_filter" "block_ips_from_countries" {
zone_id = var.zone_id
description = "Block IPs from different countries"
expression = "(ip.geoip.country in {\"CU\" \"IR\" \"RU\" \"SY\" \"US\" \"KP\"})"
}
resource "cloudflare_firewall_rule" "block_ips_from_countries" {
zone_id = var.zone_id
description = "Block IPs from different countries"
filter_id = cloudflare_filter.block_ips_from_countries.id
action = "block"
priority = 2
}
Этот пример основан на официальной документации https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/firewall_rule#zone_id .
И примечание от https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/ruleset
Если вы ранее настроили наборы правил с помощью панели инструментов, вам сначала необходимо удалить их (зону, документацию по учетной записи) и очистить ресурсы, прежде чем пытаться настроить их с помощью Terraform. Это связано с тем, что Terraform не сможет примениться, если конфигурация уже существует, чтобы предотвратить слепую перезапись изменений.
Мне пришлось удалить правила, которые я создал вручную, чтобы позволитьterraform
создать их
Альтернатива есть. Вы можете использоватьcloudflare_access_rule
для того же самого:
resource "cloudflare_access_rule" "countries_to_challenge" {
account_id = var.cloudflare_account_id
for_each = var.countries_naughty_map
notes = "Challenge ${each.key} with country code ${each.value}"
mode = "managed_challenge"
configuration {
target = "country"
value = each.value
}
}
variable "countries_naughty_map" {
type = map(any)
default = {
"Aussies" = "AU"
"Kiwis" = "NZ"
}
}
Правила доступа оцениваются раньше правил брандмауэра. Глянь сюда . Это также касается вашегоzones
вместо того, чтобы быть в одиночествеzone
.