Descripción de condiciones

Comprender y crear condiciones para las reglas asociadas a las políticas de WAF.

WAF utiliza el lenguaje JMESPath como lenguaje de condición de regla. JMESPath es un lenguaje de consulta para JSON (consulte los https://jmespath.org/specification.htmlselectores de JMESPath) que puede utilizar para escribir expresiones JMESPath, donde cada expresión toma un documento JSON como entrada (documento de entrada) y devuelve un documento JSON transformado o nuevo (documento de salida).

En WAF, cada regla acepta una expresión JMESPath como condición. Las solicitudes HTTP o las respuestas HTTP (según el tipo de regla) disparan reglas de WAF. Al evaluar una regla, el servicio WAF evalúa la expresión JMESPath (la condición) de la regla y proporciona un documento JSON de entrada, que incluye los detalles de la solicitud HTTP o la respuesta HTTP que ha disparado la evaluación. A continuación, el resultado de la expresión JMESPath evaluada se utiliza para determinar si se debe ejecutar o no la acción especificada en la regla.

El valor devuelto de las condiciones JMESPath en WAF se convierte en un valor booleano. Los siguientes valores se convierten en "false":

  • Lista vacía: []
  • Objeto vacío: {}
  • Cadena vacía: ""
  • Valor booleano falso: false
  • Valor nulo: null
El resto de valores se convierten en "true". "True" significa que la acción de una regla se ejecuta, y "false" significa que la acción no se ejecuta.

Puede crear una condición JMESPath con un máximo de 1.024 caracteres.

Ejemplo

Condiciones de ruta de 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')
Condiciones del método de solicitud HTTP
# HTTP request method is one of
contains(['GET', 'POST'], http.request.method)

Condiciones de la cabecera de solicitud 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')

Condiciones múltiples

# 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')

Estructura de documento JSON de entrada

Al evaluar expresiones JMESPath, WAF proporciona un documento JSON de entrada, que incluye los detalles de la solicitud HTTP o la respuesta HTTP que ha disparado la evaluación. El documento JSON de entrada siempre es un objeto JSON.

Ejemplo

Para una solicitud HTTP con los siguientes detalles:

  • Puerto y dirección IP de origen: 129.146.10.1:48152

  • Código de país al que pertenece la dirección IP de origen: US

  • ASN al que pertenece la dirección IP de origen: 31898

  • Puerto y dirección IP 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

Se genera el siguiente documento de entrada JSON y se transfiere a las expresiones 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"]
      }
    }
  }
}

De referencia

connection.source.address

Categoría

Valor

Tipo

cadena

Descripción

Cadena que contiene la dirección IP de origen TCP. Las direcciones IPv6 se representan en su forma canónica, según el RFC 5952.

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

"10.0.0.1", "1.2.3.4"

connection.source.port

Categoría

Valor

Tipo

número

Descripción

Puerto de origen TCP

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

49152

connection.source.geo.countryCode

Categoría

Valor

Tipo

cadena | nulo

Descripción

Código de país ISO 3166-1 alpha-2 del país al que pertenece la dirección IP de origen. Puede ser nulo cuando no se conoce el país.

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

"US"

connection.source.routing.asn

Categoría

Valor

Tipo

número | nulo

Descripción

ASN (número de sistema autónomo) al que pertenece la dirección IP de origen. Puede ser nulo cuando la dirección IP es privada.

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

2122, 1278

connection.destination.address

Categoría

Valor

Tipo

cadena

Descripción

Cadena que contiene la dirección IP de destino de TCP.

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

"10.0.0.1"

connection.destination.port

Categoría

Valor

Tipo

número

Descripción

Puerto de destino de TCP

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

80

connection.protocol

Categoría

Valor

Tipo

cadena

Descripción

Protocolo de la conexión, ya sea "http" o "https".

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

"https"

http.request.host

Categoría

Valor

Tipo

cadena

Descripción

Valor de la cabecera "Host" de la solicitud HTTP. La cabecera de solicitud "Host" especifica el host y el número de puerto del servidor al que se envía la solicitud.

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

"http://www.example.com", "api.example.com:8080"

http.request.method

Categoría

Valor

Tipo

cadena

Descripción

Método de solicitud HTTP

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

"GET", "POST"

http.request.version

Categoría

Valor

Tipo

cadena

Descripción

Versión de protocolo HTTP

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

"1.1", "2.0"

http.request.url.path

Categoría

Valor

Tipo

cadena

Descripción

Parte de la ruta de acceso absoluta del destino de solicitud HTTP. No incluye la parte de consulta. Siempre empieza por "/".

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

"/api/v1", "/index.html", "/"

http.request.url.query

Categoría

Valor

Tipo

cadena

Descripción

Parámetros de consulta del destino de solicitud HTTP, sin el prefijo.

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

"foo=bar&multi=1&multi=2", "multi=one&multi=two&multi=3&encoded=two%20words", ""

http.request.url.queryParameters

Categoría

Valor

Tipo

objeto

Descripción

