Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:Enable WAF on an ASM ingress gateway with the Coraza Wasm plug-in

Dernière mise à jour :Aug 11, 2026

Les règles de routage VirtualService et les contrôles d'accès AuthorizationPolicy ne couvrent pas les menaces au niveau applicatif telles que l'injection SQL, le cross-site scripting (XSS) ou d'autres attaques figurant dans le top 10 OWASP. Le plug-in Coraza WebAssembly (Wasm) résout ce problème en intégrant un pare-feu d'applications web (WAF) directement dans le processus Envoy de la passerelle. Chaque requête entrante est inspectée et le trafic malveillant est bloqué avant d'atteindre vos services, sans nécessiter de sidecar externe ni de saut réseau supplémentaire.

Coraza est un moteur WAF open source maintenu par l'OWASP qui utilise la syntaxe SecRule de ModSecurity. Pour le déployer, empaquetez le binaire Coraza Wasm sous forme d'image OCI et transférez-la vers un registre de conteneurs. Appliquez ensuite une ressource WasmPlugin pour charger le plug-in dans la chaîne de filtres Envoy.

Fonctionnement

  1. Empaquetez le binaire Coraza Wasm sous forme d'image OCI et transférez-la vers un registre de conteneurs.

  2. Créez un Secret Kubernetes afin que la passerelle ASM puisse extraire l'image.

  3. Appliquez une ressource WasmPlugin qui charge le plug-in dans la chaîne de filtres Envoy de la passerelle et configure les directives SecRule.

  4. La passerelle évalue chaque requête entrante par rapport aux règles configurées et renvoie 403 Forbidden pour toute requête correspondant à une règle de refus.

Prérequis

Avant de commencer, assurez-vous d'avoir :

Méthodes de chargement des plug-ins Wasm

ASM prend en charge trois méthodes pour charger un plug-in Wasm. Ce tutoriel utilise la méthode par image OCI.

Méthode

Fonctionnement

Cas d'utilisation

Image OCI (utilisée dans ce tutoriel)

Empaquetez le binaire .wasm sous forme d'image OCI et transférez-la vers un registre de conteneurs. La passerelle extrait l'image depuis le dépôt d'images.

Recommandé pour la plupart des déploiements en production. Versionné, auditable et compatible avec l'infrastructure de registre existante.

ConfigMap

Stockez le binaire .wasm dans un ConfigMap Kubernetes et montez-le dans le pod de la passerelle. La passerelle charge le fichier depuis le système de fichiers local.

Prototypage rapide ou environnements isolés où aucun registre n'est disponible. Limité par la taille maximale de 1 MiB d'un ConfigMap.

Téléchargement HTTP

Hébergez le binaire .wasm sur un service de stockage cloud ou tout endpoint accessible via HTTP. La passerelle le télécharge via le réseau.

Environnements disposant déjà d'un serveur d'artefacts centralisé servant des binaires via HTTP.

Étape 1 : Construire et transférer l'image OCI Coraza Wasm

Télécharger et préparer le binaire du plug-in

  1. Téléchargez le plug-in Coraza Wasm et décompressez-le :

       wget https://github.com/corazawaf/coraza-proxy-wasm/releases/download/0.3.0/coraza-proxy-wasm-0.3.0.zip
       unzip coraza-proxy-wasm-0.3.0.zip
  2. Renommez le binaire en plugin.wasm. ASM impose strictement ce nom de fichier :

       mv coraza-proxy-wasm.wasm plugin.wasm
  3. Créez un fichier Dockerfile dans le même répertoire :

       FROM scratch
       ADD ./plugin.wasm ./plugin.wasm
  4. Construisez l'image OCI :

       docker build -t coraza-proxy-wasm:latest .

Transférer l'image vers Container Registry

  1. Créez un namespace dans Container Registry :

    1. Connectez-vous à la console Container Registry. Dans le volet de navigation de gauche, cliquez sur Instances.

    2. Sur la page Instances, cliquez sur la carte de votre instance Container Registry Enterprise Edition.

    3. Dans le volet de navigation de gauche, choisissez Repository > Namespace. Cliquez sur Create Namespace, définissez Namespace sur wasm et cliquez sur OK.

  2. Activez l'accès Internet pour le registre : dans le volet de navigation de gauche, choisissez Repository > Access Control. Cliquez sur l'onglet Internet, activez Enable Access over Internet et ajoutez des listes d'autorisation Internet selon vos besoins. Si vous n'avez pas besoin de contrôle par liste d'autorisation, supprimez la liste d'autorisation par défaut.

    Remarque

    Cet exemple utilise l'endpoint public. Pour un usage en production, configurez l'accès via Virtual Private Cloud (VPC) pour une meilleure sécurité et de meilleures performances réseau. Pour plus d'informations, consultez la rubrique Configurer une ACL VPC.

  3. Connectez-vous au registre : saisissez votre mot de passe lorsque vous y êtes invité. Remplacez les espaces réservés suivants par vos valeurs réelles :

    Espace réservé

    description

    Exemple

    <your-username>

    Nom d'utilisateur de connexion pour l'instance Container Registry

    admin@china

    <your-registry-endpoint>

    L'endpoint de votre instance Container Registry

    enterprise-registry.cn-hangzhou

       docker login --username=<your-username> <your-registry-endpoint>.cr.aliyuncs.com
  4. Taguez et transférez l'image : remplacez <image-id> par l'ID d'image renvoyé par docker build dans la section précédente.

       docker tag <image-id> <your-registry-endpoint>.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
       docker push <your-registry-endpoint>.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
  5. Vérifiez que l'image a bien été transférée : si l'image portant le tag latest apparaît, le transfert a réussi.

    1. Dans la console Container Registry, ouvrez votre instance Enterprise Edition.

    2. Dans le volet de navigation de gauche, choisissez Repository > Repositories. Cliquez sur coraza-proxy-wasm.

    3. Dans le volet de navigation de gauche, cliquez sur Tags.

