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.pathtodas 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_scorecalculado 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 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:
| 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 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:
| 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çã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:
| 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/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.
| 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 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
slicenão é suportado. - Nem todas as funções são suportadas. Atualmente,
len()ecount()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).