Présentation des conditions

Comprendre et rédiger les conditions des règles associées aux politiques WAF.

Le service WAF utilise le langage JMESPath comme langage de condition de règle. JMESPath est un langage d'interrogation pour JSON (voir les spécifications JMESPath dans https://jmespath.org/specification.html) que vous pouvez utiliser pour rédiger des expressions JMESPath. Chaque expression utilise un document JSON en tant qu'entrée (document d'entrée) et retourne un document JSON transformé ou nouveau (document de sortie).

Dans le service WAF, chaque règle accepte une expression JMESPath comme condition. Les demandes HTTP ou les réponses HTTP (selon le type de règle) déclenchent des règles WAF. Lors de l'évaluation d'une règle, le service WAF évalue l'expression JMESPath (la condition) de la règle et fournit un document JSON d'entrée, qui inclut les détails de la demande HTTP ou de la réponse HTTP qui a déclenché l'évaluation. Ensuite, le résultat de l'expression JMESPath évaluée est utilisé pour déterminer si l'action spécifiée dans la règle doit être exécutée ou non.

La valeur de retour des conditions JMESPath dans le service WAF est convertie en valeur booléenne. Les valeurs suivantes sont converties à "false" (Faux) :

  • Liste vide : []
  • Objet vide : {}
  • Chaîne vide : ""
  • Valeur booléenne Faux : false
  • Valeur nulle : null
Toutes les autres valeurs sont converties à "true" (Vrai). La valeur true signifie que l'action associée à une règle est exécutée tandis que la valeur false signifie que l'action n'est pas exécutée.

Vous pouvez créer une condition JMESPath de 1 024 caractères au maximum.

Exemple

Conditions de chemin d'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')
Conditions de méthode de demande HTTP
# HTTP request method is one of
contains(['GET', 'POST'], http.request.method)

Conditions d'en-tête de demande 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')

Conditions multiples

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

Structure du document JSON d'entrée

Lors de l'évaluation des expressions JMESPath, le service WAF fournit un document JSON d'entrée, qui inclut les détails de la demande HTTP ou de la réponse HTTP qui a déclenché l'évaluation. Le document JSON d'entrée est toujours un objet JSON.

Exemple

Pour une demande HTTP avec les détails suivants :

  • Adresse IP et port sources : 129.146.10.1:48152

  • Code de pays auquel appartient l'adresse IP source : États-Unis

  • Numéro de système autonome auquel appartient l'adresse IP source : 31898

  • Adresse IP et port de destination : 205.147.88.0:80

  • Hôte de destination : example.com

  • Protocole : 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

Le document d'entrée JSON suivant est généré et transmis aux expressions 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"]
      }
    }
  }
}

Informations de référence

connection.source.address

Catégorie

Valeur

Type

chaîne

Description

Chaîne contenant l'adresse IP source TCP. Les adresses IPv6 sont représentées sous leur forme canonique, conformément au document RFC 5952.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

"10.0.0.1", "1.2.3.4"

connection.source.port

Catégorie

Valeur

Type

nombre

Description

Port source TCP

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

(49152)

connection.source.geo.countryCode

Catégorie

Valeur

Type

chaîne | nul

Description

Code ISO 3166-1 du pays auquel appartient l'adresse IP source, composé de 2 caractères alphanumériques. Peut être nul lorsque le pays est inconnu.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

"US"

connection.source.routing.asn

Catégorie

Valeur

Type

nombre | nul

Description

Numéro de système autonome (ASN) auquel appartient l'adresse IP source. Peut être nul lorsque l'adresse IP est privée.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

2122, 1278

connection.destination.address

Catégorie

Valeur

Type

chaîne

Description

Chaîne contenant l'adresse IP de destination TCP.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

"10.0.0.1"

connection.destination.port

Catégorie

Valeur

Type

nombre

Description

Port de destination TCP

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

80

connection.protocol

Catégorie

Valeur

Type

chaîne

Description

Protocole de la connexion : "http" ou "https".

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

"https"

http.request.host

Catégorie

Valeur

Type

chaîne

Description

Valeur de l'en-tête "Host" de la demande HTTP. L'en-tête de demande "Host" spécifie l'hôte et le numéro de port du serveur auquel la demande est envoyée.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

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

http.request.method

Catégorie

Valeur

Type

chaîne

Description

Méthode de demande HTTP

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

"GET", "POST"

http.request.version

Catégorie

Valeur

Type

chaîne

Description

Version du protocole HTTP

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

"1.1", "2.0"

http.request.url.path

Catégorie

