Usando campos, funções e expressões

Juntamente com as ações, os campos e as expressões são os elementos básicos das regras personalizadas do WAF. Esses elementos trabalham juntos para definir os critérios de correspondência de uma regra personalizada.

Campos

Quando o site CIS recebe uma solicitação HTTP, ele analisa a solicitação e cria uma tabela de campos para correspondência. Essa tabela de campos existe somente enquanto a solicitação está sendo processada e contém as propriedades da solicitação usadas para correspondência de expressões.

Cada valor de campo pode ser originado de diferentes locais, como:

  • Propriedades primitivas, obtidas diretamente do tráfego - por exemplo, http.request.uri.path.
  • Valores derivados, resultantes de uma transformação, composição ou operação básica, por exemplo, disponibilizando o valor de http.request.uri.path todas as letras minúsculas como um campo de outro campo.
  • Valores de computador, resultantes de uma consulta, cálculo ou outra inteligência – por exemplo, um cf.threat_score calculado dinamicamente por um processo de aprendizado de máquina que inspeciona valores primitivos e derivados relacionados.

Campos disponíveis

Campos disponíveis
Nome do campo Tipo Valor de exemplo Notas
http.cookie Sequência session=A12345;-background=light Cookie inteiro como uma sequência
http.host Sequência www.example.com O nome do host utilizado na URI completa da solicitação
http.referer Sequência Cabeçalho de referência HTTP O HTTP cabeçalho request Referer, que contém o endereço da página da web que direcionou para a página solicitada no momento.
http.request.body.raw Sequência O corpo da solicitação HTTP inalterado.
http.request.full_uri Sequência https://www.example.com/articles/index?section=539061&expand=comments O URI completo recebido pelo servidor da web (não inclui #fragment que não é enviado aos servidores da web)
http.request.method Sequência POST O método HTTP, em letras maiúsculas
http.request.uri Sequência /articles/index?section=539061&expand=comments O URI absoluto da solicitação
http.request.uri.path Sequência /articles/index O caminho da solicitação
http.request.uri.query Sequência section=539061&expand=comments A sequência de consultas inteira, menos o prefixo delimitador "?"
http.user_agent Sequência Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/65.0.3325.181 Safari/537.36 O agente do usuário de HTTP inteiro
http.x_forwarded_for Sequência O cabeçalho X-Forwarded-For HTTP completo
ip.src Endereço IP 93.155.208.22 O endereço IP do cliente TCP, que pode ser ajustado para refletir o endereço IP real do cliente original, conforme o caso (por exemplo, utilizando cabeçalhos HTTP como X-Forwarded-For ou X-Real-IP)
ip.src.region Sequência Texas A região de geolocalização associada ao endereço IP da solicitação recebida.
ip.src.asnum Número 222 O número do Sistema autônomo (AS)
ip.src.country Sequência GB O código de 2 letras do país
ssl Booleano verdadeiro Se a conexão de HTTP com o cliente está criptografada
ip.src.subdivision_1_iso_code Sequência GB-ENG O código ISO 3166-2 código da região de primeiro nível associada ao endereço IP. Quando o valor real não está disponível, esse campo contém uma cadeia de caracteres vazia. Para usar esse campo, é necessário ter um plano CIS Enterprise.
ip.src.subdivision_2_iso_code Sequência GB-SWK O código ISO 3166-2 código da região de segundo nível associada ao endereço IP. Quando o valor real não está disponível, esse campo contém uma cadeia de caracteres vazia. Para usar esse campo, é necessário ter um plano CIS Enterprise.
ip.src.is_in_european_union Booleano Para obter mais informações, consulte ip.src.is_in_european_union.

Esses campos padrão seguem a convenção de nomenclatura da referência de campo de exibição do Wireshark. No entanto, algumas variações sutis podem existir nos valores de exemplo anteriores.

Além dos campos padrão, os campos definidos pelo Cloudflare a seguir também estão disponíveis:

Campos disponíveis da Cloudflare
Nome do campo Tipo Valor de exemplo Notas
cf.client.bot Booleano verdadeiro se a solicitação provém de um bot ou rastreador conhecido, independentemente de a intenção ser boa ou má.
cf.threat_score Número 0 Esse campo indica uma pontuação de ameaça do Cloudflare. Anteriormente, uma pontuação de ameaça representava uma pontuação de ameaça da Cloudflare de 0 a 100, em que 0 indicava baixo risco. Agora, a pontuação da ameaça é sempre 0 (zero).
cf.waf.score Número 1-99 Pontuação baseada em aprendizado de máquina que estima a probabilidade de uma solicitação ser mal-intencionada. As pontuações variam de 1 (mais provavelmente malicioso) a 99 (mais provavelmente seguro). Pontuações baixas indicam um risco maior. Útil para criar regras de firewall baseadas em limites.
cf.ray_id Sequência É um identificador que é dado a cada solicitação que passa pela Cloudflare.
cf.edge.server_ip Endereço IP Esse campo indica o endereço IP da rede global para o qual a solicitação HTTP foi resolvida. Esse campo só é significativo para clientes BYOIP.
cf.edge.server_port Endereço IP 1-65535 Esse campo indica o número da porta em que a rede global da Cloudflare recebeu a solicitação. Use esse campo para filtrar o tráfego em uma porta específica.
cf.tls_cipher Sequência AES128-SHA256 A cifra para a conexão com a Cloudflare.
cf.tls_version Sequência TLSv1.2 A versão TLS da conexão com a Cloudflare.

