1.20. Utilisation du module WebAssembly de 3scale


Note

Le module threescale-wasm-auth fonctionne sur les intégrations de 3scale API Management 2.11 ou plus récent avec Red Hat OpenShift Service Mesh 2.1.0 ou plus récent.

Le module threescale-wasm-auth est un module WebAssembly qui utilise un ensemble d'interfaces, connues sous le nom d'interfaces binaires d'application (ABI). Cette interface est définie par la spécification Proxy-WASM pour piloter tout logiciel qui implémente l'ABI afin qu'il puisse autoriser les requêtes HTTP contre 3scale.

En tant que spécification ABI, Proxy-WASM définit l'interaction entre un logiciel nommé host et un autre nommé module, program ou extension. L'hôte expose un ensemble de services utilisés par le module pour effectuer une tâche et, dans le cas présent, pour traiter les demandes de proxy.

L'environnement hôte est composé d'une machine virtuelle WebAssembly qui interagit avec un logiciel, dans ce cas, un proxy HTTP.

Le module lui-même est isolé du monde extérieur, à l'exception des instructions qu'il exécute sur la machine virtuelle et de l'ABI spécifiée par Proxy-WASM. Il s'agit d'un moyen sûr de fournir des points d'extension aux logiciels : l'extension ne peut interagir que de manière bien définie avec la machine virtuelle et l'hôte. L'interaction fournit un modèle informatique et une connexion au monde extérieur que le proxy est censé avoir.

1.20.1. Compatibilité

Le module threescale-wasm-auth est conçu pour être entièrement compatible avec toutes les implémentations de la spécification Proxy-WASM ABI. Toutefois, à ce stade, il n'a été testé en profondeur que pour fonctionner avec le proxy inverse Envoy.

1.20.2. Utilisation en tant que module autonome

Grâce à sa conception autonome, il est possible de configurer ce module pour qu'il fonctionne avec des proxies Proxy-WASM indépendamment de Service Mesh, ainsi qu'avec des déploiements d'adaptateurs Istio 3scale.

1.20.3. Conditions préalables

  • Le module fonctionne avec toutes les versions de 3scale prises en charge, sauf lors de la configuration d'un service pour utiliser OpenID connect (OIDC), qui nécessite 3scale 2.11 ou une version ultérieure.

1.20.4. Configuration du module threescale-wasm-auth

Les administrateurs de cluster sur OpenShift Container Platform peuvent configurer le module threescale-wasm-auth pour autoriser les requêtes HTTP à 3scale API Management via une interface binaire d'application (ABI). L'ABI définit l'interaction entre l'hôte et le module, exposant les services de l'hôte, et vous permet d'utiliser le module pour traiter les demandes de proxy.

1.20.4.1. L'extension WasmPlugin API

Service Mesh fournit une définition de ressource personnalisée pour spécifier et appliquer les extensions Proxy-WASM aux mandataires sidecar, connus sous le nom de WasmPlugin. Service Mesh applique cette ressource personnalisée à l'ensemble des charges de travail qui nécessitent une gestion de l'API HTTP avec 3scale.

Pour plus d'informations, voir la définition des ressources personnalisées.

Note

La configuration de l'extension WebAssembly est actuellement un processus manuel. La prise en charge de la récupération de la configuration des services du système 3scale sera disponible dans une prochaine version.

Conditions préalables

  • Identifiez une charge de travail et un espace de noms Kubernetes sur votre déploiement Service Mesh que vous appliquerez ce module.
  • Vous devez avoir un compte locataire 3scale. Voir SaaS ou 3scale 2.11 On-Premises avec un service correspondant et des applications et métriques pertinentes définies.
  • Si vous appliquez le module au microservice <product_page> dans l'espace de noms info, voyez l'exemple d'application Bookinfo.

    • L'exemple suivant est le format YAML pour la ressource personnalisée du module threescale-wasm-auth. Cet exemple fait référence à la version Maistra en amont de Service Mesh, WasmPlugin API. Vous devez déclarer l'espace de noms dans lequel le module threescale-wasm-auth est déployé, ainsi que selector pour identifier l'ensemble des applications auxquelles le module s'appliquera :

      apiVersion: extensions.istio.io/v1alpha1
      kind: WasmPlugin
      metadata:
        name: <threescale_wasm_plugin_name>
        namespace: <info> 1
      spec:
        selector: 2
          labels:
            app: <product_page>
        pluginConfig: <yaml_configuration>
        url: oci://registry.redhat.io/3scale-amp2/3scale-auth-wasm-rhel8:0.0.3
        phase: AUTHZ
        priority: 100
      1
      Le site namespace.
      2
      Le site selector.
  • Le champ spec.pluginConfig dépend de la configuration du module et n'est pas renseigné dans l'exemple précédent. Au lieu de cela, l'exemple utilise la valeur de remplacement <yaml_configuration>. Vous pouvez utiliser le format de cet exemple de ressource personnalisée.

    • Le champ spec.pluginConfig varie en fonction de l'application. Tous les autres champs sont conservés dans plusieurs instances de cette ressource personnalisée. A titre d'exemple :

      • url: Ne change que lorsque des versions plus récentes du module sont déployées.
      • phase: Reste inchangé, puisque ce module doit être invoqué après que le proxy a effectué toute autorisation locale, telle que la validation des jetons OpenID Connect (OIDC).
  • Une fois que vous avez la configuration du module dans spec.pluginConfig et le reste de la ressource personnalisée, appliquez-la à l'aide de la commande oc apply:

    $ oc apply -f threescale-wasm-auth-info.yaml

