1.20. Utilisation du module WebAssembly de 3scale
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.
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 nomsinfo
, 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 modulethreescale-wasm-auth
est déployé, ainsi queselector
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
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 commandeoc apply
:$ oc apply -f threescale-wasm-auth-info.yaml
Ressources supplémentaires
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
Appliquez à votre cluster le CR
ServiceEntry
externe suivant et le CRDestinationRule
connexe pour 3scale Hosted backend: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
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
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
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
Appliquez à votre cluster le CR
ServiceEntry
externe suivant et le CRDestinationRule
connexe pour 3scale Hosted system: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
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
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
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.
Ressources supplémentaires
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.
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
avecappkey
, 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 YAMLspec.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.
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 ...
Nom | Description | Exigée |
---|---|---|
| Un identifiant pour le service 3scale, actuellement non référencé ailleurs. | En option |
|
Les détails d'un hôte du réseau à contacter. | Oui |
| Un jeton d'accès personnel à 3 échelles avec des autorisations de lecture. | Oui |
| 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 ...
Nom | Description | Exigée |
---|---|---|
|
| Oui |
| 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 |
| 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> ...
Nom | Description | Exigée |
---|---|---|
| Un identifiant pour le backend 3scale, actuellement non référencé ailleurs. | En option |
| 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.
Nom | Description | Exigée |
---|---|---|
| Un identifiant pour ce service 3scale, actuellement non référencé ailleurs. | Oui |
|
Cette adresse
| En option |
| 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 |
| Un objet définissant le type d'informations à rechercher et l'endroit où elles doivent l'être. | Oui |
| 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> ...
Nom | Description | Exigée |
---|---|---|
| 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 |
|
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 | En option |
|
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 | 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 sitelookup query
reçoit en entrée les paramètres de la chaîne d'interrogation de l'URL. -
filter
: Le sitelookup 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 :
Nom | Description | Exigée |
---|---|---|
|
Un tableau de chaînes, chacune étant un | Oui |
|
Un tableau de | 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.
À 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
- Opérations disponibles
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.
Nom | Description | Exigée |
---|---|---|
| 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 |
|
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 | Oui |
|
Une liste d'objets
Incorporer l'objet
| Oui |
| 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 |
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
:
-
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 typecredential
lui-même, puis en abandonnant le typecredential
. 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 leapp_key
, s'il existe.-
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.
-
Si
-
Pour ajouter des conditions supplémentaires à
credentials
, autorisez les autorisationsBasic
, oùapp_id
est soitaladdin
, soitadmin
, ou toutapp_id
d'une longueur d'au moins 8 caractères. 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
-
Après avoir récupéré la valeur de l'en-tête
authorization
, vous obtenez un typeBasic
credential
en inversant la pile de manière à ce que le type soit placé au-dessus. -
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 leapp_key
en haut. Exécutez un
test:
s'il y a deux valeurs dans la pile, ce qui signifie qu'unapp_key
a été acquis.-
Assurez-vous que la longueur de la chaîne est comprise entre 1 et 63, y compris
app_id
etapp_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'unapp_id
et pas deapp_key
, la branche else manquante indique que le test a réussi et l'évaluation se poursuit.
-
Assurez-vous que la longueur de la chaîne est comprise entre 1 et 63, y compris
La dernière opération, assert
, indique qu'aucun effet secondaire ne se retrouve dans la pile. Vous pouvez alors modifier la pile :
Inversez la pile pour que le site
app_id
soit au sommet.-
Qu'il y ait ou non un
app_key
, l'inversion de la pile garantit queapp_id
se trouve au sommet.
-
Qu'il y ait ou non un
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
ouadmin
.
-
Assurez-vous que
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 trouveapp_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>