INTEGRITY Документация

Настройка WAF Managed Rules с помощью Terraform

На этой странице приведены примеры развёртывания и настройки WAF Managed Rules в вашей зоне или аккаунте с помощью Terraform. Здесь рассматриваются следующие конфигурации:

Если вы используете Cloudflare API, см. следующие ресурсы:

Дополнительную информацию о развёртывании и настройке управляемых наборов правил с помощью Rulesets API см. в Работа с управляемыми наборами правил в документации по Ruleset Engine.

Прежде чем начать

Получите нужные идентификаторы аккаунта, зоны и управляемого набора правил

Для конфигураций Terraform, приведённых на этой странице, требуется идентификатор зоны (или идентификатор аккаунта), в которой вы будете развёртывать управляемые наборы правил.

Для развёртывания управляемых наборов правил через Terraform необходимо использовать идентификаторы наборов правил. Чтобы найти идентификаторы управляемых наборов правил, используйте Список наборов правил аккаунта операция. Ответ будет включать описание и ID существующих управляемых наборов правил.

Идентификаторы управляемых наборов правил WAF также доступны в WAF Managed Rules страницу.

Импорт или удаление существующих наборов правил

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 Write
  • Account 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_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:

Следующая конфигурация включает три переопределения в правиле, которое выполняет управляемый набор правил 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 страница в документации по WAF.

Следующее правило из примера для cloudflare_ruleset ресурс Terraform выполняет следующую настройку:

  # (...)

  # 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
        }
      }
    }
  }

  # (...)