1.20.5. Application des objets ServiceEntry externes 3scale

Pour que le module threescale-wasm-auth autorise les requêtes contre 3scale, le module doit avoir accès aux services 3scale. Vous pouvez le faire dans Red Hat OpenShift Service Mesh en appliquant un objet externe ServiceEntry et un objet correspondant DestinationRule pour la configuration TLS afin d'utiliser le protocole HTTPS.

Les ressources personnalisées (CR) définissent les entrées de service et les règles de destination pour un accès sécurisé depuis Service Mesh vers 3scale Hosted (SaaS) pour les composants backend et système de l'API de gestion des services et de l'API de gestion des comptes. L'API de gestion des services reçoit des requêtes sur le statut d'autorisation de chaque demande. L'API de gestion des comptes fournit les paramètres de configuration de la gestion de l'API pour vos services.

Procédure

  1. Appliquez à votre cluster le CR ServiceEntry externe suivant et le CR DestinationRule connexe pour 3scale Hosted backend:

    1. Ajoutez le CR ServiceEntry à un fichier appelé service-entry-threescale-saas-backend.yml:

      ServiceEntry CR

      apiVersion: networking.istio.io/v1beta1
      kind: ServiceEntry
      metadata:
        name: service-entry-threescale-saas-backend
      spec:
        hosts:
        - su1.3scale.net
        ports:
        - number: 443
          name: https
          protocol: HTTPS
        location: MESH_EXTERNAL
        resolution: DNS

    2. Ajoutez le CR DestinationRule à un fichier appelé destination-rule-threescale-saas-backend.yml:

      DestinationRule CR

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: destination-rule-threescale-saas-backend
      spec:
        host: su1.3scale.net
        trafficPolicy:
          tls:
            mode: SIMPLE
            sni: su1.3scale.net

    3. Appliquez et enregistrez le CR ServiceEntry externe pour le backend 3scale Hosted à votre cluster, en exécutant la commande suivante :

      $ oc apply -f service-entry-threescale-saas-backend.yml
    4. Appliquez et sauvegardez le CR DestinationRule externe pour le backend 3scale Hosted à votre cluster, en exécutant la commande suivante :

      $ oc apply -f destination-rule-threescale-saas-backend.yml
  2. Appliquez à votre cluster le CR ServiceEntry externe suivant et le CR DestinationRule connexe pour 3scale Hosted system:

    1. Ajoutez le CR ServiceEntry à un fichier appelé service-entry-threescale-saas-system.yml:

      ServiceEntry CR

      apiVersion: networking.istio.io/v1beta1
      kind: ServiceEntry
      metadata:
        name: service-entry-threescale-saas-system
      spec:
        hosts:
        - multitenant.3scale.net
        ports:
        - number: 443
          name: https
          protocol: HTTPS
        location: MESH_EXTERNAL
        resolution: DNS

    2. Ajoutez le CR DestinationRule à un fichier appelé destination-rule-threescale-saas-system.yml:

      DestinationRule CR

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: destination-rule-threescale-saas-system
      spec:
        host: multitenant.3scale.net
        trafficPolicy:
          tls:
            mode: SIMPLE
            sni: multitenant.3scale.net

    3. Appliquez et enregistrez le CR ServiceEntry externe pour le système 3scale Hosted dans votre cluster, en exécutant la commande suivante :

      $ oc apply -f service-entry-threescale-saas-system.yml
    4. Appliquez et enregistrez le CR DestinationRule externe pour le système 3scale Hosted dans votre cluster, en exécutant la commande suivante :

      oc apply -f <destination-rule-threescale-saas-system.yml>

Vous pouvez également déployer un service 3scale in-mesh. Pour déployer un service 3scale in-mesh, modifiez l'emplacement des services dans le CR en déployant 3scale et en établissant un lien avec le déploiement.

1.20.6. La configuration du module WebAssembly 3scale

La spécification de la ressource personnalisée WasmPlugin fournit la configuration que le module Proxy-WASM lit.

