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
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')
# 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¶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"]
}
}
}
}
Référencer
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" |
Catégorie |
Valeur |
---|---|
Type |
nombre |
Description |
Port source TCP |
Disponible dans |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Exemples de valeur |
49152 |
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" |
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 |
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" |
Catégorie |
Valeur |
---|---|
Type |
nombre |
Description |
Port de destination TCP |
Disponible dans |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Exemples de valeur |
80 |
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" |
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" |
Catégorie |
Valeur |
---|---|
Type |
chaîne |
Description |
Méthode de demande HTTP |
Disponible dans |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Exemples de valeur |
"GET", "POST" |
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" |
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", "/" |
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", "" |
Catégorie |
Valeur |
||||||
---|---|---|---|---|---|---|---|
Type |
objet |
||||||
Description |
Partie requête de la cible de demande HTTP, analysée dans une structure d'objet, où :
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 |
|
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 |
"?", "" |
Catégorie |
Valeur |
||||
---|---|---|---|---|---|
Type |
objet |
||||
Description |
En-têtes de demande HTTP analysés dans une structure d'objet, où :
|
||||
Disponible dans |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||
Exemples de valeur |
|
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ù :
|
||||
Disponible dans |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||
Exemples de valeur |
|
Catégorie |
Valeur |
---|---|
Type |
nombre |
Description |
Code de réponse HTTP |
Disponible dans |
responseAccessControl, responseProtection |
Exemples de valeur |
200 |
Catégorie |
Valeur |
||||
---|---|---|---|---|---|
Type |
objet |
||||
Description |
En-têtes de réponse HTTP analysés dans une structure d'objet, où :
|
||||
Disponible dans |
responseAccessControl, responseProtection |
||||
Exemples de valeur |
|
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 :
|
Expression | address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a']) |
Résultat | True |
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 :
ocid1.webappfirewallnetworkaddresslist...b :
|
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 1Elé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 :
|
Expression |
vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...a'] ) |
Résultat |
True |
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 :
|
Expression | vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...b'] ) |
Résultat | False |