Parte de la consulta del destino de solicitud HTTP, analizada en una estructura de objetos, donde:

  • Clave: nombre de un parámetro de consulta.

  • Valor: lista de valores con la "clave" como nombre.

Las claves y los valores no están identificados según las reglas de escape de URL.

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

Parte de la consulta del destino de solicitud HTTP

Estructura de objeto analizado

?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

Categoría

Valor

Tipo

cadena

Descripción

Prefijo de consulta del destino de solicitud HTTP.

Si hay una cadena de consulta, siempre es "?".

Si no hay ninguna cadena de consulta, contiene una cadena vacía.

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

"?", ""

http.request.headers

Categoría

Valor

Tipo

objeto

Descripción

Cabeceras de solicitud HTTP analizadas en una estructura de objetos, donde:

  • Clave: nombre de la cabecera en minúsculas.

  • Valor: lista de valores de cabecera con la "clave" como nombre.

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

Cabeceras de solicitud HTTP sin procesar

Estructura de objeto analizado

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

Categoría

Valor

Tipo

objeto

Descripción

Cookies HTTP que se han transferido mediante la cabecera de solicitud HTTP "Cookie", analizadas en una estructura de objetos, donde:

  • Clave: nombre de la cookie.

  • Valor: lista de valores de cookie con la "clave" como nombre.

Disponible en

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Valores de ejemplo

Valor de la cabecera de solicitud HTTP "Cookie"

Estructura de objeto analizado

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

Categoría

Valor

Tipo

número

Descripción

Código de respuesta HTTP

Disponible en

responseAccessControl, responseProtection

Valores de ejemplo

200

http.response.headers

Categoría

Valor

Tipo

objeto

Descripción

Cabeceras de respuesta HTTP analizadas en una estructura de objetos, donde:

  • Clave: nombre de la cabecera en minúsculas.

  • Valor: lista de valores de cabecera con la "clave" como nombre.

Disponible en

responseAccessControl, responseProtection

Valores de ejemplo

Cabeceras de respuesta HTTP sin procesar

Estructura de objeto analizado

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"]
}

Coincidencia de cadenas no sensible a mayúsculas/minúsculas

Además de las funciones de coincidencia de cadenas soportadas por defecto en JMESPath, WAF agrega soporte para cuatro funciones que pueden coincidir con cadenas de forma no sensible a mayúsculas/minúsculas:

  • i_equals (variante no sensible a mayúsculas/minúsculas del operador ==);
  • i_contains (variante no sensible a mayúsculas/minúsculas de la función contains);
  • i_starts_with (variante no sensible a mayúsculas/minúsculas de la función starts_with);
  • i_ends_with (variante no sensible a mayúsculas/minúsculas de la función ends_with).

i_equals

boolean i_equals(string $left, string $right)
Devuelve true si las cadenas $left y $right son iguales, cuando se comparan de forma no sensible a mayúsculas/minúsculas (las cadenas $left y $right se convierten a minúsculas, solo las letras en inglés se convierten a minúsculas). Si no es así, devuelve false.
Valor proporcionado Expresión Resultado
"string" i_equals(@, 'string') true
"string" i_equals(@, 'STRING') true
"string" i_equals(@, 'sTrInG') true
"STRING" i_equals(@, 'string') true
"string" i_equals(@, 'other_string') false

i_contains

boolean i_contains(array|string $subject, any $search)
Variante no sensible a mayúsculas/minúsculas de la función contains.

Si el valor $subject proporcionado es una cadena, esta función devuelve true si la cadena contiene el argumento $search proporcionado, cuando se comparan de forma no sensible a mayúsculas/minúsculas (las cadenas $left y $right se convierten a minúsculas, solo las letras en inglés se convierten a minúsculas). De lo contrario, esta función devuelve false.

Si $subject es una matriz, esta función devuelve true si al menos uno de los elementos de la matriz es igual al valor de $search proporcionado; de lo contrario, devuelve false.

Si $search es una cadena, la comparación se realiza con la misma lógica que en la función i_equals(): comparación no sensible a mayúsculas/minúsculas (tanto el elemento de la matriz $subject individual como las cadenas $search se convierten a minúsculas, solo las letras en inglés se convierten a minúsculas).

Si $search no es una cadena, la comparación se realiza mediante el operador == estándar.

Valor proporcionado Expresión Resultado
"foobarbaz" i_contains(@, 'bar') true
"foobarbaz" i_contains(@, 'BAR') true
"foobarbaz" i_contains(@, 'bAr') true
"foobarbaz" i_contains(@, 'foo') false
["a", "b"] i_contains(@, `a`) true
["foo", "bar"] i_contains(@, `b`) false
["foo", "bar"] i_contains(@, `BAR`) true

i_starts_with

boolean i_starts_with(string $subject, string $prefix)
Devuelve true si $subject empieza con $prefix, cuando se compara de forma no sensible a mayúsculas/minúsculas (las cadenas $left y $right se convierten a minúsculas, solo las letras en inglés se convierten a minúsculas). De lo contrario, esta función devuelve false.
Valor proporcionado Expresión Resultado
"foobarbaz" i_starts_with(@, 'foo') true
"foobarbaz" i_starts_with(@, 'FOO') true
"foobarbaz" i_starts_with(@, 'fOo') true
"foobarbaz" i_starts_with(@, 'bar') false