ip.src.is_in_european_union

A solicitação é originária de um país da União Europeia (UE) e requer um plano CIS Enterprise.

A tabela a seguir lista os países da UE a partir dos dados de geolocalização:

Código e nome do país
Código do país Nome do país
AT Áustria
AX Ilhas Aland
BE Bélgica
BG Bulgária
CY Chipre
CZ República Checa
GE Alemanha
DK Dinamarca
EE Estônia
ES Espanha
FI Finlândia
FR França
GF Guiana Francesa
GP Guadalupe
GR Grécia
HR Croácia
HU Hungria
IE Irlanda
IT Itália
LT Lituânia
LU Luxemburgo
LV Letónia
MF São Martinho
MQ Martinica
MT Malta
NL Países Baixos
PL Polônia
PT Portugal
RE Reunião
RO Romênia
SE Suécia
SI Eslovênia
SK Eslováquia
YT Mayotte

Campos de gerenciamento de bots

O Bot Management for Enterprise é um complemento pago que oferece proteção sofisticada contra bots para seu domínio. Os clientes podem identificar o tráfego automatizado, tomar as medidas adequadas e visualizar análises detalhadas no console.

A tabela a seguir fornece as informações sobre os campos de bot disponíveis:

Campos de gerenciamento de bots do Cloufare disponíveis
Nome do campo Tipo Notas
cf.client.bot Booleano Este campo indica se a solicitação está vindo de um robô ou crawler conhecido, independentemente de bom ou mau intento.
cf.bot_management.verified_bot Booleano Indica se a solicitação foi originada de um bot ou rastreador conhecido e fornece as mesmas informações que cf.client.bot. Esse campo está disponível no plano CIS Enterprise com o gerenciamento de bots ativado.
cf.bot_management.corporate_proxy Booleano Esse campo indica se a solicitação de entrada é proveniente de um proxy corporativo baseado na nuvem ou de um gateway seguro da Web identificado somente pela empresa. Esse campo está disponível no plano CIS Enterprise com o gerenciamento de bots ativado.
cf.bot_management.detection_ids Número Esse campo lista IDs para detecções heurísticas do Gerenciamento de bots em uma solicitação. Use esse campo para corresponder ou excluir heurísticas específicas em uma regra. Uma solicitação pode ter várias detecções.
cf.bot_management.ja3_hash Sequência Esse campo fornece uma impressão digital SSL / TLS para ajudá-lo a identificar possíveis solicitações de bots. Para obter mais informações, consulte JA3/JA4 Fingerprint. Para usar esse campo, é necessário um plano CIS Enterprise com o gerenciamento de bots ativado.
cf.bot_management.ja4 Sequência Esse campo fornece uma impressão digital SSL / TLS para ajudá-lo a identificar possíveis solicitações de bots. Para obter mais informações, consulte JA3/JA4 Fingerprint. Para usar esse campo, é necessário um plano CIS Enterprise com o gerenciamento de bots ativado.
cf.bot_management.js_detection.passed Booleano Indica se o visitante passou por uma detecção de JS anteriormente. Para obter mais informações, consulte JavaScript detections. Para usar esse campo, é necessário um plano CIS Enterprise com o gerenciamento de bots ativado.
cf.bot_management.score Número Esse campo representa a probabilidade de uma solicitação se originar de um bot usando uma pontuação de 1 a 99. Uma pontuação baixa indica que a solicitação vem de um bot ou de um agente automatizado. Uma pontuação alta indica que um ser humano emitiu a solicitação. Para usar esse campo, é necessário um plano CIS Enterprise com o gerenciamento de bots ativado.
cf.bot_management.static_resource Número Indica se os recursos estáticos devem ser incluídos quando você cria uma regra usando cf.bot_management.score. Para usar esse campo, é necessário um plano CIS Enterprise com o gerenciamento de bots ativado.
cf.verified_bot_category Sequência Esse campo fornece o tipo e a finalidade de um bot verificado. Para obter mais informações, consulte Categorias de bots verificados.