La spécification est intégrée dans l'hôte et lue par le module Proxy-WASM. Généralement, les configurations sont au format JSON pour que les modules puissent les analyser, mais la ressource WasmPlugin peut interpréter la valeur de la spécification comme YAML et la convertir en JSON pour qu'elle puisse être consommée par le module.

Si vous utilisez le module Proxy-WASM en mode autonome, vous devez écrire la configuration en utilisant le format JSON. L'utilisation du format JSON implique l'utilisation d'échappements et de guillemets lorsque cela est nécessaire dans les fichiers de configuration de host, par exemple Envoy. Lorsque vous utilisez le module WebAssembly avec la ressource WasmPlugin, la configuration est au format YAML. Dans ce cas, une configuration invalide oblige le module à afficher des diagnostics basés sur sa représentation JSON dans le flux de journalisation d'un sidecar.

Important

La ressource personnalisée EnvoyFilter n'est pas une API prise en charge, bien qu'elle puisse être utilisée dans certaines versions de l'adaptateur 3scale Istio ou du Service Mesh. L'utilisation de la ressource personnalisée EnvoyFilter n'est pas recommandée. Utilisez l'API WasmPlugin au lieu de la ressource personnalisée EnvoyFilter. Si vous devez utiliser la ressource personnalisée EnvoyFilter, vous devez spécifier la spécification au format JSON.

1.20.6.1. Configuration du module 3scale WebAssembly

L'architecture de la configuration du module WebAssembly de 3scale dépend du service de compte et d'autorisation de 3scale et de la liste des services à gérer.

Conditions préalables

Les conditions préalables sont un ensemble de champs minimaux obligatoires dans tous les cas :

  • Pour le service de compte et d'autorisation 3scale : l'URL backend-listener.
  • Pour la liste des services à gérer : les identifiants des services et au moins une méthode de recherche d'informations d'identification et l'endroit où la trouver.
  • Vous trouverez des exemples pour traiter avec userkey, appid avec appkey, et les modèles OpenID Connect (OIDC).
  • Le module WebAssembly utilise les paramètres que vous avez spécifiés dans la configuration statique. Par exemple, si vous ajoutez une configuration de règle de mappage au module, elle s'appliquera toujours, même si le portail d'administration 3scale n'a pas de règle de mappage de ce type. Le reste de la ressource WasmPlugin existe autour de l'entrée YAML spec.pluginConfig.

1.20.6.2. L'objet api du module WebAssembly de 3scale

La chaîne de niveau supérieur api du module 3scale WebAssembly définit la version de la configuration que le module utilisera.

Note

Une version inexistante ou non prise en charge de l'objet api rend le module 3scale WebAssembly inopérant.

L'exemple de la chaîne de niveau supérieur api

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
  namespace: <info>
spec:
  pluginConfig:
    api: v1
...

L'entrée api définit le reste des valeurs de la configuration. La seule valeur acceptée est v1. Les nouveaux paramètres qui rompent la compatibilité avec la configuration actuelle ou qui nécessitent plus de logique que les modules utilisant v1 ne peuvent pas gérer, nécessiteront des valeurs différentes.

1.20.6.3. L'objet système du module 3scale WebAssembly

L'objet de premier niveau system spécifie comment accéder à l'API de gestion de compte 3scale pour un compte spécifique. Le champ upstream est la partie la plus importante de l'objet. L'objet system est facultatif, mais recommandé à moins que vous ne fournissiez une configuration entièrement statique pour le module 3scale WebAssembly, ce qui est une option si vous ne voulez pas fournir de connectivité au composant system de 3scale.

Lorsque vous fournissez des objets de configuration statiques en plus de l'objet system, les objets statiques sont toujours prioritaires.

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  pluginConfig:
    system:
      name: <saas_porta>
      upstream: <object>
      token: <my_account_token>
      ttl: 300
  ...
Tableau 1.22. system champs de l'objet
NomDescriptionExigée

name

Un identifiant pour le service 3scale, actuellement non référencé ailleurs.

En option

upstream

Les détails d'un hôte du réseau à contacter. upstream fait référence à l'hôte de l'API de gestion des comptes 3scale connu sous le nom de système.

Oui

token

Un jeton d'accès personnel à 3 échelles avec des autorisations de lecture.

Oui

ttl

Le nombre minimum de secondes pendant lesquelles une configuration récupérée sur cet hôte doit être considérée comme valide avant d'essayer de récupérer de nouvelles modifications. La valeur par défaut est de 600 secondes (10 minutes). Note: Il n'y a pas de valeur maximale, mais le module récupérera généralement toute configuration dans un délai raisonnable après l'expiration de ce TTL.

En option

1.20.6.4. L'objet en amont du module WebAssembly 3scale

L'objet upstream décrit un hôte externe vers lequel le proxy peut effectuer des appels.

apiVersion: maistra.io/v1
upstream:
  name: outbound|443||multitenant.3scale.net
  url: "https://myaccount-admin.3scale.net/"
  timeout: 5000
