Создайте блок страны 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.

Другие вопросы по тегам