Referenz zur Sprache der benutzerdefinierten Regeln für Google Cloud Armor

Mit Google Cloud Armor können Sie priorisierte Regeln mit konfigurierbaren Übereinstimmungsbedingungen und Aktionen in einer Sicherheitsrichtlinie definieren. Eine Regel tritt in Kraft, d. h. die konfigurierte Aktion wird angewendet, wenn ihr die höchste Priorität zugewiesen ist und die Attribute der eingehenden Anfrage mit denen übereinstimmen, die in der Übereinstimmungsbedingung der Regel definiert sind.

Es gibt zwei Arten von Übereinstimmungsbedingungen:

  • Eine einfache Übereinstimmungsbedingung enthält Listen mit IP-Adressen oder IP-Adressbereichen.
  • Eine erweiterte Übereinstimmungsbedingung enthält einen Ausdruck mit mehreren Unterausdrücken, die mit einer Vielzahl von Attributen einer eingehenden Anfrage übereinstimmen.

Die benutzerdefinierte Regelsprache wird verwendet, um die Ausdrücke unter erweiterten Übereinstimmungsbedingungen für Sicherheitsrichtlinienregeln zu schreiben. Die benutzerdefinierte Regelsprache von Google Cloud Armor ist eine Erweiterung der Common Expression Language (CEL).

Ein Ausdruck erfordert zwei Komponenten:

  • Attribute, die in Regelausdrücken geprüft werden können.
  • Vorgänge, die für die Attribute als Teil eines Ausdrucks ausgeführt werden können.

Der folgende Ausdruck verwendet beispielsweise die Attribute origin.ip und 9.9.9.0/24 im Vorgang inIpRange(). In diesem Fall gibt der Ausdruck "true" zurück, wenn sich origin.ip im IP-Adressbereich 9.9.9.0/24 befindet.

inIpRange(origin.ip, '9.9.9.0/24')

Attribute

Attribute stellen Informationen aus einer eingehenden Anfrage dar, z. B. die Ursprungs-IP-Adresse oder den angeforderten URL-Pfad.

Feld Typ Feldbeschreibung
origin.ip String Die Quell-IP-Adresse der Anfrage.
request.headers Karte Eine String-zu-String-Zuordnung der HTTP-Anfrageheader. Wenn ein Header mehrere Werte enthält, ist der Wert in dieser Zuordnung ein kommagetrennter String aller Werte des Headers. Die Schlüssel in dieser Zuordnung sind alle kleingeschrieben. Nur die ersten 16 KB jedes Headerwerts sind für die Prüfung verfügbar. Jeder Headerwert über 16 KB wird gemäß den Spezifikationen des Google Cloud-Load-Balancers abgeschnitten.
request.method String Die HTTP-Anfragemethode, z. B. GET oder POST
request.path String Der angeforderte HTTP-URL-Pfad.
request.scheme String Das HTTP-URL-Schema, z. B. http oder https Die Werte für dieses Attribut sind alle kleingeschrieben.
request.query String Die HTTP-URL-Abfrage im Format name1=value&name2=value2, wie sie in der ersten Zeile der HTTP-Anfrage angezeigt wird. Es wird keine Decodierung durchgeführt.
origin.region_code String Der Unicode-Ländercode, der der Ursprungs-IP zugeordnet ist, z. B. US. Wenn Sie eine Regel oder einen Ausdruck mit den Länder- oder Regionscodes ISO 3166-1 Alpha 2 erstellen, behandelt Google Cloud Armor jeden Code unabhängig. Google Cloud Armor-Regeln und -Ausdrücke verwenden explizit diese Regionscodes, um Anfragen zuzulassen oder abzulehnen.

Weitere Informationen finden Sie im Unicode Technical Standard unter unicode_region_subtag.

Operations

In der folgenden Referenz werden die Operatoren beschrieben, die Sie mit Attributen (dargestellt durch x, y und k) verwenden können, um Regelausdrücke zu definieren.

