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
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:
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.
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:
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:
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.
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.
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 operadorin
; 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()
ecount()
não são suportados.