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
Empacote o binário Wasm do Coraza como uma imagem OCI e envie-a para um registro de contêiner.
Crie um Secret do Kubernetes para que o gateway do ASM possa baixar a imagem.
Aplique um recurso
WasmPluginpara carregar o plug-in na cadeia de filtros do Envoy do gateway e configurar as diretivas SecRule.O gateway avalia cada requisição de entrada com base nas regras configuradas e retorna
403 Forbiddenpara qualquer requisição correspondente a uma regra de negação.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do ASM v1.18 ou posterior com um cluster do Container Service for Kubernetes (ACK) adicionado. Para mais informações, consulte Adicionar um cluster a uma instância do ASM
Injeção automática de proxy sidecar ativada. Para mais informações, consulte Gerencie namespaces globais
A aplicação HTTPBin implantada e acessível. Para mais informações, consulte Implantar a aplicação HTTPBin
Uma instância do Container Registry Enterprise Edition (com suporte a imagens OCI). Para mais informações, consulte Crie uma instância do Container Registry Enterprise Edition
Docker instalado. Para mais informações, consulte Obter o Docker
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 |
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 |
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 |
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
-
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 -
Renomeie o binário para
plugin.wasm. O ASM exige exatamente este nome de arquivo:mv coraza-proxy-wasm.wasm plugin.wasm -
Crie um
Dockerfileno mesmo diretório:FROM scratch ADD ./plugin.wasm ./plugin.wasm -
Crie a imagem OCI:
docker build -t coraza-proxy-wasm:latest .
Envie a imagem para o Container Registry
-
Crie um namespace no Container Registry:
Faça login no console do Container Registry. No painel de navegação à esquerda, clique em Instances.
Na página Instances, clique no cartão da sua instância do Container Registry Enterprise Edition.
No painel de navegação à esquerda, escolha . Clique em Create Namespace, defina Namespace como
wasme clique em OK.
-
Ative o acesso à Internet para o registro: No painel de navegação à esquerda, escolha . 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.
NotaEste 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.
-
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-hangzhoudocker login --username=<your-username> <your-registry-endpoint>.cr.aliyuncs.com -
Marque e envie a imagem: Substitua
<image-id>pelo ID da imagem retornado pelo comandodocker buildna 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 -
Verifique se a imagem foi enviada: Se a imagem com a tag
latestaparecer, o envio foi bem-sucedido.No console do Container Registry, abra sua instância Enterprise Edition.
No painel de navegação à esquerda, escolha . Clique em coraza-proxy-wasm.
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>
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.
-
Crie um arquivo chamado
wasm-plugin.yamlcom o seguinte conteúdo: A tabela abaixo descreve os campos principais: Neste exemplo, o conjunto de diretivasdefaultativa o mecanismo de regras do Coraza e define uma única regra: negar qualquer requisição cujo cabeçalhox-user-typeseja igual abaned.Campo
Descrição
spec.urlEndereço da imagem OCI incluindo a tag. Suporta os esquemas
oci://,file://ehttp[s]://.spec.imagePullSecretNome do Secret do Kubernetes com as credenciais do registro.
spec.imagePullPolicyPolítica de download da imagem.
spec.selectorSeletor de rótulos que determina quais workloads carregam este plug-in. Aqui, ele tem como alvo o gateway de entrada.
spec.phaseOnde inserir o plug-in na cadeia de filtros.
AUTHNo posiciona antes dos filtros de autenticação, garantindo a inspeção das requisições o mais cedo possível.spec.pluginConfigConfiguração específica do Coraza.
directives_mapdefine conjuntos de regras nomeados usando a sintaxe SecRule.default_directivesespecifica 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 -
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.
-
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 retorna200 OK:curl -v http://<gateway-ip>/> GET / HTTP/1.1 > Host: <gateway-ip> ... < HTTP/1.1 200 OK < server: istio-envoy ... -
Envie uma requisição com o cabeçalho bloqueado: Resultado esperado: o gateway retorna
403 Forbidden: A resposta403confirma 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 ...