Ausdrücke Beschreibung
x == "foo" Gibt "true" zurück, wenn x dem angegebenen konstanten String-Literal entspricht.
x == R"fo'o" Gibt "true" zurück, wenn x dem angegebenen Raw-String-Literal entspricht, das keine Escape-Sequenzen interpretiert. Raw-String-Literale eignen sich gut für die Darstellung von Strings, die ihrerseits Escape-Sequenz-Zeichen verwenden müssen.
x == y Gibt TRUE zurück, wenn X gleich Y ist.
x != y Gibt TRUE zurück, wenn X ungleich Y ist.
x + y Gibt den verketteten String xy zurück.
x && y Gibt "true" zurück, wenn sowohl x als auch y "true" sind.
x || y Gibt "true" zurück, wenn x, y oder beide "true" sind.
!x Gibt "true" zurück, wenn der boolesche Wert x "false" ist, oder "false", wenn der boolesche Wert x "true" ist.
x.contains(y) Gibt "true" zurück, wenn der String x den Teilstring y enthält.
x.startsWith(y) Gibt "true" zurück, wenn der String x mit dem Teilstring y beginnt.
x.endsWith(y) Gibt "true" zurück, wenn der String x mit dem Teilstring y endet.
x.matches(y) Gibt "true" zurück, wenn der String x mit dem angegebenen RE2-Muster y übereinstimmt. Das RE2-Muster wird mithilfe der Option "RE2::Latin1" kompiliert, die Unicode-Funktionen deaktiviert.
inIpRange(x, y) Gibt "true" zurück, wenn die IP-Adresse x im IP-Bereich y enthalten ist. Subnetzmasken für IPv6-Adressen dürfen nicht größer als /64 sein.
x.lower() Gibt den Kleinbuchstabenwert des Strings x zurück
x.upper() Gibt den Großbuchstabenwert des Strings x zurück
x.base64Decode() Gibt den decodierten base64-Wert von x zurück. Die Zeichen _ - werden zuerst durch / + ersetzt. Gibt "" (leerer String) zurück, wenn x kein gültiger base64-Wert ist.
has(m['k']) Gibt "true" zurück, wenn der Schlüssel k in der Zuordnung m verfügbar ist.
m['k'] Gibt den Wert bei Schlüssel k in der String-zu-String-Zuordnung m zurück, wenn k verfügbar ist, andernfalls wird ein Fehler zurückgegeben. Es wird empfohlen, zuerst die Verfügbarkeit mithilfe von "has(m['k'])==true" zu prüfen.
int(x) Wandelt das Stringergebnis von x in einen int-Typ um. Anschließend kann mithilfe der standardmäßigen arithmetischen Operatoren wie > und <= ein Ganzzahlvergleich durchgeführt werden. Dies funktioniert nur bei Werten, die ganze Zahlen sein sollten.

Beispielausdrücke

Für jeden dieser Ausdrücke hängt die durchgeführte Aktion davon ab, ob der Ausdruck in einer "deny"- oder "allow"-Regel enthalten ist.

Zugriff basierend auf einem IP-Adressbereich in IPv4 oder IPv6 zulassen oder ablehnen

  • Der folgende Ausdruck stimmt mit Anfragen aus dem IP-Adressbereich 9.9.9.0/24 überein:

    inIpRange(origin.ip, '9.9.9.0/24')
    
  • Der folgende Ausdruck stimmt mit Anfragen aus dem IP-Adressbereich 2001:db8::/32 überein:

    inIpRange(origin.ip, '2001:db8::/32')
    
  • Der folgende Ausdruck stimmt mit Anfragen überein, deren Cookie 80=BLAH enthält.

    has(request.headers['cookie']) && request.headers['cookie'].contains('80=BLAH')
    

Traffic mit einem nicht leeren referer-Header zulassen oder ablehnen

  • Der folgende Ausdruck stimmt mit Anfragen überein, die einen nicht leeren referer-Header haben.

    has(request.headers['referer']) && request.headers['referer'] != ""
    

Traffic aus einer bestimmten Region ablehnen

Wenn Ihre Webanwendung in der Region AU noch nicht verfügbar ist, müssen alle Anfragen aus dieser Region blockiert werden.

  • Verwenden Sie in einer "deny"-Regel den folgenden Ausdruck, der mit Anfragen aus der Region AU übereinstimmt:

    origin.region_code == 'AU'
    

Die Regionscodes basieren auf den Codes gemäß ISO 3166-1 alpha-2. In einigen Fällen entspricht eine Region einem Land. Dies ist jedoch nicht immer der Fall. Beispielsweise enthält der Code US alle Bundesstaaten der USA, einen District und sechs Außengebiete.

Mehrere Ausdrücke

Wenn Sie mehrere Bedingungen in eine einzige Regel einbeziehen möchten, kombinieren Sie mehrere Unterausdrücke.

  • Im folgenden Beispiel stimmen Anfragen von 1.2.3.0/24 (z. B. Ihren Alpha-Testern) in der Region AU mit dem folgenden Ausdruck überein:

    origin.region_code == "AU" && inIpRange(origin.ip, '1.2.3.0/24')
    
  • Der folgende Ausdruck entspricht Anfragen von 1.2.3.4, bei denen ein User-Agent den String WordPress enthält:

    inIpRange(origin.ip, '1.2.3.4/32') &&
    has(request.headers['user-agent']) && request.headers['user-agent'].contains('WordPress')
    

Traffic für einen Anfrage-URI, der einem regulären Ausdruck entspricht, zulassen oder ablehnen

  • Der folgende Ausdruck stimmt mit Anfragen überein, die den String bad_path im URI enthalten:

    request.path.matches('/bad_path/')
    
  • Der folgende Ausdruck stimmt mit Anfragen überein, bei denen Chrome im Headerfeld User-Agent enthalten ist:

    request.headers['user-agent'].matches('Chrome')
    
  • Der folgende Ausdruck zeigt den Abgleich der Groß-/Kleinschreibung für den User-Agent-Header, der wordpress enthält. Er stimmt mit User-Agent:WordPress/605.1.15, User-Agent:wordPress und anderen Varianten von wordpress überein:

    request.headers['user-agent'].matches('(?i:wordpress)')
    

