条件の理解

WAFポリシーに関連付けられたルールの条件を理解して構成します。

WAFはJMESPath言語をルール条件言語として使用します。JMESPathは、JMESPath式を記述するために使用できるJSONの問合せ言語(https://jmespath.org/specification.htmlJMESPathセレクタを参照)で、各式は入力としてJSONドキュメントを使用し(入力ドキュメント)、変換済または新しいJSONドキュメントを返します(出力ドキュメント)。

WAFでは、各ルールは、条件としてJMESPath式を受け入れます。HTTPリクエストまたはHTTPレスポンス(ルールのタイプに応じて)は、WAFルールをトリガーします。ルールを評価する際、WAFサービスはルールのJMESPath式(条件)を評価し、評価をトリガーしたHTTPリクエストまたはHTTPレスポンスの詳細を含む入力JSONドキュメントを提供します。次に、評価されたJMESPath式の結果を使用して、ルールで指定されたアクションを実行するかどうかが決定されます。

WAFのJMESPath条件の戻り値は、ブール値に変換されます。次の値は"false"に変換されます:

  • 空のリスト: []
  • 空のオブジェクト: {}
  • 空の文字列: ""
  • Falseブール: false
  • Null値: null
他のすべての値は"true"に変換されます。trueはルールのアクションが実行されることを意味し、falseはアクションが実行されないことを意味します。

最大1,024文字のJMESPath条件を作成できます。

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リクエスト・メソッドの条件
# HTTP request method is one of
contains(['GET', 'POST'], http.request.method)

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')

複数条件

# 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')

入力JSONドキュメント構造

JMESPath式を評価する際、WAFは、評価をトリガーしたHTTPリクエストまたはHTTPレスポンスの詳細を含む入力JSONドキュメントを提供します。入力JSONドキュメントは、常にJSONオブジェクトです。

次の詳細を含むHTTPリクエストの場合:

  • ソースIPアドレスおよびポート: 129.146.10.1:48152

  • ソースIPアドレスが属する国コード: US

  • ソースIPアドレスが属するASN: 31898

  • 宛先IPアドレスおよびポート: 205.147.88.0:80

  • 宛先ホスト: example.com

  • プロトコル: 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

次のJSON入力ドキュメントが生成され、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&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"]
      }
    }
  }
}

リファレンス

connection.source.address

カテゴリ

タイプ

string

説明

TCPソースIPアドレスを含む文字列。IPv6アドレスは、RFC 5952に従って正規の形式で表されます。

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

"10.0.0.1", "1.2.3.4"

connection.source.port

カテゴリ

タイプ

number

説明

TCPソース・ポート

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

49152

connection.source.geo.countryCode

カテゴリ

タイプ

string | null

説明

ソースIPアドレスが属する国のISO 3166-1 alpha-2国コード。国が不明な場合はnullにできます。

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

"US"

connection.source.routing.asn

カテゴリ

タイプ

number | null

説明

ソースIPアドレスが属するASN (自律システム番号)。IPアドレスがプライベートの場合はnullにできます。

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

2122, 1278

connection.destination.address

カテゴリ

タイプ

string

説明

TCP宛先IPアドレスを含む文字列。

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

"10.0.0.1"

connection.destination.port

カテゴリ

タイプ

number

説明

TCP宛先ポート

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

80

connection.protocol

カテゴリ

タイプ

string

説明

接続のプロトコル("http"または"https")。

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

"https"

http.request.host

カテゴリ

タイプ

string

説明

HTTPリクエスト"Host"ヘッダーの値。"Host"リクエスト・ヘッダーは、リクエストの送信先サーバーのホストおよびポート番号を指定します。

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

"http://www.example.com"、"api.example.com:8080"

http.request.method

カテゴリ

タイプ

string

説明

HTTPリクエスト・メソッド

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

"GET"、"POST"

http.request.version

カテゴリ

タイプ

string

説明

HTTPプロトコル・バージョン

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

"1.1", "2.0"

http.request.url.path

カテゴリ

タイプ

string

説明

HTTPリクエスト・ターゲットの絶対パス部分。問合せ部分は含まれません。常に"/"で始まります。

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

"/api/v1"、"/index.html"、"/"