i_ends_with

boolean i_ends_with(string $subject, string $suffix)
Devuelve true si $subject termina con $suffix, cuando se compara de forma no sensible a mayúsculas/minúsculas (las cadenas $left y $right se convierten a minúsculas, solo las letras en inglés se convierten a minúsculas). De lo contrario, esta función devuelve false.
Valor proporcionado Expresión Resultado
"foobarbaz" i_ends_with(@, 'baz') true
"foobarbaz" i_ends_with(@, 'BAZ') true
"foobarbaz" i_ends_with(@, 'bAz') true
"foobarbaz" i_ends_with(@, 'bar') false

Coincidencia de dirección IP

WAF proporciona soporte para varias funciones que pueden establecer una coincidencia de una dirección IP con una lista de rangos CIDR o recursos de la lista de direcciones de red WAF:

  • address_in (establece una coincidencia de una dirección IP con una lista de rangos CIDR);

  • address_in_network_address_list (establece una coincidencia de una dirección IP con un recurso de lista de direcciones de red WAF);

  • vcn_address_in_network_address_list (establece una coincidencia de una dirección IP con un ID de VCN con un recurso de lista de direcciones de red WAF).

address_in

boolean address_in(string $ip_address, array[string] $cidr_subnets)

Devuelve true si el valor de $ip_address proporcionado está incluido en al menos una de las subredes CIDR especificadas en $cidr_subnets. Si no es así, devuelve false.

$ip_address debe ser una cadena que contenga una dirección IP.

$cidr_subnets debe ser una matriz de cadenas que contengan una subred CIDR cada una.

Valor proporcionado Expresión Resultado
{
  "connection": {
    "source": {
      "address": "1.1.1.1"
    }
  }
}
address_in(connection.source.address, ['1.1.0.0/16', '2.2.0.0/16']) true
address_in(connection.source.address, ['3.3.0.0/16']) false

address_in_network_address_list

boolean address_in_network_address_list(string $ip_address, array[string] $nal_ids)
Devuelve true si el valor de $ip_address proporcionado está incluido en al menos una de las listas de direcciones de red proporcionadas (un recurso de WAF que contiene una lista de subredes CIDR). Si no es así, devuelve false.

$ip_address debe ser una cadena que contenga una dirección IP.

Los argumentos $nal_id deben ser una matriz de cadenas que haga referencia a los recursos de WAF NetworkAddressList por ID. Todos los NetworkAddressLists a los que se hace referencia deben ser del tipo: "ADDRESSES".

Ejemplo1

Elemento Detalles
Entrada proporcionada
{
  "connection": {
    "source": {
      "address": "1.1.1.1"
    }
  }
}
NAL proporcionados

ocid1.webappfirewallnetworkaddresslist...a:

  • 1.1.0.0/16
  • 2.2.0.0/16
Expresión address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a'])
Resultado true
Ejemplo2

Elemento Detalles
Entrada proporcionada
{
  "connection": {
    "source": {
      "address": "1.1.1.1"
    }
  }
}
NAL proporcionados

ocid1.webappfirewallnetworkaddresslist...a:

  • 1.1.0.0/16
  • 2.2.0.0/16

ocid1.webappfirewallnetworkaddresslist...b:

  • 3.3.0.0/16
Expresión address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...b'])
Resultado false

vcn_address_in_network_address_list

boolean vcn_address_in_network_address_list(string $ip_address, string $vcn_id, array[string] $nal_ids)
Devuelve true si el valor de $ip_address proporcionado en la VCN $vcn_id está incluido en al menos una de las listas de direcciones de red proporcionadas (un recurso de WAF que contiene una lista de subredes CIDR). Si no es así, devuelve false.

$ip_address debe ser una cadena que contenga una dirección IP.

$vcn_id debe ser una cadena que contenga un OCID de una VCN.

$nal_ids debe ser una matriz de cadenas que haga referencia a los recursos de WAF NetworkAddressList por ID. Todos los NetworkAddressLists a los que se hace referencia deben ser del tipo: "VCN_ADDRESSES".

Ejemplo 1

Elemento Detalles
Entrada proporcionada
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
NAL proporcionados

ocid1.webappfirewallnetworkaddresslist...a:

  • 10.0.0.0/16 en ocid1.vcn...a
  • 10.1.0.0/16 en ocid1.vcn...b
Expresión
vcn_address_in_network_address_list(
  connection.source.address,
  connection.paResource.vcnOcid,
  ['ocid1.webappfirewallnetworkaddresslist...a']
)
Resultado

true

Ejemplo2

Elemento Detalles
Entrada proporcionada
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
NAL proporcionados

ocid1.webappfirewallnetworkaddresslist...b:

  • 10.0.0.0/16 en ocid1.vcn...c
Expresión vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...b'] )
Resultado false