...
Tableau 1.23. upstream champs de l'objet
NomDescriptionExigée

name

name n'est pas un identifiant de forme libre. Il s'agit de l'identifiant de l'hôte externe tel qu'il est défini dans la configuration du proxy. Dans le cas des configurations Envoy autonomes, il correspond au nom d'un cluster, également connu sous le nom de upstream dans d'autres proxys. Note: la valeur de ce champ, car le plan de contrôle des adaptateurs Service Mesh et 3scale Istio configure le nom selon un format utilisant une barre verticale (|) comme séparateur de plusieurs champs. Pour les besoins de cette intégration, utilisez toujours le format : outbound|<port>||<hostname>.

Oui

url

L'URL complète pour accéder au service décrit. Sauf si le schéma le prévoit, vous devez inclure le port TCP.

Oui

Timeout

Délai d'attente en millisecondes pour que les connexions à ce service qui mettent plus de temps à répondre soient considérées comme des erreurs. La valeur par défaut est de 1000 secondes.

En option

1.20.6.5. L'objet backend du module WebAssembly de 3scale

L'objet de premier niveau backend spécifie comment accéder à l'API de gestion des services 3scale pour autoriser et signaler les requêtes HTTP. Ce service est fourni par le composant Backend de 3scale.

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  pluginConfig:
    ...
    backend:
      name: backend
      upstream: <object>
    ...
Tableau 1.24. backend champs de l'objet
NomDescriptionExigée

name

Un identifiant pour le backend 3scale, actuellement non référencé ailleurs.

En option

upstream

Les détails d'un hôte du réseau à contacter. Cela doit se référer à l'hôte 3scale Account Management API, connu, système.

Oui, c'est le champ le plus important et le plus obligatoire.

1.20.6.6. L'objet des services du module WebAssembly 3scale

L'objet de premier niveau services spécifie quels identificateurs de service sont traités par cette instance particulière de module.

Étant donné que les comptes disposent de plusieurs services, vous devez spécifier ceux qui sont gérés. Le reste de la configuration porte sur la manière de configurer les services.

Le champ services est obligatoire. Il s'agit d'un tableau qui doit contenir au moins un service pour être utile.

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  pluginConfig:
    ...
    services:
    - id: "2555417834789"
      token: service_token
      authorities:
        - "*.app"
        - 0.0.0.0
        - "0.0.0.0:8443"
      credentials: <object>
      mapping_rules: <object>
    ...

Chaque élément du tableau services représente un service à 3 échelles.

Tableau 1.25. services champs de l'objet
NomDescriptionExigée

ID

Un identifiant pour ce service 3scale, actuellement non référencé ailleurs.

Oui

token

Cette adresse token peut être trouvée dans la configuration du proxy pour votre service dans le système ou vous pouvez l'extraire du système avec la commande suivante curl:

curl https://<system_host>/admin/api/services/<service_id>/proxy/configs/production/latest.json?access_token=<access_token>" | jq '.proxy_config.content.backend_authentication_value

En option

authorities

Un tableau de chaînes, chacune représentant le Authority d'un URL à faire correspondre. Ces chaînes acceptent les motifs globaux prenant en charge l'astérisque (*), le signe plus ( ) et le point d'interrogation (?).

Oui

credentials

Un objet définissant le type d'informations à rechercher et l'endroit où elles doivent l'être.

Oui

mapping_rules

Un tableau d'objets représentant les règles de mappage et les méthodes 3scale à appliquer.

En option

1.20.6.7. L'objet d'identification du module WebAssembly 3scale

L'objet credentials est un composant de l'objet service. credentials spécifie le type d'informations d'identification à rechercher et les étapes à suivre pour réaliser cette action.

Tous les champs sont facultatifs, mais vous devez en spécifier au moins un, user_key ou app_id. L'ordre dans lequel vous spécifiez chaque justificatif n'a pas d'importance car il est préétabli par le module. N'indiquez qu'une seule instance de chaque justificatif.

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  pluginConfig:
    ...
    services:
    - credentials:
        user_key: <array_of_lookup_queries>
        app_id: <array_of_lookup_queries>
        app_key: <array_of_lookup_queries>
    ...
Tableau 1.26. credentials champs de l'objet
NomDescriptionExigée

user_key

Il s'agit d'un tableau de requêtes de recherche qui définit une clé d'utilisateur 3scale. Une clé d'utilisateur est communément appelée clé API.

En option

app_id

Il s'agit d'un tableau de requêtes de recherche qui définissent un identifiant d'application 3scale. Les identifiants d'application sont fournis par 3scale ou en utilisant un fournisseur d'identité comme Red Hat Single Sign-On (RH-SS0), ou OpenID Connect (OIDC). La résolution des requêtes de recherche spécifiées ici, chaque fois qu'elle est réussie et qu'elle se résout en deux valeurs, établit le app_id et le app_key.

