ADC

Expressions de politique avancées utilisant la spécification de l’API

Vous pouvez importer des spécifications d’API unifiées sur la page d’importation de Web App Firewall, puis créer une expression de stratégie avancée à l’aide des spécifications de l’API. Vous pouvez configurer les actions appropriées pour le trafic d’API entrant en fonction des expressions. Une spécification d’API contient le point de terminaison, le schéma et les paramètres. Le trafic API entrant peut être de type gRPC ou REST.

Vous pouvez utiliser l’ http.req.api expression pour identifier les points finaux dans les demandes entrantes définies dans la spécification de l’API.

Syntaxe :

http.req.api (“API_Spec_Name”)

Exemple :

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

Le système rejette tout le trafic s’il ne correspond pas aux points de terminaison spécifiés dans la spécification de l’API.

Expression de stratégie avancée pour le schéma d’API

Vous pouvez créer des expressions de stratégie avancées pour l’API à l’aide des opérations suivantes :

Prérequis.

Importez le fichier de spécification de l’API à l’aide de l’option d’importation du Web App Firewall.

Pour plus d’informations, consultez la section Importations.

Expression permettant de faire correspondre le trafic par méthode HTTP

Utilisez une méthode de chaîne HTTP pour restreindre les API correspondantes. Cette chaîne peut contenir une ou plusieurs méthodes HTTP séparées par »|« ou peut contenir un caractère générique (*). Lorsque plusieurs méthodes sont spécifiées, l’expression renvoie à une condition OR entre les méthodes. Par exemple, GET|PUT|DELETE associe une requête entrante à la méthode HTTP GET OR PUT OR DELETE.

Exemple :

  • Méthode HTTP unique

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

  • Méthode multiple http.req.api("petstore").method("GET|DELETE").exists

Expression permettant de faire correspondre le trafic par URL

PATH (chaîne d’URL) est utilisé pour faire correspondre les points de terminaison qui incluent des caractères génériques. L’astérisque simple (*) correspond à un seul segment tandis que le double astérisque (**) correspond à tous les segments possibles préfixés avant le double astérisque.

Exemple :

  • http.api("petstore").path("/v1/pets/*/find") Correspond au trafic entrant uniquement avec /v1/pets/*/find
  • http.api("petstore").path("/v1/pets/**") Correspond à tous les terminaux, en commençant par /v1/pets

Expression permettant de faire correspondre le trafic par nom d’API

Utilisez l’expression APINAME (chaîne de nom) pour restreindre le trafic correspondant par nom d’API. Vous pouvez également utiliser la chaîne du nom de l’API en exécutant la commande show comme illustré dans l’exemple suivant :

    show api spec gspec
       Name: gspec
       File: gfile
       Type: OAS
<!--NeedCopy-->
  • Le operation ID sert de nom du point de terminaison si le type de fichier est OAS.

    Exemple : Pour valider le trafic entrant par rapport au point de terminaison à partir de l’OAS suivant :

    ID d’opération : adexchangebuyer.accounts.list

    Utilisez l’expression de stratégie suivante : http.req.api("schema").apiname("adexchangebuyer.accounts.list").exists

  • service name et rpc name sert de nom du point de terminaison si le type de fichier est proto.

    Dans l’exemple suivant, EchoService.Echo est le point de terminaison : service EchoService { rpc Echo(EchoReq) returns (EchoResp) { option (google.api.http) = { get: “/v1/{name=messages/*}” }; } }

Accédez aux valeurs de la spécification de l’API

Vous pouvez accéder aux champs des spécifications de l’API par nom, chemin, paramètres de requête, corps JSON ou corps gRPC. Pour définir le type du paramètre, utilisez des expressions PI. Les types suivants sont pris en charge :

  • num - Une valeur entière.
  • ulong - Une valeur entière longue.
  • bool - Une valeur booléenne.
  • double : valeur double.
  • texte : chaîne de n’importe quelle longueur.

Exemple : Pour valider le trafic entrant à l’aide d’un paramètre numérique correspondant à la valeur 1, utilisez l’expression suivante :

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

Accédez à la valeur des champs répétés

Pour accéder à des objets répétés dans les API, utilisez le second paramètre comme index répétitif. L’accès à l’extérieur du tableau entraîne une valeur indéfinie.

Exemple :

Pour récupérer la cinquième balise dans le terminal « FindPets », utilisez : http.req.api("petstore.proto", "FindPets').TEXT( "tags", 5 ).contains("mytag")

Pour récupérer la cinquième balise de la chaîne de balises répétées, utilisez : /v1/pets?tags=1&tags=2&tags=3&tags=4&tags=mytag&tags=6

Accédez aux valeurs des objets imbriqués

Les objets peuvent être imbriqués dans d’autres objets. Le même nom de champ peut apparaître dans les objets imbriqués d’un même document. Toutefois, le nom d’accès complet doit toujours être unique. Pour accéder aux champs imbriqués, concaténez les noms des champs avec un ». « (point) comme séparateur.

Exemple : utilisez kennel.location.state pour récupérer la Californie à partir du JSON suivant.

{ “kennel” : { “location” : { “state” : “California” } } }

Expression

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

Accéder à la valeur à l’aide d’une expression d’objet

L’expression Object() est utilisée lors de l’accès aux sous-zones d’objets répétés. Si deux objets ou plus sont configurés avec des valeurs différentes, vous pouvez créer une expression pour valider l’objet spécifique à une valeur. Par exemple, dans le corps JSON suivant, l’objet « foo » possède deux valeurs, à savoir une et aucune. { “foo” : [ { “bar” : “one” }, { “bar” : “none” } ] }

Pour comparer la valeur à aucune, vous pouvez configurer l’expression comme suit :

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

Expressions de politique avancées utilisant la spécification de l’API