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
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')
# 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¶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"]
}
}
}
}
De referencia
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" |
Categoría |
Valor |
---|---|
Tipo |
número |
Descripción |
Puerto de origen TCP |
Disponible en |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de ejemplo |
49152 |
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" |
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 |
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" |
Categoría |
Valor |
---|---|
Tipo |
número |
Descripción |
Puerto de destino de TCP |
Disponible en |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de ejemplo |
80 |
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" |
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" |
Categoría |
Valor |
---|---|
Tipo |
cadena |
Descripción |
Método de solicitud HTTP |
Disponible en |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Valores de ejemplo |
"GET", "POST" |
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" |
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", "/" |
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", "" |
Categoría |
Valor |
||||||
---|---|---|---|---|---|---|---|
Tipo |
objeto |
||||||
Descripción |
Parte de la consulta del destino de solicitud HTTP, analizada en una estructura de objetos, donde:
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 |
|
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 |
"?", "" |
Categoría |
Valor |
||||
---|---|---|---|---|---|
Tipo |
objeto |
||||
Descripción |
Cabeceras de solicitud HTTP analizadas en una estructura de objetos, donde:
|
||||
Disponible en |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||
Valores de ejemplo |
|
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:
|
||||
Disponible en |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||
Valores de ejemplo |
|
Categoría |
Valor |
---|---|
Tipo |
número |
Descripción |
Código de respuesta HTTP |
Disponible en |
responseAccessControl, responseProtection |
Valores de ejemplo |
200 |
Categoría |
Valor |
||||
---|---|---|---|---|---|
Tipo |
objeto |
||||
Descripción |
Cabeceras de respuesta HTTP analizadas en una estructura de objetos, donde:
|
||||
Disponible en |
responseAccessControl, responseProtection |
||||
Valores de ejemplo |
|
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:
|
Expresión | address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a']) |
Resultado | true |
Elemento | Detalles |
---|---|
Entrada proporcionada |
{ "connection": { "source": { "address": "1.1.1.1" } } } |
NAL proporcionados |
ocid1.webappfirewallnetworkaddresslist...a:
ocid1.webappfirewallnetworkaddresslist...b:
|
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 1Elemento | Detalles |
---|---|
Entrada proporcionada |
{ "connection": { "source": { "address": "10.0.0.1" } }, "paResource": { "vcnOcid": "ocid1.vcn...a" } } |
NAL proporcionados |
ocid1.webappfirewallnetworkaddresslist...a:
|
Expresión |
vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...a'] ) |
Resultado |
true |
Elemento | Detalles |
---|---|
Entrada proporcionada |
{ "connection": { "source": { "address": "10.0.0.1" } }, "paResource": { "vcnOcid": "ocid1.vcn...a" } } |
NAL proporcionados |
ocid1.webappfirewallnetworkaddresslist...b:
|
Expresión | vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...b'] ) |
Resultado | false |