Noções Básicas de Condições
Compreender e compor condições para regras associadas a políticas do serviço WAF.
O WAF usa a linguagem JMESPath como uma linguagem de condição de regra. JMESPath é uma linguagem de consulta para JSON (consulte https://jmespath.org/specification.htmlJMESPath selectors) que você pode usar para gravar expressões JMESPath, em que cada expressão usa um documento JSON como entrada (o documento de entrada) e retorna um documento JSON transformado ou novo (o documento de saída).
No WAF, cada regra aceita uma expressão JMESPath como a condição. As solicitações HTTP ou as respostas HTTP (dependendo do tipo de regra) acionam regras do WAF. Ao avaliar uma regra, o WAF avalia a expressão (a condição) JMESPath da regra e fornece um documento JSON de entrada, que inclui os detalhes da solicitação HTTP ou resposta HTTP que acionou a avaliação. Em seguida, o resultado da expressão JMESPath avaliada é usado para determinar se a ação especificada na regra deve ou não ser executada.
O valor de retorno das condições JMESPath no WAF é convertido em um valor booliano. Os seguintes valores são convertidos em "falso":
- Lista vazia: []
- Objeto vazio: {}
- String vazia: ""
- Booliano falso: falso
- Valor nulo: nulo
Você pode criar uma condição JMESPath com até 1.024 caracteres.
Exemplo
Condições do caminho do URL
# URL path equals
http.request.url.path == '/example/path'
# URL path does not equal
http.request.url.path != '/example/path'
# URL path contains
contains(http.request.url.path, 'example')
# URL path does not contain
!contains(http.request.url.path, 'example')
# URL path starts with
starts_with(http.request.url.path, '/example/path')
# URL path ends with
ends_with(http.request.url.path, '.png')
# HTTP request method is one of
contains(['GET', 'POST'], http.request.method)
Condições do cabeçalho da solicitação HTTP
# HTTP request header exists
contains(keys(http.request.headers), 'example-header')
# HTTP request header has specific value
http.request.headers."example-header"[0] == 'specific-value'
# One of the HTTP request headers with the same name has a specific value
contains(http.request.headers."example-header", 'specific-value')
Condições múltiplas
# HTTP request method is GET and URL path starts with /example/path
http.request.method == 'GET' && starts_with(http.request.url.path, '/example/path')
# URL path starts with /example/path_one or /example/path_two
starts_with(http.request.url.path, '/example/path_one') || starts_with(http.request.url.path, '/example/path_two')
# HTTP request method is POST and URL is either /example/path_one or /example/path_two
http.request.method == 'POST' && (http.request.url.path == '/example/path_one' || http.request.url.path == '/example/path_two')
Estrutura do Documento JSON de Entrada
Ao avaliar expressões JMESPath, o WAF fornece um documento JSON de entrada, que inclui os detalhes da solicitação HTTP ou resposta HTTP que acionou a avaliação. O documento JSON de entrada é sempre um objeto JSON.
Exemplo
Para uma solicitação HTTP com os seguintes detalhes:
-
Endereço IP e porta de origem: 129.146.10.1:48152
-
Código do país ao qual o endereço IP de origem pertence: EUA
-
ASN ao qual o endereço IP de origem pertence: 31898
-
Endereço IP e porta de destino: 205.147.88.0:80
-
Host de destino: example.com
-
Protocolo: HTTP/1.1
GET /test/path/img.jpg?param1=a&m2=b HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: cookie1=A; cookie2=B; cookie3=3C; cookie3=3D
Host: example.com
User-Agent: HTTPie/2.4.0
O seguinte documento de entrada JSON é gerado e passado para expressões JMESPath:
{
"connection": {
"source": {
"address": "129.146.10.1",
"port": 49152,
"geo": {
"countryCode": "US"
},
"routing": {
"asn": 31898
}
},
"destination": {
"address": "205.147.88.0",
"port": 80
},
"protocol": "http"
},
"http": {
"request": {
"host": "www.example.com",
"method": "GET",
"version": "1.1",
"url": {
"path": "/test/path/img.jpg",
"query": "param1=a¶m2=b",
"queryParameters": {
"param1": ["a"],
"param2": ["b"]
},
"queryPrefix": "?"
},
"headers": {
"accept": ["*/*"],
"accept-encoding": ["gzip, deflate"],
"connection": ["keep-alive"],
"cookie": [
"cookie1=A; cookie2=B; cookie3=3C; cookie3=3D"
],
"host": ["www.example.com"],
"user-agent": ["HTTPie/2.4.0"]
},
"cookies": {
"cookie1": ["A"],
"cookie2": ["B"],
"cookie3": ["3C", "3D"]
}
}
}
}
Referência
Categoria |
Valor |
---|---|
Tipo |
string |
Descrição |
Uma string contendo o endereço IP de origem TCP. Os endereços IPv6 são representados em sua forma canônica, de acordo com a RFC 5952. |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
"10.0.0.1", "1.2.3.4" |
Categoria |
Valor |
---|---|
Tipo |
número |
Descrição |
Porta de origem TCP |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
49152 |
Categoria |
Valor |
---|---|
Tipo |
string | nula |
Descrição |
Código ISO 3166-1 alpha-2 do país ao qual o endereço IP de origem pertence. Pode ser nulo quando o país não é conhecido. |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
"US" |
Categoria |
Valor |
---|---|
Tipo |
número | nulo |
Descrição |
O ASN (número de sistema autônomo) ao qual o endereço IP de origem pertence. Pode ser nulo quando o endereço IP é privado. |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
2122, 1278 |
Categoria |
Valor |
---|---|
Tipo |
string |
Descrição |
Uma string contendo o endereço IP de destino TCP. |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
"10.0.0.1" |
Categoria |
Valor |
---|---|
Tipo |
número |
Descrição |
Porta de destino TCP |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
80 |
Categoria |
Valor |
---|---|
Tipo |
string |
Descrição |
O protocolo da conexão, "http" ou "https". |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
"https" |
Categoria |
Valor |
---|---|
Tipo |
string |
Descrição |
O valor do cabeçalho "Host" da solicitação HTTP. O cabeçalho "Host" da solicitação especifica o host e o número da porta do servidor para o qual a solicitação está sendo enviada. |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
"http://www.example.com", "api.example.com:8080" |
Categoria |
Valor |
---|---|
Tipo |
string |
Descrição |
O método de solicitação HTTP |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
"GET", "POST" |
Categoria |
Valor |
---|---|
Tipo |
string |
Descrição |
Versão do protocolo HTTP |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
"1.1", "2.0" |
Categoria |
Valor |
---|---|
Tipo |
string |
Descrição |
A parte do caminho absoluto do destino da solicitação HTTP. Não inclui a parte da consulta. Sempre começa com "/". |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
"/api/v1", "/index.html", "/" |
Categoria |
Valor |
---|---|
Tipo |
string |
Descrição |
Os parâmetros de consulta do destino da solicitação HTTP, sem o prefixo. |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
"foo=bar&multi=1&multi=2", "multi=one&multi=two&multi=3&encoded=two%20words", "" |
Categoria |
Valor |
||||||
---|---|---|---|---|---|---|---|
Tipo |
objeto |
||||||
Descrição |
A parte de consulta do destino da solicitação HTTP, que sofreu parsing em uma estrutura de objeto, em que:
Chaves e valores não têm escape de acordo com as regras de escape de URL. |
||||||
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||||
Valores de exemplo |
|
Categoria |
Valor |
---|---|
Tipo |
string |
Descrição |
O prefixo de consulta do destino da solicitação HTTP. Se uma string de consulta estiver presente, ela será sempre "?". Se nenhuma string de consulta estiver presente, ela conterá uma string vazia. |
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de exemplo |
"?", "" |
Categoria |
Valor |
||||
---|---|---|---|---|---|
Tipo |
objeto |
||||
Descrição |
Os cabeçalhos de solicitação HTTP que sofreram parsing em uma estrutura de objeto, em que:
|
||||
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||
Valores de exemplo |
|
Categoria |
Valor |
||||
---|---|---|---|---|---|
Tipo |
objeto |
||||
Descrição |
Os cookies HTTP que foram transmitidos usando o cabeçalho de solicitação HTTP "Cookie", que sofreram parsing em uma estrutura de objeto, em que:
|
||||
Disponível em |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||
Valores de exemplo |
|
Categoria |
Valor |
---|---|
Tipo |
número |
Descrição |
Código de resposta HTTP |
Disponível em |
responseAccessControl, responseProtection |
Valores de exemplo |
200 |
Categoria |
Valor |
||||
---|---|---|---|---|---|
Tipo |
objeto |
||||
Descrição |
Os cabeçalhos de resposta HTTP que sofreram parsing em uma estrutura de objeto, em que:
|
||||
Disponível em |
responseAccessControl, responseProtection |
||||
Valores de exemplo |
|
Correspondência de String sem Distinção entre Maiúsculas e Minúsculas
Além das funções de correspondência de string suportadas por padrão em JMESPath, o WAF inclui suporte para quatro funções que podem corresponder a strings sem distinção entre maiúsculas e minúsculas:
- i_equals (variante sem distinção entre maiúsculas e minúsculas do operador ==);
- i_contains (variante sem distinção entre maiúsculas e minúsculas da função contains);
- i_starts_with (variante sem distinção entre maiúsculas e minúsculas da função starts_with);
- i_ends_with (variante sem distinção entre maiúsculas e minúsculas da função ends_with).
i_equals
boolean i_equals(string $left, string $right)
Retorna verdadeiro se as strings $left e $right forem iguais, quando comparadas sem distinção entre maiúsculas e minúsculas (as strings $left e $right são convertidas em letras minúsculas; somente caracteres alfabéticos da língua inglesa são convertidos em letras minúsculas). Caso contrário, retorna falso.Fornecido | Expressão | Resultado |
---|---|---|
"string" | i_equals(@, 'string') | verdadeiro |
"string" | i_equals(@, 'STRING') | verdadeiro |
"string" | i_equals(@, 'sTrInG') | verdadeiro |
"STRING" | i_equals(@, 'string') | verdadeiro |
"string" | i_equals(@, 'other_string') | falso |
i_contains
boolean i_contains(array|string $subject, any $search)
Variante da função contains sem distinção entre maiúsculas e minúsculas.Se o $subject fornecido for uma string, esta função retornará verdadeiro se a string contiver o argumento $search fornecido, quando comparado sem distinção entre maiúsculas e minúsculas (as strings $left e $right são convertidas em minúsculas, somente caracteres alfabéticos da língua inglesa são convertidos em letras minúsculas). Caso contrário, esta função retornará falso.
Se $subject for um array, esta função retornará verdadeiro se pelo menos um dos elementos do array for igual ao valor $search fornecido, caso contrário, retornará falso.
Se $search for uma string - a comparação será feita usando a mesma lógica da função i_equals(): comparação sem distinção entre maiúsculas e minúsculas (o elemento de array de $subject individual e as strings $search serão convertidos em letras minúsculas, somente caracteres alfabéticos da língua inglesa serão convertidos em letras minúsculas).
Se $search não for uma string - a comparação será feita usando o operador == padrão.
Fornecido | Expressão | Resultado |
---|---|---|
"foobarbaz" | i_contains(@, 'bar') | verdadeiro |
"foobarbaz" | i_contains(@, 'BAR') | verdadeiro |
"foobarbaz" | i_contains(@, 'bAr') | verdadeiro |
"foobarbaz" | i_contains(@, 'foo') | falso |
["a", "b"] | i_contains(@, `a`) | verdadeiro |
["foo", "bar"] | i_contains(@, `b`) | falso |
["foo", "bar"] | i_contains(@, `BAR`) | verdadeiro |
i_starts_with
boolean i_starts_with(string $subject, string $prefix)
Retorna verdadeiro se o $subject começar com o $prefix, quando comparado sem distinção entre maiúsculas e minúsculas (as strings $left e $right são convertidas em minúsculas; somente caracteres alfabéticos da língua inglesa são convertidos em letras minúsculas). Caso contrário, esta função retornará falso.Fornecido | Expressão | Resultado |
---|---|---|
"foobarbaz" | i_starts_with(@, 'foo') | verdadeiro |
"foobarbaz" | i_starts_with(@, 'FOO') | verdadeiro |
"foobarbaz" | i_starts_with(@, 'fOo') | verdadeiro |
"foobarbaz" | i_starts_with(@, 'bar') | falso |
i_ends_with
boolean i_ends_with(string $subject, string $suffix)
Retorna verdadeiro se o $subject terminar com o $suffix, quando comparado sem distinção entre maiúsculas e minúsculas (as strings $left e $right são convertidas em minúsculas; somente caracteres alfabéticos da língua inglesa são convertidos em letras minúsculas). Caso contrário, esta função retornará falso.Fornecido | Expressão | Resultado |
---|---|---|
"foobarbaz" | i_ends_with(@, 'baz') | verdadeiro |
"foobarbaz" | i_ends_with(@, 'BAZ') | verdadeiro |
"foobarbaz" | i_ends_with(@, 'bAz') | verdadeiro |
"foobarbaz" | i_ends_with(@, 'bar') | falso |
Correspondência de Endereço IP
O WAF inclui suporte para várias funções que podem corresponder a um endereço IP em uma lista de intervalos de CIDR ou recursos da Lista de Endereços de Rede do WAF:
-
address_in (corresponde a um endereço IP em uma lista de intervalos de CIDR);
-
address_in_network_address_list (corresponde a um endereço IP em um recurso da Lista de Endereços de Rede do WAF);
-
vcn_address_in_network_address_list (corresponde a um endereço IP com um ID de VCN em um recurso da Lista de Endereços de Rede do WAF).
address_in
boolean address_in(string $ip_address, array[string] $cidr_subnets)
Retorna verdadeiro se o $ip_address fornecido estiver contido em pelo menos uma das sub-redes de CIDR especificadas em $cidr_subnets. Caso contrário, retorna falso.
$ip_address deve ser uma string que contenha um endereço IP.
$cidr_subnets deve ser um array de strings que contenha uma sub-rede de CIDR cada.
Fornecido | Expressão | Resultado |
---|---|---|
{ "connection": { "source": { "address": "1.1.1.1" } } } |
address_in(connection.source.address, ['1.1.0.0/16', '2.2.0.0/16']) | verdadeiro |
address_in(connection.source.address, ['3.3.0.0/16']) | falso |
address_in_network_address_list
boolean address_in_network_address_list(string $ip_address, array[string] $nal_ids)
Retorna verdadeiro se o $ip_address fornecido estiver contido em pelo menos uma das Listas de Endereços de Rede fornecidas (um recurso do WAF que contém uma lista de sub-redes de CIDR). Caso contrário, retorna falso.$ip_address deve ser uma string que contenha um endereço IP.
Os argumentos $nal_id devem ser um array de strings, referenciando recursos NetworkAddressList do WAF por ID. Todas as NetworkAddressLists referenciadas devem ser do tipo "ADDRESSES".
Exemplo 1
Item | Detalhes |
---|---|
Entrada fornecida |
{ "connection": { "source": { "address": "1.1.1.1" } } } |
NALs Fornecidos |
ocid1.webappfirewallnetworkaddresslist...a:
|
Expressão | address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a']) |
Resultado | verdadeiro |
Item | Detalhes |
---|---|
Entrada fornecida |
{ "connection": { "source": { "address": "1.1.1.1" } } } |
NALs Fornecidos |
ocid1.webappfirewallnetworkaddresslist...a:
ocid1.webappfirewallnetworkaddresslist...b:
|
Expressão | address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...b']) |
Resultado | falso |
vcn_address_in_network_address_list
boolean vcn_address_in_network_address_list(string $ip_address, string $vcn_id, array[string] $nal_ids)
Retorna verdadeiro se o $ip_address fornecido na VCN $vcn_id estiver contido em pelo menos uma das Listas de Endereços de Rede fornecidas (um recurso do WAF que contém uma lista de sub-redes de CIDR). Caso contrário, retorna falso.$ip_address deve ser uma string que contenha um endereço IP.
$vcn_id deve ser uma string que contenha um OCID de uma VCN.
$nal_ids deve ser um array de strings, fazendo referência aos recursos NetworkAddressList do WAF por ID. Todas as NetworkAddressLists referenciadas devem ser do tipo: "VCN_ADDRESSES".
Exemplo 1Item | Detalhes |
---|---|
Entrada fornecida |
{ "connection": { "source": { "address": "10.0.0.1" } }, "paResource": { "vcnOcid": "ocid1.vcn...a" } } |
NALs Fornecidos |
ocid1.webappfirewallnetworkaddresslist...a:
|
Expressão |
vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...a'] ) |
Resultado |
verdadeiro |
Item | Detalhes |
---|---|
Entrada fornecida |
{ "connection": { "source": { "address": "10.0.0.1" } }, "paResource": { "vcnOcid": "ocid1.vcn...a" } } |
NALs Fornecidos |
ocid1.webappfirewallnetworkaddresslist...b:
|
Expressão | vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...b'] ) |
Resultado | falso |