Traffic, der einen bestimmten Base64-decodierten Wert enthält, zulassen oder ablehnen

  • Der folgende Ausdruck stimmt mit Anfragen überein, die einen Base64-decodierten Wert von myValue für den user-id-Header haben:

    has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
    

Traffic mit null content-length im HTTP-Text zulassen oder ablehnen

  • Der folgende Ausdruck vergleicht Anfragen mit null content-length im HTTP-Text:

    int(request.headers["content-length"]) == 0
    

Vorkonfigurierte Regeln

Vorkonfigurierte Regeln verwenden vorkonfigurierte statische Signaturen, reguläre Ausdrücke oder beides für den Abgleich mit HTTP-Anfrageheadern und Suchparametern. Die verfügbaren vorkonfigurierten Regeln basieren auf dem OWASP-Modsecurity-Kernregelsatz Version 3.0.1. Google Cloud Armor bietet zwei vordefinierte Ausdruckssätze:

  • xss-<version>: schützt vor Cross-Site-Scripting-Angriffen
  • sqli-<version>: schützt vor SQL-Injection-Angriffen

Eine Liste aller verfügbaren vorkonfigurierten Regeln finden Sie unter Verfügbare vorkonfigurierte Regeln auflisten.

Weitere Informationen zu vorkonfigurierten Regeln finden Sie im Anwendungsfall Angriffe auf Anwendungsebene mithilfe vorkonfigurierter Regeln abwehren.

Ausdruckssatznamen

Ausdruckssatznamen haben das Format <attack category>-<version field>. Die Angriffskategorie gibt die Art der Angriffe an, die Sie schützen möchten, z. B. xss (websiteübergreifendes Skript) oder sqli (SQL-Injection).

Die unterstützten Versionsfelder sind stable und canary. Hinzufügungen und Änderungen an den Regeln werden zuerst in der canary-Version veröffentlicht. Wenn Ergänzungen und Änderungen als sicher und stabil angesehen werden, gehen sie in die Version stable über.

Mitglieds-IDs von Ausdruckssätzen

Ein Ausdruckssatz enthält mehrere Ausdrücke mit jeweils einer eigenen Kernregelsatz-ID (CRS, Core Rule Set). Der Ausdruckssatz xss-stable enthält beispielsweise den Ausdruck owasp-crs-v020901-id981136-xss, der der Regel-ID 981136 für version 2.9.1 entspricht. Sie können die CRS-IDs verwenden, um bestimmte Ausdrücke von der Verwendung auszuschließen. Dies ist nützlich, wenn ein bestimmter Ausdruck regelmäßig ein falsch-positives Ergebnis auslöst. Weitere Informationen finden Sie unter falsch-positive Informationen zur Fehlerbehebung.

Informationen zum Hauptregelsatz und zur Feinabstimmung bei unterschiedlichen Schweregraden finden Sie unter Google Cloud Armor WAF-Regeln abstimmen.

Operator für vorkonfigurierte Regeln

Ausdrücke Beschreibung
evaluatePreconfiguredExpr(string, LIST)

Gibt "true" zurück, wenn einer der Ausdrücke im angegebenen Ausdruckssatz "true" zurückgibt.

Das erste Argument ist der Name des Ausdrucksatzes, z. B. xss-stable. Das zweite Argument (optional) ist eine durch Kommas getrennte Stringliste mit IDs, die von der Auswertung ausgeschlossen werden sollen. Die Ausschlussliste ist nützlich, wenn ein bestimmtes Mitglied der Ausdrucksgruppe ein falsch-positives Ergebnis auslöst.

Beispiele für vorkonfigurierte Regeln

  • Der folgende Ausdruck verwendet die vorkonfigurierte Regel xss-stable, um XSS-Angriffe abzuwenden:

    evaluatePreconfiguredExpr('xss-stable')
    
  • Der folgende Ausdruck verwendet alle Ausdrücke aus der vorkonfigurierten xss-stable-Regel mit Ausnahme von Mitglieds-IDs 981136 und 981138:

    evaluatePreconfiguredExpr('xss-stable', ['owasp-crs-v020901-id981136-xss',
    'owasp-crs-v020901-id981138-xss'])
    
  • Der folgende Ausdruck verwendet eine vorkonfigurierte Regel, um SQLi-Angriffe über den IP-Adressbereich 198.51.100.0/24 zu reduzieren:

    inIpRange(origin.ip, '198.51.100.0/24') && evaluatePreconfiguredExpr('sqli-stable')
    

Weitere Informationen