フィールド、関数、および式の使用法
アクションとともに、フィールドと式はWAFカスタム・ルールの構成要素である。 この2つの要素は、カスタム・ルールがマッチしたときに使用する基準を定義するときに連動する。
フィールド
HTTP 要求を CIS が受け取ると、要求は検査されて、突き合わせるフィールドのテーブルが生成されます。 このフィールド・テーブルは、現在の要求の処理が行われている間だけ存在します。 これは、式と突き合わせる要求プロパティーを保持するテーブルであると考えてください。
各フィールド値は、以下のようなさまざまな場所から取得される可能性があります。
- トラフィックから直接取得されるプリミティブ・プロパティー (例えば、
http.request.uri.path
)。 - 変換、構成、または基本操作の結果得られる派生値。例えば、
http.request.uri.path
の値をすべて小文字にし、別のフィールドのフィールドとして使用できるようにします。 - 検索、計算、またはその他のインテリジェンス機能によって得られるコンピューター値。例えば、関連するプリミティブ値および派生値を検査する機械学習プロセスによって動的に計算される
cf.threat_score
。
使用可能なフィールド
フィールド名 | タイプ | 値の例 | 注記 |
---|---|---|---|
http.cookie | ストリング | session=A12345;-background=light | ストリングとしての Cookie 全体 |
http.host | ストリング | www.example.com |
完全な要求 URI で使用されるホスト名 |
http.referer | ストリング | HTTP リファラー・ヘッダー | |
http.request.full_uri | ストリング | https://www.example.com/articles/index?section=539061&expand=comments |
Web サーバーが受信した完全な URI (Web サーバーに送信されない #fragment は含まれません) |
http.request.method | ストリング | POST | HTTP メソッド (大文字) |
http.request.uri | ストリング | /articles/index?section=539061&expand=comments | 要求の絶対 URI |
http.request.uri.path | ストリング | /articles/index | 要求のパス |
http.request.uri.query | ストリング | section=539061&expand=comments | 照会ストリング全体 (区切り接頭部「?」を除く) |
http.user_agent | ストリング | Mozilla/5.0 (X11、Linux x86_64) AppleWebKit/537.36 (Gecko のような KHTML) Chrome/65.0.3325.181 Safari/537.36 | HTTP ユーザー・エージェント全体 |
http.x_forwarded_for | ストリング | 完全な X-Forwarded-For HTTP ヘッダー | |
ip.src | IP アドレス | 93.155.208.22 | クライアントの TCP IP アドレス。必要に応じて元のクライアントの実際のクライアント IP を反映するように調整することもできます (例えば、X-Forwarded-For や X-Real-IP のような HTTP ヘッダーを使用) |
ip.geoip.asnum | 数値 | 222 | 自律システム (AS) 番号 |
ip.geoip.country | ストリング | GB | 2文字の国コード |
ssl | ブール値 | はい | クライアントへの HTTP 接続が暗号化されているかどうか |
これらの標準フィールドは、Wireshark 表示フィールド参照の命名規則に従います。 ただし、上記の値の例には多少の違いがある可能性があります。
標準フィールドに加えて、以下の Cloudflare 定義のフィールドも使用できます。
フィールド名 | タイプ | 値の例 | 注記 |
---|---|---|---|
cf.client.bot | ブール値 | はい | このフィールドは、善意か悪意かにかかわらず、既知のボットまたはクローラーからの要求であるかどうかを示します。 |
cf.threat_score | 数値 | 0 から 100 までの値 | このフィールドはリスク・スコアを表し、0 は Cloudflare によって決定される低リスクを示します。 10 を超える値はスパマーまたはボットを表す可能性があり、40 を超える値はインターネット上の悪質行為者を指す可能性があります。 60を超える値を見ることはまれなので、WAFのカスタムルールを調整し、10を超える値をチャレンジし、50を超える値をブロックするようにする。 |
関数
カスタム・ルール言語には、フィールドを変換する関数がいくつもある。
これらは現在エクスプレッション・ビルダーではサポートされていません。
関数名 | 引数の型 | 戻りの型 | 使用例 | 注記 |
---|---|---|---|---|
下位 | ストリング | ストリング | lower(http.host) == "www.example.com" |
ストリング・フィールドを小文字に変換します。 大文字の ASCII バイトのみが変換され、その他のバイトはすべてそのまま残されます。 |
上 | ストリング | ストリング | upper(http.host) == "www.example.com" |
ストリング・フィールドを大文字に変換します。 小文字の ASCII バイトのみが変換され、その他のバイトはすべてそのまま残されます。 |
式
式は、着信トラフィックに対する突き合わせ結果に基づいて true または false を返します。 以下に例を示します。
http.host eq "www.example.com" and ip.src in 92.182.212.0/24
この例では、2 つの単一式が 1 つの複合式を構成しています。 それぞれの単一式を 1 つの条件と考えてください。 and ロジックを適用する前に各条件が個別に評価されてから、複合式の最終結果が判別されます。
最初の単一式を見ると、以下のものが含まれていることが分かります。
- 1 つのフィールド -
http.host
- 1 つの比較演算子 -
eq
- 1 つの値 -
"www.example.com"
すべての条件が同じ構造を持つわけではありません。 異なる構造を使用する追加の例については、次のセクションで説明します。
比較演算子
式では、以下の比較演算子を使用できます。
英語 | C 形式 | 説明 |
---|---|---|
eq | == | 等しい |
ne | != | 等しくない |
リトアニア | < | より小さい |
le | <= | 以下 |
gt | より大きい | |
ge |
|
以上 |
含む | 次を含む | |
が次の値に一致する | ~ | Re2 風の正規表現 |
in | 値が値セットの中にある。 「..」表記を使用して範囲をサポートします。 | |
not | ! | ブール比較を参照 |
bitwise_and | & | ビット・フィールド値の比較 |
現在、式ビルダーは英語の演算子しかサポートしていません。
式には、英語と C 形式の演算子を混在させることができます。 例えば、ip.src eq 93.184.216.34
は ip.src == 93.184.216.34
に相当します。
特定の比較演算子は、タイプに基づいて特定のフィールドに適用されます。 以下の表は、さまざまなフィールド・タイプで使用可能な演算子の例を示しています。
英語 | C 形式 | ストリング | IP アドレス | 数値 |
---|---|---|---|---|
eq | == | http.request.uri.path eq "/articles/2008/" | ip.src eq 93.184.216.0 | cf.threat_score eq 10 |
ne | != | http.request.uri.path ne "/articles/2010/" | ip.src ne 93.184.216.0 | cf.threat_score ne 60 |
リトアニア | < | http.request.uri.path lt "/articles/2009/" | cf.threat_score lt 10 | |
le | <= | http.request.uri.path le "/articles/2008/" | cf.threat_score le 20 | |
gt | http.request.uri.path gt "/articles/2006/" | cf.threat_score gt 25 | ||
ge |
|
以上 | cf.threat_score ge 60 | |
含む | http.request.uri.path contains "/articles/" | |||
が次の値に一致する | ~ | http.request.uri.path ~ " [^/articles/2007-8/$] " | ||
in | http.request.method in { "HEAD" "GET" } | ip.src in { 93.184.216.0 93.184.216.1 } | cf.threat_score in {0 2 10} |
ストリング値を使用した式の評価では、大/小文字が区別されます。 そのため、カスタム・ルールでは複数のテスト条件を定義する必要があるかもしれない。 エンタープライズのお客様は、matches 演算子で正規表現を使用して、単一式で複数のバリエーションを取り込むことができます。
ブール比較
ブール型のフィールド (例えば、ssl
) の場合、true 条件を評価するときに、フィールドが式に単独で表示されます。 false 条件の場合、not 演算子が適用されます。
はい | いいえ |
---|---|
ssl | not ssl |
複合式
論理演算子を使用して複数の単一式をグループ化することにより、複合式を作成できます。
英語 | C 形式 | 説明 | 例 | 優先順位 |
---|---|---|---|---|
not | ! | 論理 NOT | not ( http.host eq "www.example.com" and ip.src in 93.184.216.0/24 ) |
1 |
および | && | 論理 AND | http.host eq "www.example.com" and ip.src in 93.184.216.0/24 |
2 |
xor | ^^ | 論理 XOR | http.host eq "www.example.com" xor ip.src in 93.184.216.0/24 |
3 |
または | || | 論理 OR | http.host eq "www.example.com" or ip.src in 93.184.216.0/24 |
4 |
優先順位を変更するには、括弧を使用して式をグループ化します。 括弧を使用しない場合、式は暗黙的に標準的な優先順位に基づいてグループ化されます。
ssl and http.request.uri.path eq /login or http.request.uri.path eq /oauth
明示的なグループ化の適用:
(ssl and http.request.uri.path eq /login) or http.request.uri.path eq /oauth
括弧を使用して or の優先順位を高くします。
ssl and (http.request.uri.path eq /login or http.request.uri.path eq /oauth)
グループ化に not
が使用されているときは、単一の比較を否定するために使用できます。 例えば、not ip.src eq 93.184.216.0
は not (ip.src eq 93.184.216.0)
と同等です。
最後に、グループ化された式を否定することもできます。
not (http.request.method eq "POST" and http.request.uri.path eq "/login")
Wireshark 表示フィルターとの相違
カスタム・ルール表現は、 Wireshark のディスプレイ・フィルターにヒントを得ている。 ただし、実装は以下の点で異なります。
- CIDR IP 等価テストの場合、Wireshark では
ip.src == 1.2.3.0/24
の形式の範囲を指定できますが、CIS は単一の IP アドレスを使用する等価テストのみをサポートします。 CIDR を比較するために、in
演算子を使用します。例えば、ip.src in {1.2.3.0/24}
のようになります。 - Wireshark では、
ssl
は、さまざまなタイプの他の何百ものフィールドで構成されるプロトコル・フィールドであり、複数の方法での比較に使用できます。 しかし、カスタム・ルールでは、ssl
は、クライアントから CIS への接続が暗号化されているかどうかを判断するために使用される単一のブーリアン・フィールドである。 slice
演算子はサポートされていません。- すべての関数がサポートされているわけではありません。 現時点では、
len()
とcount()
はサポートされていません。