Valeur

Type

chaîne

Description

Partie chemin absolu de la cible de la demande HTTP. Ne comprend pas la partie interrogation. Commence toujours par un "/".

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

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

http.request.url.query

Catégorie

Valeur

Type

chaîne

Description

Paramètres d'interrogation de la cible de la demande HTTP, sans le préfixe.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

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

http.request.url.queryParameters

Catégorie

Valeur

Type

objet

Description

Partie interrogation de la cible de la demande HTTP, analysée dans une structure d'objet, où :

  • Clé : Nom d'un paramètre d'interrogation.

  • Valeur : Liste des valeurs dont le nom correspond à la clé.

Les clés et les valeurs sont spécifiées sans caractère d'échappement conformément aux règles d'utilisation de caractère d'échappement pour les URL.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

Partie interrogation de la cible de la demande HTTP

Structure d'objet analysée

?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

Catégorie

Valeur

Type

chaîne

Description

Préfixe d'interrogation de la cible de la demande HTTP.

Si une chaîne d'interrogation est présente, il s'agit toujours de "?".

Si aucune chaîne d'interrogation n'est présente, il s'agit d'une chaîne vide.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

"?", ""

http.request.headers

Catégorie

Valeur

Type

objet

Description

En-têtes de demande HTTP analysés dans une structure d'objet, où :

  • Clé : Nom de l'en-tête converti en minuscules.

  • Valeur : Liste des valeurs d'en-tête dont le nom correspond à la clé.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

En-têtes de demande HTTP bruts

Structure d'objet analysée

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

Catégorie

Valeur

Type

objet

Description

Témoins HTTP qui ont été transmis à l'aide de l'en-tête de demande HTTP " Cookie ", analysés dans une structure d'objet, où :

  • Clé : Nom du témoin.

  • Valeur : Liste des valeurs de témoin dont le nom correspond à la clé.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeurs

Valeur de l'en-tête de demande HTTP "Cookie"

Structure d'objet analysée

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

Catégorie

Valeur

Type

nombre

Description

Code de réponse HTTP

Disponible dans

responseAccessControl, responseProtection

Exemples de valeurs

200

http.response.headers

Catégorie

Valeur

Type

objet

Description

En-têtes de réponse HTTP analysés dans une structure d'objet, où :

  • Clé : Nom de l'en-tête converti en minuscules.

  • Valeur : Liste des valeurs d'en-tête dont le nom correspond à la clé.

Disponible dans

responseAccessControl, responseProtection

Exemples de valeurs

En-têtes de réponse HTTP bruts

Structure d'objet analysée

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

Correspondance de chaînes non sensible à la casse