Funções

CIS As expressões são formatadas usando a sintaxe do Cloudflare Wirefilter. A linguagem de expressões suporta funções de transformação que manipulam valores extraídos de solicitações d HTTP.

Essas funções não são compatíveis com a interface do usuário do Expression Builder. Você pode usá-las digitando-as manualmente no Editor de Expressões, no console do CIS. Você também pode usá-los em expressões de regra criadas por meio da CLI ou da API.

Funções de transformação do Ruleset Engine
Função Assinatura Descrição Exemplo
any any(Array<Boolean>): Boolean Retorna true quando o operador de comparação retorna true para qualquer valor na matriz de argumentos. any(url_decode(http.request.body.form.values[*])[*] contains "xss")
all all(Array<Boolean>): Boolean Retorna true quando o operador de comparação retorna true para todos os valores da matriz de argumentos. all(http.request.headers["content-type"][*] == "application/json")
concat concat(String | Bytes | Array): String | Array Concatena os valores dos argumentos em uma única string ou matriz. concat("foo", "-", "bar") retorna "foo-bar"
ends_with ends_with(source String, substring String): Boolean Retorna true quando a string de origem termina com uma determinada sub-string. A fonte não pode ser um valor literal. ends_with(http.request.uri.path, ".html")
len len(String | Bytes | Array): Integer Retorna o comprimento em bytes de uma string ou de um valor de tipo bytes, ou ainda o número de elementos em uma matriz. len(http.host) retorna “ 11 ” quando o host é "example.com"
lower lower(String): String Converte um campo de sequência em letras minúsculas. Apenas os bytes ASCII em maiúsculas são convertidos. Todos os demais bytes não são afetados. lower(http.host) == "www.example.com"
lookup_json_integer lookup_json_integer(field String, key String | Integer, ...): Integer Retorna o valor inteiro associado à chave fornecida em um campo JSON. lookup_json_integer(http.request.body.raw, "version") retorna 2
lookup_json_string lookup_json_string(field String, key String | Integer, ...): String Retorna o valor da string associado à chave fornecida em um campo JSON. lookup_json_string(http.request.body.raw, "company") == "example"
remove_bytes remove_bytes(Bytes): Bytes Retorna uma nova matriz de bytes com todas as ocorrências dos bytes fornecidos removidas. remove_bytes(http.host, "\x2e\x77")
starts_with starts_with(source String, substring String): Boolean Retorna true quando a fonte começa com uma determinada subcadeia. A fonte não pode ser um valor literal. starts_with(http.request.uri.path, "/blog")
substring substring(field String | Bytes, start Integer [, end Integer]): String Retorna parte do valor do campo, desde o índice do byte inicial até o índice do byte final, excluindo este último. Suporta índices negativos para contar a partir do final da sequência de caracteres. substring(http.request.uri.path, 0, 5)
to_string to_string(Integer | Boolean | IP address): String Retorna a representação em string de um valor inteiro, booleano ou de endereço IP. to_string(cf.threat_score) retorna "10"
upper upper(String): String Converte um campo de sequência em maiúsculas. Somente bytes ASCII em letras minúsculas são convertidos. Todos os demais bytes não são afetados. upper(http.host) retorna "WWW.CLOUDFLARE.COM"
url_decode url_decode(source String [, options String]): String Decodifica uma string no formato “ URL ”. A fonte deve ser um campo, e não um literal. Suporta os sinalizadores opcionais "r" (recursivo) e "u" (Unicode). url_decode(http.request.uri.path)

Expressões

Uma expressão retorna true ou false com base em uma correspondência com relação ao tráfego recebido. Por exemplo:

http.host eq "www.example.com" and ip.src in 92.182.212.0/24

Neste exemplo, duas expressões únicas compreendem uma expressão composta. Pense em cada expressão única como uma condição. Cada condição é avaliada individualmente antes da aplicação e da lógica para determinar o resultado final da expressão composta.

Olhando para a primeira expressão única, é possível ver que ela contém:

  • um campo - http.host
  • um operador de comparação - eq
  • um valor - "www.example.com"

Nem todas as condições têm a mesma estrutura. Exemplos adicionais que utilizam estruturas diferentes são discutidos na próxima seção.

Operadores de comparação

Os operadores de comparação a seguir estão disponíveis para uso em expressões:

Operadores de comparação para expressões
Inglês como C Descrição
eq == Igual
ne != Diferente de
lt < Menor que
le <= Menor que ou igual a
gt
Maior que
ge

=

Maior do que ou igual a
contém Contém exatamente
corresponde ~ Expressão regular inspirada em Re2
in O valor aparece em um conjunto de valores. Suporta intervalos usando a notação "..".
not ! Consulte a comparação booleana
bitwise_and & Compare o valor do campo de bit

