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
Empaquetez le binaire Coraza Wasm sous forme d'image OCI et transférez-la vers un registre de conteneurs.
Créez un Secret Kubernetes afin que la passerelle ASM puisse extraire l'image.
Appliquez une ressource
WasmPluginqui charge le plug-in dans la chaîne de filtres Envoy de la passerelle et configure les directives SecRule.La passerelle évalue chaque requête entrante par rapport aux règles configurées et renvoie
403 Forbiddenpour toute requête correspondant à une règle de refus.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Une instance ASM v1.18 ou ultérieure avec un cluster Container Service for Kubernetes (ACK) ajouté. Pour plus d'informations, consultez la rubrique Ajouter un cluster à une instance ASM
L'injection automatique du proxy sidecar activée. Pour plus d'informations, consultez la rubrique Gérer les namespaces globaux
L'application HTTPBin déployée et accessible. Pour plus d'informations, consultez la rubrique Déployer l'application HTTPBin
Une instance Container Registry Enterprise Edition (prenant en charge les images OCI). Pour plus d'informations, consultez la rubrique Créer une instance Container Registry Enterprise Edition
Docker installé. Pour plus d'informations, consultez la page Obtenir Docker
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 |
Recommandé pour la plupart des déploiements en production. Versionné, auditable et compatible avec l'infrastructure de registre existante. |
|
ConfigMap |
Stockez le binaire |
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 |
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
-
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 -
Renommez le binaire en
plugin.wasm. ASM impose strictement ce nom de fichier :mv coraza-proxy-wasm.wasm plugin.wasm -
Créez un fichier
Dockerfiledans le même répertoire :FROM scratch ADD ./plugin.wasm ./plugin.wasm -
Construisez l'image OCI :
docker build -t coraza-proxy-wasm:latest .
Transférer l'image vers Container Registry
-
Créez un namespace dans Container Registry :
Connectez-vous à la console Container Registry. Dans le volet de navigation de gauche, cliquez sur Instances.
Sur la page Instances, cliquez sur la carte de votre instance Container Registry Enterprise Edition.
Dans le volet de navigation de gauche, choisissez . Cliquez sur Create Namespace, définissez Namespace sur
wasmet cliquez sur OK.
-
Activez l'accès Internet pour le registre : dans le volet de navigation de gauche, choisissez . 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.
RemarqueCet 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.
-
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-hangzhoudocker login --username=<your-username> <your-registry-endpoint>.cr.aliyuncs.com -
Taguez et transférez l'image : remplacez
<image-id>par l'ID d'image renvoyé pardocker builddans 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 -
Vérifiez que l'image a bien été transférée : si l'image portant le tag
latestapparaît, le transfert a réussi.Dans la console Container Registry, ouvrez votre instance Enterprise Edition.
Dans le volet de navigation de gauche, choisissez . Cliquez sur coraza-proxy-wasm.
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>
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.
-
Créez un fichier nommé
wasm-plugin.yamlavec le contenu suivant. Le tableau ci-dessous décrit les champs clés. Dans cet exemple, l'ensemble de directivesdefaultactive le moteur de règles Coraza et définit une seule règle : refuser toute requête dont l'en-têtex-user-typeest égal àbaned.Champ
description
spec.urlAdresse de l'image OCI incluant le tag. Prend en charge les schémas
oci://,file://ethttp[s]://.spec.imagePullSecretNom du Secret Kubernetes contenant les identifiants du registre.
spec.imagePullPolicyPolitique d'extraction d'image.
spec.selectorSélecteur d'étiquettes déterminant quelles charges de travail chargent ce plug-in. Ici, il cible la passerelle d'entrée.
spec.phaseEmplacement d'insertion du plug-in dans la chaîne de filtres.
AUTHNle place avant les filtres d'authentification, afin que les requêtes soient inspectées aussi tôt que possible.spec.pluginConfigConfiguration spécifique à Coraza.
directives_mapdéfinit des ensembles de règles nommés utilisant la syntaxe SecRule.default_directivesspé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 -
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.
-
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 renvoie200 OK:curl -v http://<gateway-ip>/> GET / HTTP/1.1 > Host: <gateway-ip> ... < HTTP/1.1 200 OK < server: istio-envoy ... -
Envoyez une requête avec l'en-tête bloqué. Résultat attendu : la passerelle renvoie
403 Forbidden. La réponse403confirme 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 ...