En option

app_key

Il s'agit d'un tableau de requêtes de recherche qui définissent une clé d'application 3scale. Les clés d'application sans app_id résolu sont inutiles, c'est pourquoi ce champ ne doit être spécifié que lorsque app_id a été spécifié.

En option

1.20.6.8. Les requêtes de consultation du module WebAssembly 3scale

L'objet lookup query fait partie de n'importe quel champ de l'objet credentials. Il spécifie comment un champ d'identification donné doit être trouvé et traité. Lorsqu'elle est évaluée, une résolution réussie signifie qu'une ou plusieurs valeurs ont été trouvées. Une résolution échouée signifie qu'aucune valeur n'a été trouvée.

Les tableaux de lookup queries décrivent un court-circuit ou une relation : la résolution réussie de l'une des requêtes arrête l'évaluation de toutes les requêtes restantes et attribue la ou les valeurs au type de justificatif spécifié. Chaque requête du tableau est indépendante des autres.

Un site lookup query est constitué d'un seul champ, un objet source, qui peut faire partie d'un certain nombre de types de sources. Voir l'exemple suivant :

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  pluginConfig:
    ...
    services:
    - credentials:
        user_key:
          - <source_type>: <object>
          - <source_type>: <object>
          ...
        app_id:
          - <source_type>: <object>
          ...
        app_key:
          - <source_type>: <object>
          ...
    ...

1.20.6.9. L'objet source du module WebAssembly 3scale

Un objet source existe en tant que partie d'un tableau de sources dans n'importe quel champ de l'objet credentials. Le nom du champ de l'objet, appelé source-type, est l'un des suivants :

  • header: La requête de recherche reçoit en entrée les en-têtes de requête HTTP.
  • query_string: Le site lookup query reçoit en entrée les paramètres de la chaîne d'interrogation de l'URL.
  • filter: Le site lookup query reçoit des métadonnées de filtrage en entrée.

Tous les objets de type source possèdent au moins les deux champs suivants :

Tableau 1.27. source-champs de l'objet type
NomDescriptionExigée

keys

Un tableau de chaînes, chacune étant un key, faisant référence aux entrées trouvées dans les données d'entrée.

Oui

ops

Un tableau de operations qui effectue une correspondance d'entrée key. Le tableau est un pipeline dans lequel les opérations reçoivent des entrées et génèrent des sorties lors de l'opération suivante. Si operation ne fournit pas de sortie, lookup query est considéré comme ayant échoué. L'ordre des opérations dans le pipeline détermine l'ordre d'évaluation.

En option

Le nom du champ filter comporte une entrée obligatoire path pour indiquer le chemin dans les métadonnées que vous utilisez pour rechercher des données.

Lorsqu'un key correspond aux données d'entrée, les autres clés ne sont pas évaluées et l'algorithme de résolution des sources passe à l'exécution du operations (ops) spécifié, le cas échéant. Si aucun ops n'est spécifié, la valeur de résultat du key correspondant, s'il y en a un, est renvoyée.

Operations fournissent un moyen de spécifier certaines conditions et transformations pour les entrées dont vous disposez après que la première phase a consulté un site key. Utilisez operations lorsque vous avez besoin de transformer, décoder et affirmer des propriétés, mais ils ne fournissent pas un langage mature pour répondre à tous les besoins et manquent de Turing-completeness.

Une pile stocke les résultats de operations. Lorsqu'il est évalué, lookup query termine en attribuant la ou les valeurs au bas de la pile, en fonction du nombre de valeurs consommées par le titre.

1.20.6.10. L'objet des opérations du module WebAssembly 3scale

Chaque élément du tableau ops appartenant à un source type spécifique est un objet operation qui applique des transformations aux valeurs ou effectue des tests. Le nom du champ à utiliser pour un tel objet est le nom de l'objet operation lui-même, et toutes les valeurs sont les paramètres de l'objet operation, qui peuvent être des objets de structure, par exemple des cartes avec des champs et des valeurs, des listes ou des chaînes de caractères.

La plupart des sites operations traitent une ou plusieurs entrées et produisent une ou plusieurs sorties. Lorsqu'elles consomment des entrées ou produisent des sorties, elles travaillent avec une pile de valeurs : chaque valeur consommée par les opérations est extraite de la pile de valeurs et initialement remplie avec toutes les correspondances source. Les valeurs produites par les opérations sont poussées vers la pile. Les valeurs produites par ces opérations sont poussées vers la pile. D'autres sites operations ne consomment ni ne produisent de résultats autres que l'affirmation de certaines propriétés, mais ils inspectent une pile de valeurs.

Note

À la fin de la résolution, les valeurs reprises par l'étape suivante, comme l'attribution des valeurs à app_id, app_key ou user_key, proviennent des valeurs inférieures de la pile.