Atualmente, o Expression Builder suporta apenas operadores em inglês.

Uma expressão pode conter uma combinação de operadores em inglês e semelhantes a C. Por exemplo, ip.src eq 93.184.216.34 é equivalente a ip.src == 93.184.216.34.

Certos operadores de comparação se aplicam a campos específicos com base no tipo. A matriz a seguir fornece exemplos de quais operadores estão disponíveis para vários tipos de campo:

Operadores de comparação para campos
Inglês como C Sequência Endereço IP Número
eq == http.request.uri.path eq "/articles/2008/" ip.src eq 93.184.216.0 cf.threat_score eq 10
ne != http.request.uri.path ne "/articles/2010/" ip.src ne 93.184.216.0 cf.threat_score ne 60
lt < http.request.uri.path lt "/articles/2009/" cf.threat_score lt 10
le <= http.request.uri.path le "/articles/2008/" cf.threat_score le 20
gt
http.request.uri.path gt "/articles/2006/" cf.threat_score gt 25
ge

=

Maior do que ou igual a cf.threat_score ge 60
contém http.request.uri.path contains "/articles/"
corresponde ~ http.request.uri.path ~ "^/articles/200[7-8]/$"
in http.request.method in { "HEAD" "GET" } ip.src in { 93.184.216.0 93.184.216.1 } cf.threat_score in {0 2 10}

A avaliação de expressões usando valores de sequência faz distinção entre maiúsculas e minúsculas. Dessa forma, uma regra personalizada pode exigir que você defina mais de uma condição de teste. Clientes corporativos podem usar uma expressão regular com o operador de correspondência para capturar múltiplas variações com uma expressão única.

Comparação booleana

Para campos de tipo booleano (por exemplo, ssl), o campo aparece por si mesmo na expressão ao avaliar para uma condição verdadeira. Para uma condição falsa, o operador não se aplica.

Comparação booleana
Sim Não
ssl não ssl

Expressões compostas

É possível criar expressões compostas agrupando duas ou mais expressões únicas utilizando operadores lógicos.

Expressões compostas
Inglês como C Descrição Exemplo Precedência
not ! NOT Lógico not (http.host eq "www.example.com" and ip.src in 93.184.216.0/24) 1
e && AND Lógico http.host eq "www.example.com" and ip.src in 93.184.216.0/24 2
xor ^^ XOR Lógico http.host eq "www.example.com" xor ip.src in 93.184.216.0/24 3
ou || OR Lógico http.host eq "www.example.com" or ip.src in 93.184.216.0/24 4

Para alterar a ordem de precedência, é possível agrupar expressões com parênteses. Usando nenhum parêntese, as expressões são agrupadas implicitamente com base na precedência padrão:

ssl and http.request.uri.path eq /login or http.request.uri.path eq /oauth

Aplicando agrupamento explícito:

(ssl and http.request.uri.path eq /login) or http.request.uri.path eq /oauth

Fornecendo precedência para ou com parênteses:

ssl and (http.request.uri.path eq /login or http.request.uri.path eq /oauth)

Observe que, embora not seja usado para agrupamento, ele pode ser usado para negar uma única comparação. Por exemplo, not ip.src eq 93.184.216.0 é equivalente a not (ip.src eq 93.184.216.0).

Finalmente, é possível também negar expressões agrupadas:

not (http.request.method eq "POST" and http.request.uri.path eq "/login")

Desvios de filtros de exibição do Wireshark

As expressões de regras personalizadas são inspiradas nos filtros de exibição do Wireshark. No entanto, a implementação se desvia das maneiras a seguir:

  • Para testes de igualdade de IP do CIDR, o Wireshark permite intervalos no formato ip.src == 1.2.3.0/24, enquanto o CIS suporta apenas testes de igualdade usando um único endereço IP. Para comparar um CIDR, use o operador in; por exemplo, ip.src in {1.2.3.0/24}.
  • No Wireshark, ssl é um campo de protocolo que contém centenas de outros campos de vários tipos que estão disponíveis para comparação de múltiplas maneiras. No entanto, nas regras personalizadas, “ ssl ” é um único campo booleano usado para determinar se a conexão do cliente com CIS é criptografada.
  • O operador slice não é suportado.
  • Nem todas as funções são suportadas. Atualmente, len() e count() não são suportados.

Limitações de expressão

As seguintes restrições se aplicam às expressões de regras:

  • Uma expressão de regra pode conter até 4.096 caracteres.

    Se você usar o Construtor de Expressões na interface do usuário, o mesmo limite se aplica à visualização da expressão gerada.

  • Uma expressão de regra pode conter no máximo 64 expressões regulares (regex).