En plus des fonctions de mise en correspondance de chaînes prises en charge par défaut dans JMESPath, le service WAF ajoute la prise en charge de quatre fonctions permettant la mise en correspondance de chaînes sans tenir compte de leur casse :

  • i_equals (variante non sensible à la casse de l'opérateur ==)
  • i_contains (variante non sensible à la casse de la fonction contains)
  • i_starts_with (variante non sensible à la casse de la fonction starts_with)
  • i_ends_with (variante non sensible à la casse de la fonction ends_with)

i_equals

boolean i_equals(string $left, string $right)
Retourne la valeur true si les chaînes $left et $right sont égales, lorsqu'elles sont comparées sans tenir compte de la casse (les chaînes $left et $right sont converties en minuscules, seules les lettres anglaises sont converties en minuscules). Sinon, retourne la valeur false.
Données Expression Résultat
"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 non sensible à la casse de la fonction contains.

Si l'élément $subject fourni est une chaîne, cette fonction retourne la valeur true si la chaîne contient l'argument $search fourni, lorsqu'elle est comparée sans tenir compte de la casse (les chaînes $left et $right sont converties en minuscules, seules les lettres anglaises sont converties en minuscules). Sinon, cette fonction retourne la valeur false.

Si $subject est un tableau, cette fonction retourne la valeur true si au moins un des éléments du tableau est égal à la valeur $search fournie, sinon elle retourne la valeur false.

Si $search est une chaîne, la comparaison est effectuée selon la même logique que celle de la fonction i_equals() : comparaison non sensible à la casse (l'élément de tableau $subject individuel et les chaînes $search sont convertis en minuscules, seules les lettres anglaises sont converties en minuscules).

Si $search n'est pas une chaîne, la comparaison est effectuée à l'aide de l'opérateur == standard.

Données Expression Résultat
"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)
Retourne la valeur true si $subject commence par $prefix, lorsqu'il est comparé sans tenir compte de la casse (les chaînes $left et $right sont converties en minuscules, seules les lettres anglaises sont converties en minuscules). Sinon, cette fonction retourne la valeur false.
Données Expression Résultat
"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)
Retourne la valeur true si $subject se termine par $suffix, lorsqu'il est comparé sans tenir compte de la casse (les chaînes $left et $right sont converties en minuscules, seules les lettres anglaises sont converties en minuscules). Sinon, cette fonction retourne la valeur false.
Données Expression Résultat
"foobarbaz" i_ends_with(@, 'baz') true
"foobarbaz" i_ends_with(@, 'BAZ') true
"foobarbaz" i_ends_with(@, 'bAz') true
"foobarbaz" i_ends_with(@, 'bar') false

Correspondance d'adresse IP

Le service WAF ajoute la prise en charge de plusieurs fonctions permettant la mise en correspondance d'une adresse IP avec une liste d'intervalles de blocs CIDR ou de ressources de liste d'adresses réseau WAF :

  • address_in (met en correspondance une adresse IP avec une liste d'intervalles de blocs CIDR)

  • address_in_network_address_list (met en correspondance une adresse IP avec une ressource de liste d'adresses réseau WAF)

  • vcn_address_in_network_address_list (met en correspondance une adresse IP dotée d'un ID VCN avec une ressource de liste d'adresses réseau WAF)

address_in

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

Retourne la valeur true si la valeur $ip_address indiquée figure dans au moins un des sous-réseaux CIDR spécifiés dans $cidr_subnets. Sinon, retourne la valeur false.

$ip_address doit être une chaîne contenant une adresse IP.

$cidr_subnets doit être un tableau de chaînes contenant chacune un sous-réseau CIDR.

Données Expression Résultat
{
  "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)
Retourne la valeur true si la valeur $ip_address indiquée figure dans au moins une des listes d'adresses réseau fournies (ressource WAF contenant une liste de sous-réseaux CIDR). Sinon, retourne la valeur false.

$ip_address doit être une chaîne contenant une adresse IP.

Les arguments $nal_id doivent être un tableau de chaînes, référençant les ressources NetworkAddressList WAF par ID. Toutes les valeurs NetworkAddressLists référencées doivent être de type "ADDRESSES".

Exemple 1

Élément Détails
Entrée indiquée
{
  "connection": {
    "source": {
      "address": "1.1.1.1"
    }
  }
}
Valeurs NAL indiquées

ocid1.webappfirewallnetworkaddresslist...a:

  • 1.1.0.0/16
  • 2.2.0.0/16
Expression address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a'])
Résultat true
Exemple 2

Élément Détails
Entrée indiquée
{
  "connection": {
    "source": {
      "address": "1.1.1.1"
    }
  }
}
Valeurs NAL indiquées

ocid1.webappfirewallnetworkaddresslist...a:

  • 1.1.0.0/16
  • 2.2.0.0/16

ocid1.webappfirewallnetworkaddresslist...b:

  • 3.3.0.0/16
Expression address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...b'])
Résultat false

vcn_address_in_network_address_list

boolean vcn_address_in_network_address_list(string $ip_address, string $vcn_id, array[string] $nal_ids)
Retourne la valeur true si la valeur $ip_address indiquée dans le VCN $vcn_id figure dans au moins une des listes d'adresses réseau fournies (ressource WAF contenant une liste de sous-réseaux CIDR). Sinon, retourne la valeur false.

$ip_address doit être une chaîne contenant une adresse IP.

$vcn_id doit être une chaîne contenant l'OCID d'un VCN.

Les arguments $nal_id doivent être un tableau de chaînes, référençant les ressources NetworkAddressList WAF par ID. Toutes les valeurs NetworkAddressLists référencées doivent être de type "VCN_ADDRESSES".

Exemple 1

Élément Détails
Entrée indiquée
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
Valeurs NAL indiquées

ocid1.webappfirewallnetworkaddresslist...a:

  • 10.0.0.0/16 in ocid1.vcn...a
  • 10.1.0.0/16 in ocid1.vcn...b
Expression
vcn_address_in_network_address_list(
  connection.source.address,
  connection.paResource.vcnOcid,
  ['ocid1.webappfirewallnetworkaddresslist...a']
)
Résultat

true

Exemple 2

Élément Détails
Entrée indiquée
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
Valeurs NAL indiquées

ocid1.webappfirewallnetworkaddresslist...b:

  • 10.0.0.0/16 in ocid1.vcn...c
Expression vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...b'] )
Résultat false