Todos os produtos
Search
Central de documentação

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

Última atualização: Jun 28, 2026

As regras de roteamento do VirtualService e os controles de acesso do AuthorizationPolicy não cobrem ameaças da camada de aplicação, como injeção de SQL, cross-site scripting (XSS) ou outros ataques do OWASP Top 10. O plug-in Coraza WebAssembly (Wasm) resolve esse problema ao adicionar um Web Application Firewall (WAF) diretamente no processo Envoy do gateway. O sistema inspeciona cada requisição de entrada e bloqueia o tráfego malicioso antes que ele alcance seus serviços, sem necessidade de sidecar externo ou salto adicional na rede.

O Coraza é um mecanismo de WAF open-source mantido pela OWASP que utiliza a sintaxe ModSecurity SecRule. Para implantá-lo, empacote o binário Wasm do Coraza como uma imagem OCI e envie-a para um registro de contêiner. Em seguida, aplique um recurso WasmPlugin para carregá-lo na cadeia de filtros do Envoy.

Como funciona

  1. Empacote o binário Wasm do Coraza como uma imagem OCI e envie-a para um registro de contêiner.

  2. Crie um Secret do Kubernetes para que o gateway do ASM possa baixar a imagem.

  3. Aplique um recurso WasmPlugin para carregar o plug-in na cadeia de filtros do Envoy do gateway e configurar as diretivas SecRule.

  4. O gateway avalia cada requisição de entrada com base nas regras configuradas e retorna 403 Forbidden para qualquer requisição correspondente a uma regra de negação.

Pré-requisitos

Antes de começar, verifique se você tem:

Métodos de carregamento de plug-ins Wasm

O ASM oferece três formas de carregar um plug-in Wasm. Este tutorial utiliza o método de imagem OCI.

Método

Como funciona

Quando usar

Imagem OCI (usado neste tutorial)

Empacote o binário .wasm como uma imagem OCI e envie-a para um registro de contêiner. O gateway baixa a imagem do repositório.

Recomendado para a maioria das implantações em produção. Oferece versionamento, auditoria e integração com a infraestrutura de registro existente.

ConfigMap

Armazene o binário .wasm em um ConfigMap do Kubernetes e monte-o no pod do gateway. O gateway carrega o arquivo do sistema de arquivos local.

Ideal para prototipagem rápida ou ambientes isolados sem acesso a um registro. Limitado ao tamanho máximo de 1 MiB do ConfigMap.

Baixe via HTTP

Hospede o binário .wasm em um armazenamento em nuvem ou qualquer endpoint acessível via HTTP. O gateway baixa o arquivo pela rede.

Adequado para ambientes onde um servidor centralizado de artefatos já fornece binários via HTTP.

Etapa 1: Crie e envie a imagem OCI do Coraza Wasm

Baixe e prepare o binário do plug-in

  1. Baixe o plug-in Coraza Wasm e descompacte-o:

       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. Renomeie o binário para plugin.wasm. O ASM exige exatamente este nome de arquivo:

       mv coraza-proxy-wasm.wasm plugin.wasm
  3. Crie um Dockerfile no mesmo diretório:

       FROM scratch
       ADD ./plugin.wasm ./plugin.wasm
  4. Crie a imagem OCI:

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

