条件の理解
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
最大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 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¶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"]
}
}
}
}
参照先
カテゴリ |
値 |
---|---|
タイプ |
string |
説明 |
TCPソースIPアドレスを含む文字列。IPv6アドレスは、RFC 5952に従って正規の形式で表されます。 |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
"10.0.0.1", "1.2.3.4" |
カテゴリ |
値 |
---|---|
タイプ |
number |
説明 |
TCPソース・ポート |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
49152 |
カテゴリ |
値 |
---|---|
タイプ |
string | null |
説明 |
ソースIPアドレスが属する国のISO 3166-1 alpha-2国コード。国が不明な場合はnullにできます。 |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
"US" |
カテゴリ |
値 |
---|---|
タイプ |
number | null |
説明 |
ソースIPアドレスが属するASN (自律システム番号)。IPアドレスがプライベートの場合はnullにできます。 |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
2122, 1278 |
カテゴリ |
値 |
---|---|
タイプ |
string |
説明 |
TCP宛先IPアドレスを含む文字列。 |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
"10.0.0.1" |
カテゴリ |
値 |
---|---|
タイプ |
number |
説明 |
TCP宛先ポート |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
80 |
カテゴリ |
値 |
---|---|
タイプ |
string |
説明 |
接続のプロトコル("http"または"https")。 |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
"https" |
カテゴリ |
値 |
---|---|
タイプ |
string |
説明 |
HTTPリクエスト"Host"ヘッダーの値。"Host"リクエスト・ヘッダーは、リクエストの送信先サーバーのホストおよびポート番号を指定します。 |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
"http://www.example.com"、"api.example.com:8080" |
カテゴリ |
値 |
---|---|
タイプ |
string |
説明 |
HTTPリクエスト・メソッド |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
"GET"、"POST" |
カテゴリ |
値 |
---|---|
タイプ |
string |
説明 |
HTTPプロトコル・バージョン |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
"1.1", "2.0" |
カテゴリ |
値 |
---|---|
タイプ |
string |
説明 |
HTTPリクエスト・ターゲットの絶対パス部分。問合せ部分は含まれません。常に"/"で始まります。 |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
"/api/v1"、"/index.html"、"/" |
カテゴリ |
値 |
---|---|
タイプ |
string |
説明 |
接頭辞のないHTTPリクエスト・ターゲットの問合せパラメータ。 |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
"foo=bar&multi=1&multi=2", "multi=one&multi=two&multi=3&encoded=two%20words", "" |
カテゴリ |
値 |
||||||
---|---|---|---|---|---|---|---|
タイプ |
object |
||||||
説明 |
オブジェクト構造に解析されたHTTPリクエスト・ターゲットの問合せ部分。ここでは:
キーと値は、URLエスケープ・ルールに従ってエスケープされません。 |
||||||
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
||||||
値の例 |
|
カテゴリ |
値 |
---|---|
タイプ |
string |
説明 |
HTTPリクエスト・ターゲットの問合せ接頭辞。 問合せ文字列が存在する場合、常に"?"です。 問合せ文字列が存在しない場合、空の文字列が含まれます。 |
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
値の例 |
"?"、"" |
カテゴリ |
値 |
||||
---|---|---|---|---|---|
タイプ |
object |
||||
説明 |
オブジェクト構造に解析されたHTTPリクエスト・ヘッダー。ここでは:
|
||||
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
||||
値の例 |
|
カテゴリ |
値 |
||||
---|---|---|---|---|---|
タイプ |
object |
||||
説明 |
オブジェクト構造に解析された"Cookie" HTTPリクエスト・ヘッダーを使用して渡されたHTTP Cookie。ここでは:
|
||||
使用可能 |
requestAccessControl、requestRateLimiting、requestProtection、responseAccessControl、responseProtection |
||||
値の例 |
|
カテゴリ |
値 |
---|---|
タイプ |
number |
説明 |
HTTPレスポンス・コード |
使用可能 |
responseAccessControl、responseProtection |
値の例 |
200 |
カテゴリ |
値 |
||||
---|---|---|---|---|---|
タイプ |
object |
||||
説明 |
オブジェクト構造に解析されたHTTPレスポンス・ヘッダー。ここでは:
|
||||
使用可能 |
responseAccessControl、responseProtection |
||||
値の例 |
|
大/小文字を区別しない文字列照合
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:
|
式 | address_in_network_address_list(connection.source.address, ['ocid1.webappfirewallnetworkaddresslist...a']) |
結果 | true |
項目 | 詳細 |
---|---|
指定された入力 |
{ "connection": { "source": { "address": "1.1.1.1" } } } |
指定されたNAL |
ocid1.webappfirewallnetworkaddresslist...a:
ocid1.webappfirewallnetworkaddresslist...b:
|
式 | 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:
|
式 |
vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...a'] ) |
結果 |
true |
項目 | 詳細 |
---|---|
指定された入力 |
{ "connection": { "source": { "address": "10.0.0.1" } }, "paResource": { "vcnOcid": "ocid1.vcn...a" } } |
指定されたNAL |
ocid1.webappfirewallnetworkaddresslist...b:
|
式 | vcn_address_in_network_address_list( connection.source.address, connection.paResource.vcnOcid, ['ocid1.webappfirewallnetworkaddresslist...b'] ) |
結果 | false |