ADC

API 仕様を使用した高度なポリシー表現

Web App Firewall のインポートページに統一された API 仕様をインポートし、その API 仕様を使用して高度なポリシー式を作成できます。式に基づいて、着信 API トラフィックに適切なアクションを設定できます。 API 仕様には、エンドポイント、スキーマ、およびパラメータが含まれています。受信 API トラフィックのタイプは gRPC でも REST でもかまいません。

http.req.api式を使用して、API 仕様で定義されている受信リクエストのエンドポイントを識別できます。

構文:

http.req.api (“API_Spec_Name”)

例:

set responder policy reject -rule !"http.req.api(\"myspec\").endpoint(\"POST"\",\"/v1/pet/\")

トラフィックが API 仕様で指定されているエンドポイントと一致しない場合、システムはすべてのトラフィックを拒否します。

API スキーマの高度なポリシー表現

次の操作を使用して、API の高度なポリシー式を作成できます:

前提条件。

Web App Firewall のインポートオプションを使用して API 仕様ファイルをインポートします。

詳細については、「 インポート」を参照してください。

HTTP メソッドでトラフィックを照合する式

HTTP 文字列メソッドを使用して、一致する API を制限します。この文字列には、"で区切られた 1 つ以上の HTTP メソッドを含めることができます。|"またはワイルドカード (*) を含めることができます。複数のメソッドが指定されている場合、式はメソッド間の OR 条件として評価されます。 たとえば、GET|PUT|DELETE は、受信したリクエストを HTTP メソッド GET または PUT または DELETE と照合します。

例:

  • 単一の HTTP メソッド

    http.req.api("petstore").method("POST").text("id").eq("1")

  • マルチメソッド http.req.api("petstore").method("GET|DELETE").exists

URL でトラフィックを照合する式

PATH (URL 文字列) は、ワイルドカードを含むエンドポイントの照合に使用されます。1 つのアスタリスク (*) は 1 つのセグメントと一致し、2 つのアスタリスク (**) は 2 つのアスタリスクの前にプレフィックスが付いたすべてのセグメントと一致します。

例:

  • http.api("petstore").path("/v1/pets/*/find") 次の条件でのみ受信トラフィックを照合します。 /v1/pets/*/find
  • http.api("petstore").path("/v1/pets/**") 以下で始まるすべてのエンドポイントにマッチします /v1/pets

API 名でトラフィックを照合する式

APINAME (名前文字列) 式を使用して、一致するトラフィックを API 名で制限します。次の例に示すように、show コマンドを実行して API 名の文字列を使用することもできます:

    show api spec gspec
       Name: gspec
       File: gfile
       Type: OAS
<!--NeedCopy-->
  • ファイルタイプが OAS の場合、operation IDがエンドポイント名になります。

    例:次の OAS からのエンドポイントに対して受信トラフィックを検証するには:

    operationId: adexchangebuyer.accounts.list

    次のポリシー表現を使用してください。 http.req.api("schema").apiname("adexchangebuyer.accounts.list").exists

  • ファイルタイプが proto の場合、service namerpc nameがエンドポイント名になります。

    次の例では、EchoService.Echo がエンドポイントです。 サービスEchoService{rpc { rpc Echo(EchoReq) returns (EchoResp) { option (google.api.http) = { get: “/v1/{name=messages/*}” }; } }

API 仕様の値にアクセスする

API 仕様のフィールドには、名前、パス、クエリパラメータ、JSON 本文、または gRPC 本体でアクセスできます。パラメーターのタイプを定義するには、PI 式を使用します。次のタイプがサポートされています:

  • num-整数値。
  • ulong-長整数値。
  • bool-ブーリアン値。
  • double -ダブル値。
  • text-任意の長さの文字列。

例: 値 1 と一致する数値パラメータを使用して受信トラフィックを検証するには、次の式を使用します:

http. req.api("petstore.proto"). APIName ("TestPet").NUM("test_num1").eq(1)

繰り返しフィールドの値にアクセスする

API で繰り返されるオブジェクトにアクセスするには、2 番目のパラメータを繰り返しインデックスとして使用します。 配列の外部にアクセスすると、値は未定義になります。

例:

「FindPets」エンドポイントの 5 番目のタグを取得するには、以下を使用します。 http.req.api("petstore.proto", "FindPets').TEXT( "tags", 5 ).contains("mytag")

繰り返されるタグ文字列の 5 番目のタグを取得するには、以下を使用します。 /v1/pets?tags=1&tags=2&tags=3&tags=4&tags=mytag&tags=6

ネストされたオブジェクトの値にアクセスする

オブジェクトは他のオブジェクトの中にネストできます。同じドキュメント内のネストされたオブジェクトに同じフィールド名があってもかまいません。ただし、フルアクセス名は引き続き一意である必要があります。 ネストされたフィールドにアクセスするには、フィールド名を「」で連結します。区切り文字としての”.”(ドット)。

例:kennel.location.state を使用して、次の JSON からカリフォルニアを取得します。

{ 「犬小屋」: { 「場所」: { 「州」:「カリフォルニア」 } }

http. req.api("petstore.proto", "TestPet").text( "kennel.location.state" ).contains("California")

オブジェクト式を使用して値にアクセスする

Object () 式は、繰り返されるオブジェクトのサブフィールドにアクセスするときに使用されます。異なる値で構成されたオブジェクトが 2 つ以上ある場合は、式を作成して 1 つの値に固有のオブジェクトを検証できます。 たとえば、次の JSON 本文では、オブジェクト「foo」には 1 つと「なし」の 2 つの値があります。 { “foo” : [ { “bar” : “one” }, { “bar” : “none” } ] }

値を「なし」と比較するには、式を次のように構成できます:

HTTP. req.api("schema").object("foo",1).text("bar").eq("none")

API 仕様を使用した高度なポリシー表現