Envie a imagem para o Container Registry

  1. Crie um namespace no Container Registry:

    1. Faça login no console do Container Registry. No painel de navegação à esquerda, clique em Instances.

    2. Na página Instances, clique no cartão da sua instância do Container Registry Enterprise Edition.

    3. No painel de navegação à esquerda, escolha Repository > Namespace. Clique em Create Namespace, defina Namespace como wasm e clique em OK.

  2. Ative o acesso à Internet para o registro: No painel de navegação à esquerda, escolha Repository > Access Control. Clique na aba Internet, ative Enable Access over Internet e adicione listas de permissões da Internet conforme necessário. Caso não precise de controle baseado em lista de permissões, exclua a lista padrão.

    Nota

    Este exemplo usa o endpoint público. Para uso em produção, configure o acesso via Virtual Private Cloud (VPC) para obter melhor segurança e desempenho de rede. Para mais informações, consulte Configure uma ACL de VPC.

  3. Faça login no registro: Insira sua senha quando solicitado. Substitua os placeholders abaixo pelos valores reais:

    Placeholder

    Descrição

    Exemplo

    <your-username>

    Nome de usuário de login para a instância do Container Registry

    admin@china

    <your-registry-endpoint>

    Endpoint da sua instância do Container Registry

    enterprise-registry.cn-hangzhou

       docker login --username=<your-username> <your-registry-endpoint>.cr.aliyuncs.com
  4. Marque e envie a imagem: Substitua <image-id> pelo ID da imagem retornado pelo comando docker build na seção anterior.

       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. Verifique se a imagem foi enviada: Se a imagem com a tag latest aparecer, o envio foi bem-sucedido.

    1. No console do Container Registry, abra sua instância Enterprise Edition.

    2. No painel de navegação à esquerda, escolha Repository > Repositories. Clique em coraza-proxy-wasm.

    3. No painel de navegação à esquerda, clique em Tags.

Etapa 2: Crie um Secret para download de imagens

Como o repositório é privado, o gateway do ASM precisa de credenciais para baixar a imagem Wasm. Crie um Secret do Kubernetes com as credenciais do registro:

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>
Importante

O Secret deve estar no mesmo namespace do recurso WasmPlugin. Este tutorial usa istio-system. Ajuste o valor de -n se o seu plug-in tiver como alvo um namespace diferente.

Verifique o Secret:

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

Etapa 3: Aplique o recurso WasmPlugin

O recurso WasmPlugin declara qual plug-in carregar, onde inseri-lo na cadeia de filtros do Envoy e como configurá-lo.

  1. Crie um arquivo chamado wasm-plugin.yaml com o seguinte conteúdo: A tabela abaixo descreve os campos principais: Neste exemplo, o conjunto de diretivas default ativa o mecanismo de regras do Coraza e define uma única regra: negar qualquer requisição cujo cabeçalho x-user-type seja igual a baned.

    Campo

    Descrição

    spec.url

    Endereço da imagem OCI incluindo a tag. Suporta os esquemas oci://, file:// e http[s]://.

    spec.imagePullSecret

    Nome do Secret do Kubernetes com as credenciais do registro.

    spec.imagePullPolicy

    Política de download da imagem.

    spec.selector

    Seletor de rótulos que determina quais workloads carregam este plug-in. Aqui, ele tem como alvo o gateway de entrada.

    spec.phase

    Onde inserir o plug-in na cadeia de filtros. AUTHN o posiciona antes dos filtros de autenticação, garantindo a inspeção das requisições o mais cedo possível.

    spec.pluginConfig

    Configuração específica do Coraza. directives_map define conjuntos de regras nomeados usando a sintaxe SecRule. default_directives especifica qual conjunto de regras aplicar por padrão.

       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. Conecte-se à instância do ASM com o kubectl e aplique o recurso:

       kubectl apply -f wasm-plugin.yaml

Etapa 4: Verifique o plug-in WAF

Teste requisições permitidas e bloqueadas para confirmar o funcionamento do plug-in.

  1. Envie uma requisição normal para a aplicação HTTPBin através do gateway de entrada: Substitua <gateway-ip> pelo endereço IP do seu gateway de entrada. Para mais informações, consulte Obter o endereço IP do gateway de entrada. Resultado esperado: o gateway retorna 200 OK:

       curl -v http://<gateway-ip>/
       > GET / HTTP/1.1
       > Host: <gateway-ip>
       ...
       < HTTP/1.1 200 OK
       < server: istio-envoy
       ...
  2. Envie uma requisição com o cabeçalho bloqueado: Resultado esperado: o gateway retorna 403 Forbidden: A resposta 403 confirma que o plug-in WAF do Coraza está ativo e aplicando a regra configurada.

       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
       ...