Il existe plusieurs catégories de operations:

  • decode: Ils transforment une valeur d'entrée en la décodant pour obtenir un format différent.
  • string: Ils prennent une chaîne de caractères en entrée et effectuent des transformations et des contrôles sur celle-ci.
  • stack: Ils prennent un ensemble de valeurs en entrée et effectuent de multiples transformations de la pile et la sélection de positions spécifiques dans la pile.
  • check: Ils affirment des propriétés sur des ensembles d'opérations sans effet de bord.
  • control: Ces opérations permettent de modifier le flux d'évaluation.
  • format: Ils analysent la structure spécifique du format des valeurs d'entrée et y recherchent des valeurs.

Toutes les opérations sont spécifiées par les identificateurs de nom sous forme de chaînes de caractères.

Ressources supplémentaires

1.20.6.11. L'objet mapping_rules du module WebAssembly de 3scale

L'objet mapping_rules fait partie de l'objet service. Il spécifie un ensemble de modèles de chemins REST, de métriques 3scale et d'incréments de comptage à utiliser lorsque les modèles correspondent.

Vous avez besoin de cette valeur si aucune configuration dynamique n'est fournie dans l'objet de premier niveau system. Si l'objet est fourni en plus de l'entrée de premier niveau system, l'objet mapping_rules est évalué en premier.

mapping_rules est un objet de type tableau. Chaque élément de ce tableau est un objet mapping_rule. Les règles de correspondance évaluées sur une demande entrante fournissent l'ensemble de 3scale methods pour l'autorisation et le rapport à APIManager. Lorsque plusieurs règles de correspondance se réfèrent au même methods, il y a une addition de deltas lors de l'appel à 3scale. Par exemple, si deux règles augmentent deux fois la méthode Hits avec deltas de 1 et 3, une seule entrée de méthode pour les Hits faisant rapport à 3scale a une delta de 4.

1.20.6.12. L'objet mapping_rule du module 3scale WebAssembly

L'objet mapping_rule fait partie d'un tableau dans l'objet mapping_rules.

Les champs de l'objet mapping_rule précisent les informations suivantes :

  • Le site HTTP request method doit être assorti.
  • Un modèle de correspondance avec le chemin d'accès.
  • Les méthodes 3scale à déclarer ainsi que le montant à déclarer. L'ordre dans lequel vous spécifiez les zones détermine l'ordre d'analyse.
Tableau 1.28. mapping_rule champs de l'objet
NomDescriptionExigée

method

Spécifie une chaîne représentant une méthode de requête HTTP, également connue sous le nom de verbe. Les valeurs acceptées correspondent à l'un des noms de méthode HTTP acceptés, sans tenir compte de la casse. La valeur spéciale "any" correspond à n'importe quelle méthode.

Oui

pattern

