Présentation des conditions

Comprendre et composer des conditions pour les règles associées aux stratégies WAF.

WAF utilise le langage JMESPath pour les conditions de règle. JMESPath est un langage de requête destiné à JSON (reportez-vous à https://jmespath.org/specification.html Sélecteurs JMESPath) que vous pouvez utiliser pour écrire des expressions JMESPath. Chaque expression prend un document JSON en tant qu'entrée (document d'entrée) et renvoie un document JSON transformé ou nouveau (document de sortie).

Dans WAF, chaque règle accepte une expression JMESPath comme condition. Les demandes ou 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 ou de la réponse HTTP ayant déclenché l'évaluation. Le résultat de l'expression JMESPath évaluée est ensuite utilisé pour déterminer si l'action indiquée dans la règle doit être exécutée.

La valeur renvoyée des conditions JMESPath dans WAF est convertie en valeur booléenne. Les valeurs suivantes sont converties en valeur False :

  • Liste vide : []
  • Objet vide : {}
  • Chaîne vide : ""
  • Valeur booléenne False : False
  • Valeur NULL : NULL
Toutes les autres valeurs sont converties en valeur True. True signifie que l'action de la règle est exécutée et False qu'elle n'est pas exécutée.

Vous pouvez créer une condition JMESPath comportant jusqu'à 1 024 caractères.

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

Plusieurs conditions

# 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 de document JSON d'entrée

Lors de l'évaluation des expressions JMESPath, WAF fournit un document JSON d'entrée, qui inclut les détails de la demande ou de la réponse HTTP ayant 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 source : 129.146.10.1:48152

  • Indicatif du pays auquel appartient l'adresse IP source : US

  • Numéro ASN 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"]
      }
    }
  }
}

Référencer

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 à la norme RFC 5952.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeur

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

49152

connection.source.geo.countryCode

Catégorie

Valeur

Type

chaîne | NULL

Description

Indicatif ISO 3166-1 alpha-2 du pays auquel appartient l'adresse IP source. Peut avoir la valeur NULL si le pays est inconnu.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeur

"US"

connection.source.routing.asn

Catégorie

Valeur

Type

nombre | NULL

Description

Numéro ASN (numéro de système autonome) auquel appartient l'adresse IP source. Peut avoir la valeur NULL si l'adresse IP est privée.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeur

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 valeur

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

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 valeur

"https"

http.request.host

Catégorie

Valeur

Type

chaîne

Description

Valeur de l'en-tête de demande HTTP "Host". L'en-tête de demande "Host" indique 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 valeur

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

"GET", "POST"

http.request.version

Catégorie

Valeur

Type

chaîne

Description

Version de protocole HTTP

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeur

"1.1", "2.0"

http.request.url.path

Catégorie

Valeur

Type

chaîne

Description

Partie chemin absolu de la cible de demande HTTP. N'inclut pas la partie requête. Commence toujours par "/".

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeur

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

http.request.url.query

Catégorie

Valeur

Type

chaîne

Description

Paramètres de requête de la cible de demande HTTP, sans le préfixe.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeur

"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 requête de la cible de demande HTTP, analysée dans une structure d'objet, où :

  • Clé : nom d'un paramètre de requête.

  • Valeur : liste de valeurs avec la "clé" comme nom.

Les clés et les valeurs ne sont pas échappées conformément aux règles d'échappement d'URL.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeur

Partie requête de la cible de 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 de requête de la cible de demande HTTP.

Si une chaîne de requête est présente, il s'agit toujours de "?".

Si aucune chaîne de requête n'est présente, contient une chaîne vide.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeur

"?", ""

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 de valeurs d'en-tête avec la "clé" comme nom.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeur

En-têtes de demande HTTP brute

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

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

  • Clé : nom du cookie.

  • Valeur : liste de valeurs de cookie avec la "clé" comme nom.

Disponible dans

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Exemples de valeur

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 valeur

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 de valeurs d'en-tête avec la "clé" comme nom.

Disponible dans

responseAccessControl, responseProtection

Exemples de valeur

En-têtes de réponse HTTP brute

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

Mise en correspondance de chaînes sans respect des majuscules/minuscules

