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
Todos os outros valores são convertidos em "verdadeiro". Verdadeiro significa que a ação de uma regra é executada e falso significa que a ação não é executada.

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')
Condições do método de solicitação HTTP
# 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&param2=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

connection.source.address

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"

connection.source.port

Categoria

Valor

Tipo

número

Descrição

Porta de origem TCP

Disponível em

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de exemplo

49152

connection.source.geo.countryCode

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"

connection.source.routing.asn

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

connection.destination.address

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"

connection.destination.port

Categoria

Valor

Tipo

número

Descrição

Porta de destino TCP

Disponível em

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de exemplo

80

connection.protocol

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"

http.request.host

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"

http.request.method

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"

http.request.version

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"

http.request.url.path

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", "/"

http.request.url.query

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", ""

http.request.url.queryParameters

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:

  • Chave: o nome de um parâmetro de consulta.

  • Valor: lista de valores com a "chave" como seu nome.

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

Parte da consulta do destino da solicitação HTTP

Estrutura do objeto que sofreu parsing

?param1=a&param2=b&param3=c

{
  "param1": ["a"],
  "param2": ["b"],
  "param3": ["c"]
}

?multi=one&multi=two&multi=3&encoded+key=two%20words

{
  "multi": ["one","two", "3"],
  "encoded key": ["two words"]
}
http.request.url.queryParameters

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

"?", ""

http.request.headers

Categoria

Valor

Tipo

objeto

Descrição

Os cabeçalhos de solicitação HTTP que sofreram parsing em uma estrutura de objeto, em que:

  • Chave: nome do cabeçalho convertido em letras minúsculas.

  • Valor: lista de valores de cabeçalho com a "chave" como seu nome.

Disponível em

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de exemplo

Cabeçalhos de solicitação HTTP brutos

Estrutura do objeto que sofreu parsing

Accept: application/json, text/csv
Accept: */*
Accept-Encoding: gzip
Accept-Encoding: deflate
Connection: keep-alive
Content-Language: en, fr
Content-Type: application/json
Host: www.example.com
User-Agent: HTTPie/2.2.0
{
  "accept":           ["application/json, text/csv", "*/*"],
  "accept-encoding":  ["gzip", "deflate"],
  "connection":       ["keep-alive"],
  "content-language": ["en, fr"],
  "content-type":     ["application/json"],
  "host":             ["www.example.com"],
  "user-agent":       ["HTTPie/2.2.0"]
}
}
http.request.cookies

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:

  • Chave: nome do cookie.

  • Valor: lista de valores de cookie com a "chave" como seu nome.

Disponível em

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de exemplo

Valor do cabeçalho da solicitação HTTP "Cookie"

Estrutura do objeto que sofreu parsing

cookie1=A; cookie2=B; cookie3=3C; cookie3=3D
{
  "cookie1": ["A"],
  "cookie2": ["B"],
  "cookie3": ["3C", "3D"]
}
http.response.code

Categoria

Valor

Tipo

número

Descrição

Código de resposta HTTP

Disponível em

responseAccessControl, responseProtection

Valores de exemplo

200

http.response.headers

Categoria

Valor

Tipo

objeto

Descrição

Os cabeçalhos de resposta HTTP que sofreram parsing em uma estrutura de objeto, em que:

  • Chave: nome do cabeçalho convertido em letras minúsculas.

  • Valor: lista de valores de cabeçalho com a "chave" como seu nome.

Disponível em

responseAccessControl, responseProtection

Valores de exemplo

Cabeçalhos de resposta HTTP brutos

Estrutura do objeto que sofreu parsing

Cache-Control: no-cache
Cache-Control: must-revalidate
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=UTF-8
{
  "cache-control":    ["no-cache", "must-revalidate"],
  "connection":       ["keep-alive"],
  "content-encoding": ["gzip"],
  "content-type":     ["text/html;charset=UTF-8"]
}

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:

  • 1.1.0.0/16
  • 2.2.0.0/16
Expressão address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a'])
Resultado verdadeiro
Exemplo 2

Item Detalhes
Entrada fornecida
{
  "connection": {
    "source": {
      "address": "1.1.1.1"
    }
  }
}
NALs Fornecidos

ocid1.webappfirewallnetworkaddresslist...a:

  • 1.1.0.0/16
  • 2.2.0.0/16

ocid1.webappfirewallnetworkaddresslist...b:

  • 3.3.0.0/16
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 1

Item Detalhes
Entrada fornecida
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
NALs Fornecidos

ocid1.webappfirewallnetworkaddresslist...a:

  • 10.0.0.0/16 in ocid1.vcn...a
  • 10.1.0.0/16 in ocid1.vcn...b
Expressão
vcn_address_in_network_address_list(
  connection.source.address,
  connection.paResource.vcnOcid,
  ['ocid1.webappfirewallnetworkaddresslist...a']
)
Resultado

verdadeiro

Exemplo 2

Item Detalhes
Entrada fornecida
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
NALs Fornecidos

ocid1.webappfirewallnetworkaddresslist...b:

  • 10.0.0.0/16 in ocid1.vcn...c
Expressão vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...b'] )
Resultado falso