Le motif qui doit correspondre au composant du chemin URI de la demande HTTP. Ce motif suit la même syntaxe que celle documentée par 3scale. Il autorise les caractères génériques (utilisation de l'astérisque (*)) en utilisant n'importe quelle séquence de caractères entre accolades, comme {this}.

Oui

usages

Une liste d'objets usage. Lorsque la règle correspond, toutes les méthodes avec leur deltas sont ajoutées à la liste des méthodes envoyées à 3scale pour autorisation et rapport.

Incorporer l'objet usages avec les champs obligatoires suivants :

  • name: Le nom du système method à signaler.
  • delta: Pour savoir de combien augmenter le site method.

Oui

last

Indique si la correspondance réussie de cette règle doit interrompre l'évaluation d'autres règles de mappage.

Booléen facultatif. La valeur par défaut est false

L'exemple suivant est indépendant des hiérarchies existantes entre les méthodes dans 3scale. En d'autres termes, tout ce qui est exécuté du côté de 3scale n'affectera pas cet exemple. Par exemple, la métrique Hits peut être le parent de toutes les méthodes, elle stocke donc 4 occurrences en raison de la somme de toutes les méthodes signalées dans la demande autorisée et appelle le point de terminaison de l'API 3scale Authrep.

L'exemple ci-dessous utilise une requête GET vers un chemin d'accès, /products/1/sold, qui répond à toutes les règles.

mapping_rules GET exemple de demande

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  pluginConfig:
    ...
    mapping_rules:
      - method: GET
        pattern: /
        usages:
          - name: hits
            delta: 1
      - method: GET
        pattern: /products/
        usages:
          - name: products
            delta: 1
      - method: ANY
        pattern: /products/{id}/sold
        usages:
          - name: sales
            delta: 1
          - name: products
            delta: 1
    ...

Toutes les adresses usages sont ajoutées à la requête que le module adresse à 3scale avec les données d'utilisation comme suit :

  • Hits : 1
  • produits : 2
  • ventes : 1

1.20.7. Les exemples de modules 3scale WebAssembly pour les cas d'utilisation des références

Vous passerez la majeure partie de votre temps à appliquer des étapes de configuration pour obtenir des informations d'identification dans les demandes adressées à vos services.

Les exemples suivants sont tirés du site credentials et peuvent être modifiés pour s'adapter à des cas d'utilisation spécifiques.

Vous pouvez les combiner toutes, bien que lorsque vous spécifiez plusieurs objets sources avec leur propre lookup queries, ils sont évalués dans l'ordre jusqu'à ce que l'un d'entre eux soit résolu avec succès.

1.20.7.1. Clé API (user_key) dans les paramètres de la chaîne de requête

L'exemple suivant recherche une adresse user_key dans un paramètre de chaîne de requête ou un en-tête du même nom :

credentials:
  user_key:
    - query_string:
        keys:
          - user_key
    - header:
        keys:
          - user_key

1.20.7.2. ID et clé de l'application

L'exemple suivant permet de rechercher les informations d'identification app_key et app_id dans une requête ou des en-têtes.

credentials:
  app_id:
    - header:
        keys:
          - app_id
    - query_string:
        keys:
          - app_id
  app_key:
    - header:
        keys:
          - app_key
    - query_string:
        keys:
          - app_key

1.20.7.3. En-tête d'autorisation

Une requête comprend un en-tête app_id et app_key dans un en-tête authorization. S'il y a au moins une ou deux valeurs produites à la fin, alors vous pouvez assigner l'en-tête app_key.

La résolution ici attribue le app_key s'il y a un ou deux résultats à la fin.

L'en-tête authorization spécifie une valeur avec le type d'autorisation et sa valeur est encodée comme Base64. Cela signifie que vous pouvez diviser la valeur par un caractère espace, prendre la deuxième sortie et la diviser à nouveau en utilisant un deux-points ( :) comme séparateur. Par exemple, si vous utilisez le format app_id:app_key, l'en-tête ressemble à l'exemple suivant pour credential:

aladdin:opensesame:  Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l

Vous devez utiliser des noms de champs d'en-tête en minuscules, comme indiqué dans l'exemple suivant :

credentials:
  app_id:
    - header:
        keys:
          - authorization
        ops:
          - split:
              separator: " "
              max: 2
          - length:
              min: 2
          - drop:
              head: 1
          - base64_urlsafe
          - split:
              max: 2
  app_key:
    - header:
        keys:
          - app_key

L'exemple de cas d'utilisation précédent porte sur les en-têtes d'un site authorization:

  1. Il prend sa valeur de chaîne et la divise par un espace, en vérifiant qu'il génère au moins deux valeurs d'un type credential et le type credential lui-même, puis en abandonnant le type credential.
  2. Il décode ensuite la deuxième valeur contenant les données dont il a besoin, et la divise en utilisant le caractère deux-points ( :) pour avoir une pile d'opérations comprenant d'abord le app_id, puis le app_key, s'il existe.

    1. Si app_key n'existe pas dans l'en-tête d'autorisation, ses sources spécifiques sont vérifiées, par exemple l'en-tête avec la clé app_key dans ce cas.
  3. Pour ajouter des conditions supplémentaires à credentials, autorisez les autorisations Basic, où app_id est soit aladdin, soit admin, ou tout app_id d'une longueur d'au moins 8 caractères.
  4. app_key doit contenir une valeur et un minimum de 64 caractères, comme le montre l'exemple suivant :

    credentials:
      app_id:
        - header:
            keys:
              - authorization
            ops:
              - split:
                  separator: " "
                  max: 2
              - length:
                  min: 2
              - reverse
              - glob:
                - Basic
              - drop:
                  tail: 1
              - base64_urlsafe
              - split:
                  max: 2
              - test:
                  if:
                    length:
                      min: 2
                  then:
                    - strlen:
                        max: 63
                    - or:
                        - strlen:
                            min: 1
                        - drop:
                            tail: 1
              - assert:
                - and:
                  - reverse
                  - or:
                    - strlen:
                        min: 8
                    - glob:
                      - aladdin
                      - admin
  5. Après avoir récupéré la valeur de l'en-tête authorization, vous obtenez un type Basic credential en inversant la pile de manière à ce que le type soit placé au-dessus.
  6. Exécutez une correspondance globale. Lorsqu'elle est validée, et que l'identifiant est décodé et divisé, vous obtenez le app_id en bas de la pile, et potentiellement le app_key en haut.
  7. Exécutez un test: s'il y a deux valeurs dans la pile, ce qui signifie qu'un app_key a été acquis.

    1. Assurez-vous que la longueur de la chaîne est comprise entre 1 et 63, y compris app_id et app_key. Si la longueur de la clé est nulle, abandonnez-la et continuez comme si aucune clé n'existait. S'il n'y avait qu'un app_id et pas de app_key, la branche else manquante indique que le test a réussi et l'évaluation se poursuit.

La dernière opération, assert, indique qu'aucun effet secondaire ne se retrouve dans la pile. Vous pouvez alors modifier la pile :

  1. Inversez la pile pour que le site app_id soit au sommet.

    1. Qu'il y ait ou non un app_key, l'inversion de la pile garantit que app_id se trouve au sommet.
  2. Utilisez and pour préserver le contenu de la pile entre les tests.

    Utilisez ensuite l'une des possibilités suivantes :

    • Assurez-vous que app_id a une longueur de chaîne d'au moins 8.
    • Assurez-vous que app_id correspond à aladdin ou admin.

1.20.7.4. Cas d'utilisation d'OpenID Connect (OIDC)

Pour Service Mesh et l'adaptateur Istio 3scale, vous devez déployer un site RequestAuthentication comme indiqué dans l'exemple suivant, en renseignant vos propres données de charge de travail et jwtRules:

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: jwt-example
  namespace: info
spec:
  selector:
    matchLabels:
      app: productpage
  jwtRules:
  - issuer: >-
      http://keycloak-keycloak.34.242.107.254.nip.io/auth/realms/3scale-keycloak
    jwksUri: >-
      http://keycloak-keycloak.34.242.107.254.nip.io/auth/realms/3scale-keycloak/protocol/openid-connect/certs

Lorsque vous appliquez le RequestAuthentication, il configure Envoy avec un plugin natif pour valider les jetons JWT. Le proxy valide tout avant d'exécuter le module, de sorte que les demandes qui échouent ne parviennent pas au module 3scale WebAssembly.

Lorsqu'un jeton JWT est validé, le proxy stocke son contenu dans un objet de métadonnées interne, avec une entrée dont la clé dépend de la configuration spécifique du plugin. Ce cas d'utilisation vous permet de rechercher des objets de structure avec une seule entrée contenant un nom de clé inconnu.

Le 3scale app_id pour l'OIDC correspond à l'OAuth client_id. Ceci se trouve dans les champs azp ou aud des jetons JWT.

Pour obtenir le champ app_id à partir du filtre d'authentification natif d'Envoy JWT, voir l'exemple suivant :

credentials:
  app_id:
    - filter:
        path:
          - envoy.filters.http.jwt_authn
          - "0"
        keys:
          - azp
          - aud
        ops:
          - take:
              head: 1

L'exemple indique au module d'utiliser le type de source filter pour rechercher les métadonnées de filtrage d'un objet provenant du plugin natif d'authentification JWT spécifique à Envoy. Ce plugin inclut le jeton JWT dans un objet de structure avec une seule entrée et un nom préconfiguré. Utilisez 0 pour spécifier que vous n'accéderez qu'à l'entrée unique.

La valeur résultante est une structure pour laquelle vous résoudrez deux champs :

  • azp: La valeur où se trouve app_id.
  • aud: La valeur où cette information peut également être trouvée.

Cette opération permet de s'assurer qu'une seule valeur est conservée pour l'affectation.

1.20.7.5. Récupérer le jeton JWT dans un en-tête

Certaines configurations peuvent avoir des processus de validation pour les jetons JWT où le jeton validé atteindrait ce module par le biais d'un en-tête au format JSON.

Pour obtenir le site app_id, voir l'exemple suivant :

credentials:
  app_id:
    - header:
        keys:
          - x-jwt-payload
        ops:
          - base64_urlsafe
          - json:
            - keys:
              - azp
              - aud
          - take:
              head: 1

1.20.8. configuration minimale de travail du module WebAssembly 3scale

Ce qui suit est un exemple de configuration minimale de travail d'un module WebAssembly 3scale. Vous pouvez copier et coller cet exemple et le modifier pour l'adapter à votre propre configuration.

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  url: oci://registry.redhat.io/3scale-amp2/3scale-auth-wasm-rhel8:0.0.3
  imagePullSecret: <optional_pull_secret_resource>
  phase: AUTHZ
  priority: 100
  selector:
    labels:
      app: <product_page>
  pluginConfig:
    api: v1
    system:
      name: <system_name>
      upstream:
        name: outbound|443||multitenant.3scale.net
        url: https://istiodevel-admin.3scale.net/
        timeout: 5000
      token: <token>
    backend:
      name: <backend_name>
      upstream:
        name: outbound|443||su1.3scale.net
        url: https://su1.3scale.net/
        timeout: 5000
      extensions:
      - no_body
    services:
    - id: '2555417834780'
      authorities:
      - "*"
      credentials:
        user_key:
          - query_string:
              keys:
                - <user_key>
          - header:
              keys:
                - <user_key>
        app_id:
          - query_string:
              keys:
                - <app_id>
          - header:
              keys:
                - <app_id>
        app_key:
          - query_string:
              keys:
                - <app_key>
          - header:
              keys:
                - <app_key>
Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.