WAF ajoute aux fonctions de mise en correspondance de chaînes prises en charge par défaut dans JMESPath la prise en charge de quatre fonctions qui peuvent mettre en correspondance les chaînes sans respect des majuscules/minuscules :

  • i_equals (variante sans respect des majuscules/minuscules de l'opérateur ==) ;
  • i_contains (variante sans respect des majuscules/minuscules de la fonction contains) ;
  • i_starts_with (variante sans respect des majuscules/minuscules de la fonction starts_with) ;
  • i_ends_with (variante sans respect des majuscules/minuscules de la fonction ends_with).

i_equals

boolean i_equals(string $left, string $right)
Renvoie True si les chaînes $left et $right sont identiques en cas de comparaison sans respect des majuscules/minuscules (les chaînes $left et $right sont converties en minuscules, seules les lettres de l'alphabet latin sont converties en minuscules). Sinon, renvoie la valeur False.
Pour Expression Résultat
"chaîne" i_equals(@, 'chaîne') True
"chaîne" i_equals(@, 'CHAÎNE') True
"chaîne" i_equals(@, 'cHaÎnE') True
"CHAÎNE" i_equals(@, 'chaîne') True
"chaîne" i_equals(@, 'autre_chaîne') False

i_contains

boolean i_contains(array|string $subject, any $search)
Variante sans respect des majuscules/minuscules de la fonction contains.

Si la valeur $subject fournie est une chaîne, cette fonction renvoie True si la chaîne contient l'argument $search fourni, en cas de comparaison sans respect des majuscules/minuscules (les chaînes $left et $right sont converties en minuscules, seules les lettres de l'alphabet latin sont converties en minuscules). Sinon, cette fonction renvoie la valeur False.

Si $subject est un tableau, cette fonction renvoie True si au moins l'un des éléments du tableau est identique à la valeur $search fournie, sinon elle renvoie False.

Si $search est une chaîne, la comparaison est effectuée à l'aide de la même logique que dans la fonction i_equals() : comparaison sans respect des majuscules/minuscules (l'élément de tableau $subject individuel et les chaînes $search sont convertis en minuscules, seules les lettres de l'alphabet latin sont converties en minuscules).

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

Pour 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)
Renvoie True si la valeur $subject commence par la valeur $prefix, en cas de comparaison sans respect des majuscules/minuscules (les chaînes $left et $right sont converties en minuscules, seules les lettres de l'alphabet latin sont converties en minuscules). Sinon, cette fonction renvoie la valeur False.
Pour 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)
Renvoie True si la valeur $subject se termine par la valeur $suffix, en cas de comparaison sans respect des majuscules/minuscules (les chaînes $left et $right sont converties en minuscules, seules les lettres de l'alphabet latin sont converties en minuscules). Sinon, cette fonction renvoie la valeur False.
Pour 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

Mise en correspondance d'adresse IP

WAF ajoute la prise en charge de plusieurs fonctions pouvant mettre en correspondance une adresse IP avec une liste de plages CIDR ou des ressources de liste d'adresses réseau WAF :

  • address_in (met une adresse IP en correspondance avec une liste de plages CIDR) ;

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

  • vcn_address_in_network_address_list (met une adresse IP avec un ID de réseau cloud virtuel en correspondance avec une ressource de liste d'adresses réseau WAF).

address_in

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

Renvoie True si la valeur $ip_address indiquée est contenue dans au moins l'un des sous-réseaux CIDR indiqués dans $cidr_subnets. Sinon, renvoie 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.

Pour 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)
Renvoie True si la valeur $ip_address indiquée est contenue dans au moins l'une des listes d'adresses réseau fournies (ressource WAF contenant la liste des sous-réseaux CIDR). Sinon, renvoie 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 WAF NetworkAddressList par ID. Toutes les valeurs NetworkAddressList référencées doivent être de type : "ADDRESSES".

Exemple 1

Elément Détails
Entrée indiquée
{
  "connection": {
    "source": {
      "address": "1.1.1.1"
    }
  }
}
Listes d'adresses réseau 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

Elément Détails
Entrée indiquée
{
  "connection": {
    "source": {
      "address": "1.1.1.1"
    }
  }
}
Listes d'adresses réseau 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)
Renvoie True si la valeur $ip_address indiquée du réseau cloud virtuel $vcn_id est contenue dans au moins l'une des listes d'adresses réseau fournies (ressource WAF contenant la liste des sous-réseaux CIDR). Sinon, renvoie 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 réseau cloud virtuel.

$nal_ids doit être un tableau de chaînes référençant les ressources WAF NetworkAddressList par ID. Toutes les valeurs NetworkAddressList référencées doivent être de type : "VCN_ADDRESSES".

Exemple 1

Elément Détails
Entrée indiquée
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
Listes d'adresses réseau indiquées

ocid1.webappfirewallnetworkaddresslist...a :

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

True

Exemple 2

Elément Détails
Entrée indiquée
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
Listes d'adresses réseau indiquées

ocid1.webappfirewallnetworkaddresslist...b :

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