Erläuterungen zu Bedingungen
Bedingungen für Regeln im Zusammenhang mit WAF-Policys verstehen und erstellen
WAF verwendet JMESPath als Regelbedingungssprache. JMESPath ist eine Abfragesprache für JSON (siehe https://jmespath.org/specification.htmlJMESPath-Selektoren), mit der Sie JMESPath-Ausdrücke schreiben können. Dabei nimmt jeder Ausdruck ein JSON-Dokument als Eingabe (das Eingabedokument) an und gibt ein transformiertes oder neues JSON-Dokument (das Ausgabedokument) zurück.
In WAF akzeptiert jede Regel einen JMESPath-Ausdruck als Bedingung. HTTP-Anforderungen oder HTTP-Antworten (je nach Regeltyp) lösen WAF-Regeln aus. Bei der Auswertung einer Regel wertet der WAF-Service den JMESPath-Ausdruck (die Bedingung) der Regel aus und stellt ein JSON-Eingabedokument bereit. Dieses enthält die Details der HTTP-Anforderung oder HTTP-Antwort, die die Auswertung ausgelöst hat. Dann wird anhand des Ergebnisses des ausgewerteten JMESPath-Ausdrucks bestimmt, ob die in der Regel angegebene Aktion ausgeführt werden soll.
Der Rückgabewert von JMESPath-Bedingungen in WAF wird in einen booleschen Wert konvertiert. Die folgenden Werte werden in "false" konvertiert:
- Leere Liste: []
- Leeres Objekt: {}
- Leere Zeichenfolge: ""
- Falscher boolescher Wert: false
- Nullwert: null
Sie können eine JMESPath-Bedingung mit maximal 1.024 Zeichen erstellen.
Beispiel:
URL-Pfadbedingungen
# 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)
HTTP-Anforderungsheaderbedingungen
# 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')
Mehrfachbedingungen
# 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')
Struktur des JSON-Eingabedokuments
Bei der Auswertung von JMESPath-Ausdrücken stellt WAF ein JSON-Eingabedokument bereit. Dieses enthält die Details der HTTP-Anforderung oder HTTP-Antwort, die die Auswertung ausgelöst hat. Das JSON-Eingabedokument ist immer ein JSON-Objekt.
Beispiel:
HTTP-Anforderung mit den folgenden Details:
-
Quell-IP-Adresse und -port: 129.146.10.1:48152
-
Landeskennzahl der IP-Quelladresse: US
-
ASN der die Quell-IP-Adresse: 31898
-
Ziel-IP-Adresse und -port: 205.147.88.0:80
-
Zielhost: example.com
-
Protokoll: 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
Hierbei wird das folgende JSON-Eingabedokument generiert und an JMESPath-Ausdrücke übergeben:
{
"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"]
}
}
}
}
Verweis
Kategorie |
Wert |
---|---|
Typ |
Zeichenfolge |
Beschreibung |
Eine Zeichenfolge mit der TCP-Quell-IP-Adresse. IPv6-Adressen werden gemäß RFC 5952 in kanonischer Form dargestellt. |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
"10.0.0.1", "1.2.3.4" |
Kategorie |
Wert |
---|---|
Typ |
Zahl |
Beschreibung |
TCP-Quellport |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
49152 |
Kategorie |
Wert |
---|---|
Typ |
Zeichenfolge | Null |
Beschreibung |
Landeskennzahl gemäß ISO 3166-1 Alpha-2 des Landes, zu dem die Quell-IP-Adresse gehört. Kann Null sein, wenn das Land unbekannt ist. |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
"US" |
Kategorie |
Wert |
---|---|
Typ |
Zahl | Null |
Beschreibung |
Die AS-Nummer (ASN), zu der die Quell-IP-Adresse gehört. Kann Null sein, wenn die IP-Adresse privat ist. |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
2122, 1278 |
Kategorie |
Wert |
---|---|
Typ |
Zeichenfolge |
Beschreibung |
Eine Zeichenfolge mit der TCP-Ziel-IP-Adresse. |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
"10.0.0.1" |
Kategorie |
Wert |
---|---|
Typ |
Zahl |
Beschreibung |
TCP-Zielport |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
80 |
Kategorie |
Wert |
---|---|
Typ |
Zeichenfolge |
Beschreibung |
Das Protokoll der Verbindung, entweder "http" oder "https". |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
"https" |
Kategorie |
Wert |
---|---|
Typ |
Zeichenfolge |
Beschreibung |
Der Wert des HTTP-"Host"-Anforderungsheaders. Der "Host"-Anforderungsheader gibt den Host und die Portnummer des Servers an, an den die Anforderung gesendet wird. |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
"http://www.example.com", "api.example.com:8080" |
Kategorie |
Wert |
---|---|
Typ |
Zeichenfolge |
Beschreibung |
Die HTTP-Anforderungsmethode |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
"GET", "POST" |
Kategorie |
Wert |
---|---|
Typ |
Zeichenfolge |
Beschreibung |
HTTP-Protokollversion |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
"1.1", "2.0" |
Kategorie |
Wert |
---|---|
Typ |
Zeichenfolge |
Beschreibung |
Der absolute Pfadteil des HTTP-Anforderungsziels. Enthält nicht den Abfrageteil. Beginnt immer mit einem "/". |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
"/api/v1", "/index.html", "/" |
Kategorie |
Wert |
---|---|
Typ |
Zeichenfolge |
Beschreibung |
Die Abfrageparameter des HTTP-Anforderungsziels ohne Präfix. |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
"foo=bar&multi=1&multi=2", "multi=one&multi=two&multi=3&encoded=two%20words", "" |
Kategorie |
Wert |
||||||
---|---|---|---|---|---|---|---|
Typ |
Objekt |
||||||
Beschreibung |
Der Abfrageteil des HTTP-Anforderungsziels, der in einer Objektstruktur geparst wird. Dabei gilt:
Schlüssel und Werte werden entsprechend den URL-Maskierungsregeln nicht maskiert. |
||||||
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||||
Beispielwerte |
|
Kategorie |
Wert |
---|---|
Typ |
Zeichenfolge |
Beschreibung |
Das Abfragepräfix des HTTP-Anforderungsziels. Wenn eine Abfragezeichenfolge vorhanden ist, lautet es immer "?". Wenn keine Abfragezeichenfolge vorhanden ist, enthält es eine leere Zeichenfolge. |
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
Beispielwerte |
"?", "" |
Kategorie |
Wert |
||||
---|---|---|---|---|---|
Typ |
Objekt |
||||
Beschreibung |
Die HTTP-Anforderungsheader, die in einer Objektstruktur geparst werden. Dabei gilt:
|
||||
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||
Beispielwerte |
|
Kategorie |
Wert |
||||
---|---|---|---|---|---|
Typ |
Objekt |
||||
Beschreibung |
Die HTTP-Cookies, die mit dem HTTP-"Cookie"-Anforderungsheader übergeben wurden, in einer Objektstruktur geparst. Dabei gilt:
|
||||
Verfügbar in |
requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection |
||||
Beispielwerte |
|
Kategorie |
Wert |
---|---|
Typ |
Zahl |
Beschreibung |
HTTP-Antwortcode |
Verfügbar in |
responseAccessControl, responseProtection |
Beispielwerte |
200 |
Kategorie |
Wert |
||||
---|---|---|---|---|---|
Typ |
Objekt |
||||
Beschreibung |
Die HTTP-Antwortheader, die in einer Objektstruktur geparst werden. Dabei gilt:
|
||||
Verfügbar in |
responseAccessControl, responseProtection |
||||
Beispielwerte |
|
Zeichenfolgenableich ohne Beachtung der Groß-/Kleinschreibung
Neben Zeichenfolgenabgleichsfunktionen, die standardmäßig in JMESPath unterstützt werden, bietet WAF Unterstützung für vier Funktionen, bei denen Zeichenfolgen ohne Beachtung der Groß-/Kleinschreibung verglichen werden können:
- i_equals (Variante des Operators == ohne Beachtung der Groß-/Kleinschreibung)
- i_contains (Variante der Funktion "contains" ohne Beachtung der Groß-/Kleinschreibung)
- i_starts_with (Variante der Funktion "starts_with" ohne Beachtung der Groß-/Kleinschreibung)
- i_ends_with (Variante der Funktion "ends_with" ohne Beachtung der Groß-/Kleinschreibung)
i_equals
boolean i_equals(string $left, string $right)
Gibt "true" zurück, wenn die Zeichenfolgen $left und $right gleich sind und die Groß-/Kleinschreibung nicht beachtet wird. (Sowohl $left als auch $right werden in Kleinbuchstaben konvertiert. Nur lateinische Buchstaben werden in Kleinbuchstaben konvertiert.) Andernfalls wird "false" zurückgegeben.Angabe | Ausdruck | Ergebnis |
---|---|---|
"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 der Funktion "contains" ohne Beachtung der Groß-/Kleinschreibung.Wenn das angegebene $subject eine Zeichenfolge ist, gibt diese Funktion "true" zurück, wenn die Zeichenfolge das angegebene $search-Argument enthält und die Groß-/Kleinschreibung nicht beachtet wird. (Sowohl $left als auch $right werden in Kleinbuchstaben konvertiert. Nur lateinische Buchstaben werden in Kleinbuchstaben konvertiert.) Andernfalls gibt diese Funktion "false" zurück.
Wenn $subject ein Array ist, gibt diese Funktion "true" zurück, wenn mindestens eines der Elemente im Array dem angegebenen $search-Wert entspricht. Andernfalls wird "false" zurückgegeben.
Wenn $search eine Zeichenfolge ist, erfolgt der Vergleich mit derselben Logik wie in der i_equals()-Funktion: Vergleich ohne Beachtung der Groß-/Kleinschreibung. (Sowohl das einzelne $subject-Arrayelement als auch $search-Zeichenfolgen werden in Kleinbuchstaben konvertiert. Nur lateinische Buchstaben werden in Kleinbuchstaben konvertiert.)
Wenn $search keine Zeichenfolge ist, wird der Vergleich mit dem Standardoperator == durchgeführt.
Angabe | Ausdruck | Ergebnis |
---|---|---|
"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)
Gibt "true" zurück, wenn $subject mit dem $prefix beginnt und die Groß-/Kleinschreibung nicht beachtet wird. (Sowohl $left als auch $right werden in Kleinbuchstaben konvertiert. Nur lateinische Buchstaben werden in Kleinbuchstaben konvertiert.) Andernfalls gibt diese Funktion "false" zurück.Angabe | Ausdruck | Ergebnis |
---|---|---|
"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)
Gibt "true" zurück, wenn $subject mit dem $suffix endet und die Groß-/Kleinschreibung nicht beachtet wird. (Sowohl $left als auch $right werden in Kleinbuchstaben konvertiert. Nur lateinische Buchstaben werden in Kleinbuchstaben konvertiert.) Andernfalls gibt diese Funktion "false" zurück.Angabe | Ausdruck | Ergebnis |
---|---|---|
"foobarbaz" | i_ends_with(@, 'baz') | true |
"foobarbaz" | i_ends_with(@, 'BAZ') | true |
"foobarbaz" | i_ends_with(@, 'bAz') | true |
"foobarbaz" | i_ends_with(@, 'bar') | false |
IP-Adressabgleich
WAF unterstützt mehrere Funktionen, die eine IP-Adresse mit einer Liste von CIDR-Bereichen oder Ressourcen der WAF-Netzwerkadressliste vergleichen können:
-
address_in (vergleicht eine IP-Adresse mit einer Liste von CIDR-Bereichen)
-
address_in_network_address_list (vergleicht eine IP-Adresse mit einer Ressource einer WAF-Netzwerkadressliste)
-
vcn_address_in_network_address_list (vergleicht eine IP-Adresse mit einer VCN-ID mit einer Ressource einer WAF-Netzwerkadressliste)
address_in
boolean address_in(string $ip_address, array[string] $cidr_subnets)
Gibt "true" zurück, wenn die angegebene $ip_address in mindestens einem der in $cidr_subnets angegebenen CIDR-Subnetze enthalten ist. Andernfalls wird "false" zurückgegeben.
$ip_address muss eine Zeichenfolge mit einer IP-Adresse sein.
$cidr_subnets muss ein Array aus Zeichenfolgen sein, die jeweils ein CIDR-Subnetz enthalten.
Angabe | Ausdruck | Ergebnis |
---|---|---|
{ "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)
Gibt "true" zurück, wenn die angegebene $ip_address in mindestens einer der angegebenen Netzwerkadresslisten (einer WAF-Ressource mit einer Liste von CIDR-Subnetzen) enthalten ist. Andernfalls wird "false" zurückgegeben.$ip_address muss eine Zeichenfolge mit einer IP-Adresse sein.
$nal_id-Argumente müssen ein Array von Zeichenfolgen sein, die WAF-NetworkAddressList-Ressourcen nach ID referenzieren. Alle referenzierten NetworkAddressLists müssen den Typ "ADDRESSES" aufweisen.
Beispiel 1
Element | Details |
---|---|
Eingabe |
{ "connection": { "source": { "address": "1.1.1.1" } } } |
Angegebene NALs |
ocid1.webappfirewallnetworkaddresslist...a:
|
Ausdruck | address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a']) |
Ergebnis | true |
Element | Details |
---|---|
Eingabe |
{ "connection": { "source": { "address": "1.1.1.1" } } } |
Angegebene NALs |
ocid1.webappfirewallnetworkaddresslist...a:
ocid1.webappfirewallnetworkaddresslist...b:
|
Ausdruck | address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...b']) |
Ergebnis | false |
vcn_address_in_network_address_list
boolean vcn_address_in_network_address_list(string $ip_address, string $vcn_id, array[string] $nal_ids)
Gibt "true" zurück, wenn die angegebene $ip_address in VCN $vcn_id in mindestens einer der angegebenen Netzwerkadresslisten (einer WAF-Ressource mit einer Liste von CIDR-Subnetzen) enthalten ist. Andernfalls wird "false" zurückgegeben.$ip_address muss eine Zeichenfolge mit einer IP-Adresse sein.
$vcn_id muss eine Zeichenfolge mit der OCID eines VCN sein.
$nal_ids müssen ein Array von Zeichenfolgen sein, die WAF-NetworkAddressList-Ressourcen nach ID referenzieren. Alle referenzierten NetworkAddressLists müssen den Typ "VCN_ADDRESSES" aufweisen.
Beispiel 1Element | Details |
---|---|
Eingabe |
{ "connection": { "source": { "address": "10.0.0.1" } }, "paResource": { "vcnOcid": "ocid1.vcn...a" } } |
Angegebene NALs |
ocid1.webappfirewallnetworkaddresslist...a:
|
Ausdruck |
vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...a'] ) |
Ergebnis |
true |
Element | Details |
---|---|
Eingabe |
{ "connection": { "source": { "address": "10.0.0.1" } }, "paResource": { "vcnOcid": "ocid1.vcn...a" } } |
Angegebene NALs |
ocid1.webappfirewallnetworkaddresslist...b:
|
Ausdruck | vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...b'] ) |
Ergebnis | false |