Étape 2 : Créer un Secret pour l'extraction d'images

Le dépôt étant privé, la passerelle ASM nécessite des identifiants pour extraire l'image Wasm. Créez un Secret Kubernetes contenant les identifiants du registre :

kubectl create secret docker-registry coraza-wasm-proxy \
  -n istio-system \
  --docker-server=<your-registry-endpoint>.cr.aliyuncs.com \
  --docker-username=<your-username> \
  --docker-password=<your-password>
Important

Le Secret doit se trouver dans le même namespace que la ressource WasmPlugin . Ce tutoriel utilise istio-system. Ajustez la valeur -n si votre plug-in cible un autre namespace.

Vérifiez le Secret :

kubectl -n istio-system get secret coraza-wasm-proxy

Étape 3 : Appliquer la ressource WasmPlugin

La ressource WasmPlugin déclare quel plug-in charger, où l'insérer dans la chaîne de filtres Envoy et comment le configurer.

  1. Créez un fichier nommé wasm-plugin.yaml avec le contenu suivant. Le tableau ci-dessous décrit les champs clés. Dans cet exemple, l'ensemble de directives default active le moteur de règles Coraza et définit une seule règle : refuser toute requête dont l'en-tête x-user-type est égal à baned.

    Champ

    description

    spec.url

    Adresse de l'image OCI incluant le tag. Prend en charge les schémas oci://, file:// et http[s]://.

    spec.imagePullSecret

    Nom du Secret Kubernetes contenant les identifiants du registre.

    spec.imagePullPolicy

    Politique d'extraction d'image.

    spec.selector

    Sélecteur d'étiquettes déterminant quelles charges de travail chargent ce plug-in. Ici, il cible la passerelle d'entrée.

    spec.phase

    Emplacement d'insertion du plug-in dans la chaîne de filtres. AUTHN le place avant les filtres d'authentification, afin que les requêtes soient inspectées aussi tôt que possible.

    spec.pluginConfig

    Configuration spécifique à Coraza. directives_map définit des ensembles de règles nommés utilisant la syntaxe SecRule. default_directives spécifie quel ensemble de règles appliquer par défaut.

       apiVersion: extensions.istio.io/v1alpha1
       kind: WasmPlugin
       metadata:
         name: coraza-proxy-wasm
         namespace: istio-system
       spec:
         imagePullPolicy: IfNotPresent
         imagePullSecret: coraza-wasm-proxy
         selector:
           matchLabels:
             istio: ingressgateway
         url: oci://<your-registry-endpoint>.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
         phase: AUTHN
         pluginConfig:
           directives_map:
             default:
               - "SecDebugLogLevel 9"
               - "SecRuleEngine On"
               - "SecRule REQUEST_HEADERS:x-user-type \"@streq baned\" \"id:101,phase:1,t:lowercase,deny,msg:'denied by header'\""
           default_directives: default
  2. Connectez-vous à l'instance ASM avec kubectl et appliquez la ressource :

       kubectl apply -f wasm-plugin.yaml

Étape 4 : Vérifier le plug-in WAF

Testez les requêtes autorisées et bloquées pour confirmer le bon fonctionnement du plug-in.

  1. Envoyez une requête normale à l'application HTTPBin via la passerelle d'entrée : remplacez <gateway-ip> par l'adresse IP de votre passerelle d'entrée. Pour plus d'informations, consultez la rubrique Obtenir l'adresse IP de la passerelle d'entrée. Résultat attendu : la passerelle renvoie 200 OK :

       curl -v http://<gateway-ip>/
       > GET / HTTP/1.1
       > Host: <gateway-ip>
       ...
       < HTTP/1.1 200 OK
       < server: istio-envoy
       ...
  2. Envoyez une requête avec l'en-tête bloqué. Résultat attendu : la passerelle renvoie 403 Forbidden. La réponse 403 confirme que le plug-in WAF Coraza est actif et applique la règle configurée.

       curl -v -H 'x-user-type: baned' http://<gateway-ip>/
       > GET / HTTP/1.1
       > Host: <gateway-ip>
       > x-user-type: baned
       ...
       < HTTP/1.1 403 Forbidden
       < server: istio-envoy
       ...