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
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')
# 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¶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"]
}
}
}
}
Informations de référence
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" |
Catégorie |
Valeur |
---|---|
Type |
nombre |
Description |
Port source TCP |
Disponible dans |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Exemples de valeurs |
(49152) |
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" |
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 |
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" |
Catégorie |
Valeur |
---|---|
Type |
nombre |
Description |
Port de destination TCP |
Disponible dans |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Exemples de valeurs |
80 |
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" |
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" |
Catégorie |
Valeur |
---|---|
Type |
chaîne |
Description |
Méthode de demande HTTP |
Disponible dans |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Exemples de valeurs |
"GET", "POST" |
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" |
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", "/" |
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", "" |
Catégorie |
Valeur |
||||||
---|---|---|---|---|---|---|---|
Type |
objet |
||||||
Description |
Partie interrogation de la cible de la demande HTTP, analysée dans une structure d'objet, où :
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 |
|
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 |
"?", "" |
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 valeurs |
|
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ù :
|
||||
Disponible dans |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||
Exemples de valeurs |
|
Catégorie |
Valeur |
---|---|
Type |
nombre |
Description |
Code de réponse HTTP |
Disponible dans |
responseAccessControl, responseProtection |
Exemples de valeurs |
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 valeurs |
|
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:
|
Expression | address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a']) |
Résultat | true |
Élément | Détails |
---|---|
Entrée indiquée |
{ "connection": { "source": { "address": "1.1.1.1" } } } |
Valeurs NAL 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)
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:
|
Expression |
vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...a'] ) |
Résultat |
true |
É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:
|
Expression | vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...b'] ) |
Résultat | false |