http.request.url.query

カテゴリ

タイプ

string

説明

接頭辞のないHTTPリクエスト・ターゲットの問合せパラメータ。

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

"foo=bar&multi=1&multi=2", "multi=one&multi=two&multi=3&encoded=two%20words", ""

http.request.url.queryParameters

カテゴリ

タイプ

object

説明

オブジェクト構造に解析されたHTTPリクエスト・ターゲットの問合せ部分。ここでは:

  • キー: 問合せパラメータの名前。

  • 値: 名前が"key"の値のリスト。

キーと値は、URLエスケープ・ルールに従ってエスケープされません。

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

HTTPリクエスト・ターゲットの問合せ部分

解析されたオブジェクト構造

?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

カテゴリ

タイプ

string

説明

HTTPリクエスト・ターゲットの問合せ接頭辞。

問合せ文字列が存在する場合、常に"?"です。

問合せ文字列が存在しない場合、空の文字列が含まれます。

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

"?"、""

http.request.headers

カテゴリ

タイプ

object

説明

オブジェクト構造に解析されたHTTPリクエスト・ヘッダー。ここでは:

  • キー: 小文字に変換されたヘッダーの名前。

  • 値: 名前が"key"のヘッダー値のリスト。

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

RAW HTTPリクエスト・ヘッダー

解析されたオブジェクト構造

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

カテゴリ

タイプ

object

説明

オブジェクト構造に解析された"Cookie" HTTPリクエスト・ヘッダーを使用して渡されたHTTP Cookie。ここでは:

  • キー: Cookieの名前。

  • 値: 名前が"key"のCookie値のリスト。

使用可能

requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection

値の例

HTTPリクエスト・ヘッダー"Cookie"の値

解析されたオブジェクト構造

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

カテゴリ

タイプ

number

説明

HTTPレスポンス・コード

使用可能

responseAccessControl、responseProtection

値の例

200

http.response.headers

カテゴリ

タイプ

object

説明

オブジェクト構造に解析されたHTTPレスポンス・ヘッダー。ここでは:

  • キー: 小文字に変換されたヘッダーの名前。

  • 値: 名前が"key"のヘッダー値のリスト。

使用可能

responseAccessControl、responseProtection

値の例

RAW HTTPレスポンス・ヘッダー

解析されたオブジェクト構造

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

大/小文字を区別しない文字列照合

WAFでは、JMESPathでデフォルトでサポートされている文字列照合関数に加えて、大文字と小文字を区別せずに文字列を照合できる4つの関数のサポートが追加されています:

  • i_equals (==演算子の大/小文字を区別しないバリアント)。
  • i_contains (contains関数の大/小文字を区別しないバリアント)。
  • i_starts_with (starts_with関数の大/小文字を区別しないバリアント)。
  • i_ends_with (ends_with関数の大/小文字を区別しないバリアント)。

i_equals

boolean i_equals(string $left, string $right)
大/小文字を区別せずに比較すると、文字列$leftと$rightが等しい場合にtrueを返します($leftと$rightの両方の文字列は小文字に変換されます。英語の文字のみが小文字に変換されます)。それ以外の場合は、falseを返します。
指定 結果
"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)
contains関数の大/小文字を区別しないバリアント。

大/小文字を区別せずに比較すると、指定された$subjectが文字列の場合、この関数は、指定された$search引数が文字列に含まれている場合はtrueを返します($leftと$rightの両方の文字列は小文字に変換されます。英語の文字のみが小文字に変換されます)。それ以外の場合、この関数はfalseを返します。

$subjectが配列の場合、この関数は、配列内の少なくとも1つの要素が指定の$search値と等しい場合はtrueを返し、それ以外の場合はfalseを返します。

$searchが文字列の場合、比較はi_equals()関数と同じロジック(大/小文字を区別しない比較)を使用して行われます(個々の$subject配列要素と$search文字列の両方が小文字に変換されます。英語の文字のみが小文字に変換されます)。

$searchが文字列でない場合、比較は標準の==演算子を使用して行われます。

