フィールド、関数、および式の使用法
ファイアウォールルールは非推奨です。 CIS 既存のファイアウォールルールを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 |
ウェブサーバーが受信した完全なURI(ウェブサーバーに送信されない _#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アドレス。これは、(例えば、X-Forwarded-ForやX-Real-IPのような HTTP ヘッダを使用することによって)必要に応じて、オリジナルクライアントの実際のクライアントIPを反映するように調整することができる |
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を超える値を見ることはまれなので、ファイアウォールのルールを調整して、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 |
複合式
論理演算子を使って2つ以上の単一式をグループ化し、複合式を作成することができます。
英語 | 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()
はサポートされていません。