IBM Cloud Docs
Usando campos, funções e expressões

Usando campos, funções e expressões

Juntamente com as ações, os campos e as expressões são os blocos de construção das regras personalizadas do WAF. Esses dois elementos trabalham juntos ao definir os critérios a serem usados quando uma regra personalizada é correspondida.

Campos

Quando o CIS recebe uma solicitação de HTTP, ele é examinado e é produzida uma tabela de campos em relação à qual corresponder. Essa tabela de campos existirá enquanto a solicitação atual estiver sendo processada. Considere-a como uma tabela que contém as propriedades de solicitação a serem correspondidas com relação às 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 usado no URI de solicitação integral
http.referer Sequência Cabeçalho de referência HTTP
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 de 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 TCP IP do cliente, que pode ser ajustado para refletir o IP real do cliente original conforme aplicável (por exemplo, usando cabeçalhos de HTTP como X-Forwarded-For ou X-Real-IP)
ip.geoip.asnum Número 222 O número do Sistema autônomo (AS)
ip.geoip.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

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 Este campo indica se a solicitação está vindo de um robô ou crawler conhecido, independentemente de bom ou mau intento.
cf.threat_score Número valor de 0-100 Este campo representa uma pontuação de risco. 0 indica baixo risco conforme determinado pelo Cloudflare. Os valores acima de 10 podem representar remetentes de spam ou robôs e os valores acima de 40 apontam para agentes ruins na Internet. É raro ver valores acima de 60, portanto, ajuste suas regras personalizadas do WAF para desafiar aqueles acima de 10 e bloquear aqueles acima de 50.
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). Escores mais baixos indicam um risco maior. Útil para criar regras de firewall baseadas em limites.

Funções

A linguagem de regras personalizadas tem várias funções para converter campos.

No momento, eles não são compatíveis com o Expression Builder.

Funções de regras personalizadas
Nome da função Tipos de argumento Tipo de retorno Exemplo de uso Notas
parte inferior Sequência Sequência lower(http.host) == "www.example.com" Converte um campo de sequência em letras minúsculas. Apenas os bytes ASCII em maiúsculas estão sendo convertidos. Todos os outros bytes são deixados como estão.
parte superior Sequência Sequência upper(http.host) == "www.example.com" Converte um campo de sequência em maiúsculas. Apenas os bytes ASCII em minúsculas estão sendo convertidos. Todos os outros bytes são deixados como estão.

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/2007-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 site 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.