指定 結果
"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)
大/小文字を区別せずに比較すると、$subjectが$prefixで始まる場合にtrueを返します($leftと$rightの両方の文字列は小文字に変換されます。英語の文字のみが小文字に変換されます)。それ以外の場合、この関数はfalseを返します。
指定 結果
"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)
大/小文字を区別せずに比較すると、$subjectが$prefixで終わる場合にtrueを返します($leftと$rightの両方の文字列は小文字に変換されます。英語の文字のみが小文字に変換されます)。それ以外の場合、この関数はfalseを返します。
指定 結果
"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アドレスの照合

WAFでは、IPアドレスをCIDR範囲のリストまたはWAFネットワーク・アドレス・リスト・リソースと照合できる複数の機能のサポートが追加されています:

  • address_in (IPアドレスをCIDR範囲のリストと照合します)。

  • address_in_network_address_list (IPアドレスをWAFネットワーク・アドレス・リスト・リソースと照合します)。

  • vcn_address_in_network_address_list (VCN IDを持つIPアドレスをWAFネットワーク・アドレス・リスト・リソースと照合します)。

address_in

boolean address_in(string $ip_address, array[string] $cidr_subnets)

指定された$ip_addressが、$cidr_subnetsで指定されたCIDRサブネットの少なくとも1つに含まれている場合は、trueを返します。それ以外の場合は、falseを返します。

$ip_addressは、IPアドレスを含む文字列である必要があります。

$cidr_subnetsは、それぞれ1つのCIDRサブネットを含む文字列の配列である必要があります。

指定 結果
{
  "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)
指定された$ip_addressが、指定されたネットワーク・アドレス・リスト(CIDRサブネットのリストを含むWAFリソース)の少なくとも1つに含まれている場合は、trueを返します。それ以外の場合は、falseを返します。

$ip_addressは、IPアドレスを含む文字列である必要があります。

$nal_id引数は、IDでWAF NetworkAddressListリソースを参照する文字列の配列である必要があります。参照されるすべてのNetworkAddressListsのタイプは、"ADDRESSES"である必要があります。

例1

項目 詳細
指定された入力
{
  "connection": {
    "source": {
      "address": "1.1.1.1"
    }
  }
}
指定されたNAL

ocid1.webappfirewallnetworkaddresslist...a:

  • 1.1.0.0/16
  • 2.2.0.0/16
address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a'])
結果 true
例2

項目 詳細
指定された入力
{
  "connection": {
    "source": {
      "address": "1.1.1.1"
    }
  }
}
指定されたNAL

ocid1.webappfirewallnetworkaddresslist...a:

  • 1.1.0.0/16
  • 2.2.0.0/16

ocid1.webappfirewallnetworkaddresslist...b:

  • 3.3.0.0/16
address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...b'])
結果 false

vcn_address_in_network_address_list

boolean vcn_address_in_network_address_list(string $ip_address, string $vcn_id, array[string] $nal_ids)
指定されたVCN $vcn_id内の$ip_addressが、指定されたネットワーク・アドレス・リスト(CIDRサブネットのリストを含むWAFリソース)の少なくとも1つに含まれている場合は、trueを返します。それ以外の場合は、falseを返します。

$ip_addressは、IPアドレスを含む文字列である必要があります。

$vcn_idは、VCNのOCIDを含む文字列である必要があります。

$nal_idsは、IDでWAF NetworkAddressListリソースを参照する文字列の配列である必要があります。参照されるすべてのNetworkAddressListsのタイプは、"VCN_ADDRESSES"である必要があります。

例1

項目 詳細
指定された入力
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
指定されたNAL

ocid1.webappfirewallnetworkaddresslist...a:

  • ocid1.vcn...aの10.0.0.0/16
  • ocid1.vcn...bの10.1.0.0/16
vcn_address_in_network_address_list(
  connection.source.address,
  connection.paResource.vcnOcid,
  ['ocid1.webappfirewallnetworkaddresslist...a']
)
結果

true

例2

項目 詳細
指定された入力
{
  "connection": {
    "source": {
      "address": "10.0.0.1"
    }
  },
  "paResource": {
    "vcnOcid": "ocid1.vcn...a"
  }
}
指定されたNAL

ocid1.webappfirewallnetworkaddresslist...b:

  • ocid1.vcn...cの10.0.0.0/16
vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...b'] )
結果 false