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
Alle anderen Werte werden in "true" konvertiert. "true" bedeutet, dass die Aktion einer Regel ausgeführt wird, und "false" bedeutet, dass die Aktion nicht ausgeführt wird.

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-Anforderungsmethodenbedingungen
# 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&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"]
      }
    }
  }
}

Verweis

connection.source.address

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"

connection.source.port

Kategorie

Wert

Typ

Zahl

Beschreibung

TCP-Quellport

Verfügbar in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Beispielwerte

49152

connection.source.geo.countryCode

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"

connection.source.routing.asn

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

connection.destination.address

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"

connection.destination.port

Kategorie

Wert

Typ

Zahl

Beschreibung

TCP-Zielport

Verfügbar in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Beispielwerte

80

connection.protocol

Kategorie

Wert

Typ

Zeichenfolge

Beschreibung

Das Protokoll der Verbindung, entweder "http" oder "https".

Verfügbar in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Beispielwerte

"https"

http.request.host

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"

http.request.method

Kategorie

Wert

Typ

Zeichenfolge

Beschreibung

Die HTTP-Anforderungsmethode

Verfügbar in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Beispielwerte

"GET", "POST"

http.request.version

Kategorie

Wert

Typ

Zeichenfolge

Beschreibung

HTTP-Protokollversion

Verfügbar in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Beispielwerte

"1.1", "2.0"

http.request.url.path

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", "/"

http.request.url.query

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

http.request.url.queryParameters

Kategorie

Wert

Typ

Objekt

Beschreibung

Der Abfrageteil des HTTP-Anforderungsziels, der in einer Objektstruktur geparst wird. Dabei gilt:

  • Schlüssel: Der Name eines Abfrageparameters.

  • Wert: Liste von Werten mit dem "Schlüssel" als Namen.

Schlüssel und Werte werden entsprechend den URL-Maskierungsregeln nicht maskiert.

Verfügbar in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Beispielwerte

Abfrageteil des HTTP-Anforderungsziels

Geparste Objektstruktur

?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

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

"?", ""

http.request.headers

Kategorie

Wert

Typ

Objekt

Beschreibung

Die HTTP-Anforderungsheader, die in einer Objektstruktur geparst werden. Dabei gilt:

  • Schlüssel: Name des Headers in Kleinbuchstaben konvertiert.

  • Wert: Liste von Headerwerten mit dem "Schlüssel" als Namen.

Verfügbar in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Beispielwerte

HTTP-Anforderungsheader im Raw-Format

Geparste Objektstruktur

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

Kategorie

Wert

Typ

Objekt

Beschreibung

Die HTTP-Cookies, die mit dem HTTP-"Cookie"-Anforderungsheader übergeben wurden, in einer Objektstruktur geparst. Dabei gilt:

  • Schlüssel: Name des Cookies.

  • Wert: Liste von Cookiewerten mit dem "Schlüssel" als Namen.

Verfügbar in

requestAccessControl, requestRateLimiting, requestProtection, responseAccessControl, responseProtection

Beispielwerte

Wert des HTTP-Anforderungsheaders "Cookie"

Geparste Objektstruktur

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

Kategorie

Wert

Typ

Zahl

Beschreibung

HTTP-Antwortcode

Verfügbar in

responseAccessControl, responseProtection

Beispielwerte

200

http.response.headers

Kategorie

Wert

Typ

Objekt

Beschreibung

Die HTTP-Antwortheader, die in einer Objektstruktur geparst werden. Dabei gilt:

  • Schlüssel: Name des Headers in Kleinbuchstaben konvertiert.

  • Wert: Liste von Headerwerten mit dem "Schlüssel" als Namen.

Verfügbar in

responseAccessControl, responseProtection

Beispielwerte

HTTP-Antwortheader im Raw-Format

Geparste Objektstruktur

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

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:

  • 1.1.0.0/16
  • 2.2.0.0/16
Ausdruck address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a'])
Ergebnis true
Beispiel 2

Element Details
Eingabe
{
  "connection": {
    "source": {
      "address": "1.1.1.1"
    }
  }
}
Angegebene NALs

ocid1.webappfirewallnetworkaddresslist...a:

  • 1.1.0.0/16
  • 2.2.0.0/16

ocid1.webappfirewallnetworkaddresslist...b:

  • 3.3.0.0/16
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 1

Element Details
Eingabe
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
Angegebene NALs

ocid1.webappfirewallnetworkaddresslist...a:

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

true

Beispiel 2

Element Details
Eingabe
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
Angegebene NALs

ocid1.webappfirewallnetworkaddresslist...b:

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