1. Introdução
Olá! Este é o codelab das regras pré-configuradas do WAF do Cloud Armor.
O Google Cloud Armor é a solução de segurança de rede de borda empresarial do Google que oferece proteção contra DDOS, aplicação de regras WAF e gerenciamento adaptável em escala.
O Cloud Armor ampliou os conjuntos de regras pré-configuradas do WAF para mitigar as 10 principais vulnerabilidades de segurança de aplicativos da Web do OWASP. Os conjuntos de regras são baseados no conjunto de regras principais do OWASP Modsecurity versão 3.0.2 para proteção contra alguns dos riscos mais comuns de segurança de aplicativos da Web, como a inclusão de arquivos locais (lfi), a inclusão remota de arquivos (rfi), a execução remota de código (rce) e muito mais.
Neste codelab, você vai aprender a mitigar algumas vulnerabilidades comuns usando as regras do WAF do Google Cloud Armor.
O que você vai aprender
- Como configurar um grupo de instâncias e um balanceador de carga global para dar suporte a um serviço
- Como configurar políticas de segurança do Cloud Armor com regras de WAF pré-configuradas para proteção contra lfi, rce, scanners, ataques de protocolo e fixação de sessão.
- Como validar se o Cloud Armor mitigou um ataque observando registros.
O que é necessário
- Conhecimento básico do Google Compute Engine ( codelab)
- Conhecimento básico de TCP/IP e redes
- Conhecimento básico de linha de comando do Unix/Linux
- É útil fazer um tour de rede no GCP com o curso Networking in the Google Cloud
- (Opcional) Conclua o laboratório Cloudnet20 Cloud Armor para aprender a proteger cargas de trabalho com injeção de SQL, regras baseadas em IP e com base na localização geográfica.
Topologia e caso de uso
Figura 1: topologia do codelab das regras do WAF do Cloud Armor
O aplicativo OWASP Juice Shop é útil para treinamentos e conscientização sobre segurança, porque contém instâncias das 10 principais vulnerabilidades de segurança da OWASP desde a concepção. Um invasor pode explorá-la para fins de teste. Neste codelab, vamos usá-lo para demonstrar alguns ataques a aplicativos, seguidos pela proteção do aplicativo com as regras WAF do Cloud Armor. O aplicativo estará à frente de um balanceador de carga do Google Cloud, em que a política e as regras de segurança do Cloud Armor serão aplicadas. Ele será disponibilizado na Internet pública e poderá ser acessado de praticamente qualquer lugar e protegido pelo uso de regras de firewall do Cloud Armor e da VPC.
2. Configuração e requisitos
Configuração de ambiente autoguiada
- Faça login no console do Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.
Lembre-se do código do projeto, um nome exclusivo em todos os projetos do Google Cloud. O nome acima já foi escolhido e não servirá para você. Faremos referência a ele mais adiante neste codelab como PROJECT_ID
.
- Em seguida, será necessário ativar o faturamento no Console do Cloud para usar os recursos do Google Cloud.
A execução deste codelab não será muito cara, se for o caso. Siga todas as instruções na seção "Limpeza", que orienta você sobre como encerrar recursos para não incorrer em cobranças além deste tutorial. Novos usuários do Google Cloud estão qualificados para o programa de US$300 de avaliação sem custo financeiro.
Inicie o Cloud Shell
Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.
No Console do GCP, clique no ícone do Cloud Shell na barra de ferramentas localizada no canto superior direito:
O provisionamento e a conexão com o ambiente levarão apenas alguns instantes para serem concluídos: Quando o processamento for concluído, você verá algo como:
Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Todo o trabalho neste laboratório pode ser feito apenas com um navegador.
Antes de começar
No Cloud Shell, verifique se o ID do projeto está configurado
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] PROJECT_ID=[YOUR-PROJECT-NAME] echo $PROJECT_ID
Ativar APIs
Ative todos os serviços necessários
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com
3. criar a rede VPC
Crie uma rede VPC
No Cloud Shell
gcloud compute networks create ca-lab-vpc --subnet-mode custom
Saída
Created NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 ca-lab-vpc CUSTOM REGIONAL
Criar uma sub-rede
No Cloud Shell
gcloud compute networks subnets create ca-lab-subnet \ --network ca-lab-vpc --range 10.0.0.0/24 --region us-central1
Saída
Created NAME REGION NETWORK RANGE ca-lab-subnet us-central1 ca-lab-vpc 10.0.0.0/24
Crie regras de firewall de VPC
Depois de criar a VPC e a sub-rede, configure algumas regras de firewall. A primeira regra de firewall vai ser usada para permitir que todos os IPs acessem o IP externo do site do aplicativo de teste na porta 3000. A segunda regra de firewall será usada para permitir verificações de integridade do IP de origem dos balanceadores de carga.
No Cloud Shell
gcloud compute firewall-rules create allow-js-site --allow tcp:3000 --network ca-lab-vpc
Saída
Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED allow-js-site ca-lab-vpc INGRESS 1000 tcp:3000 False
Crie regras de firmware para permitir verificações de integridade dos intervalos de verificação de integridade do Google.
No Cloud Shell
gcloud compute firewall-rules create allow-health-check \ --network=ca-lab-vpc \ --action=allow \ --direction=ingress \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --target-tags=allow-healthcheck \ --rules=tcp
Saída
Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED allow-health-check ca-lab-vpc INGRESS 1000 tcp False
4. Configurar o aplicativo de teste
A próxima etapa é criar o aplicativo de teste, neste caso, o servidor da Web OWASP Juice Shop.
Ao criar a instância de computação, usamos uma imagem de contêiner para garantir que o servidor tenha os serviços adequados. Este servidor será implantado em us-central1-c e terá uma tag de rede que permitirá verificações de integridade.
Crie o aplicativo OWASP Juice Shop
Use o conhecido aplicativo OWASP Juice Shop de código aberto para funcionar como o aplicativo vulnerável. Você também pode usar esse aplicativo para realizar desafios de segurança do OWASP pelo site.
No Cloud Shell
gcloud compute instances create-with-container owasp-juice-shop-app --container-image bkimminich/juice-shop \ --network ca-lab-vpc \ --subnet ca-lab-subnet \ --private-network-ip=10.0.0.3 \ --machine-type n1-standard-2 \ --zone us-central1-c \ --tags allow-healthcheck
Saída
NAME ZONE MACHINE_TYPE PREEMPTIBLE owasp-juice-shop-app us-central1-c n1-standard-2 INTERNAL_IP EXTERNAL_IP STATUS 10.0.0.3 <public IP> RUNNING
Configurar o componente do balanceador de carga do Cloud: grupo de instâncias
Crie o grupo de instâncias não gerenciadas.
No Cloud Shell
gcloud compute instance-groups unmanaged create juice-shop-group \ --zone=us-central1-c
Saída
NAME LOCATION SCOPE NETWORK MANAGED INSTANCES juice-shop-group us-central1-c zone 0
Adicione a instância do GCE da Juice Shop ao grupo de instâncias não gerenciadas.
No Cloud Shell
gcloud compute instance-groups unmanaged add-instances juice-shop-group \ --zone=us-central1-c \ --instances=owasp-juice-shop-app
Saída
Updated [https://www.googleapis.com/compute/v1/projects/<project name>/zones/us-central1-c/instanceGroups/juice-shop-group].
Defina a porta nomeada como a do aplicativo Juice Shop.
No Cloud Shell
gcloud compute instance-groups unmanaged set-named-ports \ juice-shop-group \ --named-ports=http:3000 \ --zone=us-central1-c
Saída
Updated [https://www.googleapis.com/compute/v1/projects/<project name>/zones/us-central1-c/instanceGroups/juice-shop-group].
Agora que você criou o grupo de instâncias não gerenciadas, a próxima etapa é criar verificação de integridade, serviço de back-end, mapa de URLs, proxy de destino e regra de encaminhamento.
Configurar o componente do balanceador de carga do Cloud: verificação de integridade
Crie a verificação de integridade da porta de serviço da loja de sucos.
No Cloud Shell
gcloud compute health-checks create tcp tcp-port-3000 \ --port 3000
Saída
Created NAME PROTOCOL tcp-port-3000 TCP
Configurar o componente do balanceador de carga do Cloud: serviço de back-end
Crie os parâmetros do serviço de back-end.
No Cloud Shell
gcloud compute backend-services create juice-shop-backend \ --protocol HTTP \ --port-name http \ --health-checks tcp-port-3000 \ --enable-logging \ --global
Saída
NAME BACKENDS PROTOCOL juice-shop-backend HTTP
Adicione o grupo de instâncias da Juice Shop ao serviço de back-end.
No Cloud Shell
gcloud compute backend-services add-backend juice-shop-backend \ --instance-group=juice-shop-group \ --instance-group-zone=us-central1-c \ --global
Saída
Updated [https://www.googleapis.com/compute/v1/projects/cythom-host1/global/backendServices/juice-shop-backend].
Configurar o componente do balanceador de carga do Cloud: mapa de URLs
Crie o mapa de URL para enviar ao back-end.
No Cloud Shell
gcloud compute url-maps create juice-shop-loadbalancer \ --default-service juice-shop-backend
Saída
NAME DEFAULT_SERVICE juice-shop-loadbalancer backendServices/juice-shop-backend
Configurar o componente do balanceador de carga Cloud: proxy de destino
Crie o proxy de destino para a frente do mapa de URL.
No Cloud Shell
gcloud compute target-http-proxies create juice-shop-proxy \ --url-map juice-shop-loadbalancer
Saída
NAME URL_MAP juice-shop-proxy juice-shop-loadbalancer
Configurar o componente do balanceador de carga do Cloud: regra de encaminhamento
Crie a regra de encaminhamento para o balanceador de carga.
No Cloud Shell
gcloud compute forwarding-rules create juice-shop-rule \ --global \ --target-http-proxy=juice-shop-proxy \ --ports=80
Saída
Created [https://www.googleapis.com/compute/v1/projects/cythom-host1/global/forwardingRules/juice-shop-rule].
Verificar se o serviço da loja de sucos está on-line
No Cloud Shell
PUBLIC_SVC_IP="$(gcloud compute forwarding-rules describe juice-shop-rule --global --format="value(IPAddress)")"
No Cloud Shell
echo $PUBLIC_SVC_IP
Saída
<public VIP of service>
Aguarde alguns minutos antes de continuar. Caso contrário, é possível que você recupere uma resposta HTTP/1.1 404 Not Found.
No Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP
Saída
HTTP/1.1 200 OK <...>
Outra opção é acessar o navegador para acessar a loja de sucos.
Agora estamos prontos para explorar as vulnerabilidades da loja de sucos e saber como se proteger contra elas com os conjuntos de regras do WAF do Cloud Armor.
5. Demonstrar vulnerabilidades conhecidas
Para poupar tempo, vamos demonstrar em etapas resumidas os estados antes e depois das regras do WAF do Cloud Armor.
Observar uma vulnerabilidade de LFI: travessia de caminhos
A inclusão de arquivos locais é o processo de observação de arquivos presentes no servidor explorando a falta de validação de entradas na solicitação para expor dados sensíveis. O exemplo a seguir mostra simplesmente uma travessia de caminhos possível. No navegador ou com curl, observe um caminho existente disponibilizado pelo aplicativo.
No Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/ftp
Saída
HTTP/1.1 200 OK <...>
Observe também que a travessia de caminhos também funciona:
No Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/ftp/../
Saída
HTTP/1.1 200 OK <...>
Observar uma vulnerabilidade do RCE
A execução remota de código inclui vários cenários de injeção de comando do UNIX e do Windows, permitindo que os invasores executem comandos do SO geralmente restritos a usuários privilegiados. O exemplo a seguir mostra uma execução simples do comando "ls" transmitida.
No Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/ftp?doc=/bin/ls
Saída
HTTP/1.1 200 OK <...>
Remova as flags curl para observar a saída completa.
Observar o acesso de um verificador conhecido
Aplicativos comerciais e de verificação de código aberto para diversas finalidades, incluindo a verificação de vulnerabilidades. Essas ferramentas usam um user agent conhecido e outros cabeçalhos. Observe que o curl funciona com um cabeçalho de user agent conhecido:
No Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP -H "User-Agent: blackwidow"
Saída
HTTP/1.1 200 OK <...>
Observe um ataque de protocolo: divisão HTTP
Alguns aplicativos da Web usam entradas do usuário para gerar os cabeçalhos nas respostas. Se o aplicativo não filtrar a entrada adequadamente, um invasor poderá envenenar o parâmetro de entrada com a sequência %0d%0a (a sequência CRLF usada para separar linhas diferentes). A resposta poderia, então, ser interpretada como duas respostas por qualquer coisa que acontecesse para analisá-la, como um servidor proxy intermediário, possivelmente veiculando conteúdo falso em solicitações subsequentes. Insira a sequência %0d%0a no parâmetro de entrada. Isso pode levar à veiculação de uma página enganosa.
No Cloud Shell
curl -Ii "http://$PUBLIC_SVC_IP/index.html?foo=advanced%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2035%0d%0a%0d%0a<html>Sorry,%20System%20Down</html>"
Saída
HTTP/1.1 200 OK <...>
Observar a fixação da sessão
No Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP -H session_id=X
Saída
HTTP/1.1 200 OK <...>
6. Definir as regras do WAF do Cloud Armor
Liste as regras pré-configuradas de WAF:
No Cloud Shell
gcloud compute security-policies list-preconfigured-expression-sets
Saída
EXPRESSION_SET Sqli-canary RULE_ID owasp-crs-v030001-id942110-sqli owasp-crs-v030001-id942120-sqli <...>
Crie a política de segurança do Cloud Armor
No Cloud Shell:
gcloud compute security-policies create block-with-modsec-crs \ --description "Block with OWASP ModSecurity CRS"
Atualizar a regra padrão da política de segurança
Observe que a prioridade da regra padrão tem um valor numérico de 2147483647
No Cloud Shell:
gcloud compute security-policies rules update 2147483647 \ --security-policy block-with-modsec-crs \ --action "deny-403"
Como a regra padrão é configurada com negação de ação, precisamos permitir o acesso do seu IP. Encontre seu IP público (curl, ipmonkey, whatismyip etc.).
No Cloud Shell:
MY_IP=$(curl ifconfig.me)
Adicione a primeira regra para permitir o acesso do seu IP (INSIRA SEU IP ABAIXO)
No Cloud Shell:
gcloud compute security-policies rules create 10000 \ --security-policy block-with-modsec-crs \ --description "allow traffic from my IP" \ --src-ip-ranges "$MY_IP/32" \ --action "allow"
Atualizar a política de segurança para bloquear ataques de LFI
Aplique o conjunto de regras principais do OWASP ModSecurity que impede a travessia de caminhos para inclusões de arquivos locais.
No Cloud Shell:
gcloud compute security-policies rules create 9000 \ --security-policy block-with-modsec-crs \ --description "block local file inclusion" \ --expression "evaluatePreconfiguredExpr('lfi-stable')" \ --action deny-403
Atualizar a política de segurança para bloquear a execução remota de código (rce)
De acordo com o conjunto de regras principais do ModSecurity do OWASP, aplique as regras que procuram rce, incluindo injeção de comando. Comandos típicos do SO são detectados e bloqueados.
No Cloud Shell:
gcloud compute security-policies rules create 9001 \ --security-policy block-with-modsec-crs \ --description "block rce attacks" \ --expression "evaluatePreconfiguredExpr('rce-stable')" \ --action deny-403
Atualizar a política de segurança para bloquear verificações de segurança
Aplique o conjunto de regras principais do OWASP ModSecurity para bloquear verificadores de segurança conhecidos, clientes HTTP de script e rastreadores da Web.
No Cloud Shell:
gcloud compute security-policies rules create 9002 \ --security-policy block-with-modsec-crs \ --description "block scanners" \ --expression "evaluatePreconfiguredExpr('scannerdetection-stable')" \ --action deny-403
Atualizar a política de segurança para bloquear ataques a protocolos
De acordo com o conjunto de regras principais do ModSecurity do OWASP, aplique as regras que procuram os caracteres de retorno de carro (CR) %0d e feed de linha (LF) %0a e outros tipos de ataques de protocolo, como Smuggling de solicitação HTTP.
No Cloud Shell:
gcloud compute security-policies rules create 9003 \ --security-policy block-with-modsec-crs \ --description "block protocol attacks" \ --expression "evaluatePreconfiguredExpr('protocolattack-stable')" \ --action deny-403
Atualizar a política de segurança para bloquear a fixação da sessão
De acordo com o conjunto de regras principais do ModSecurity do OWASP, aplique as regras que...
No Cloud Shell:
gcloud compute security-policies rules create 9004 \ --security-policy block-with-modsec-crs \ --description "block session fixation attacks" \ --expression "evaluatePreconfiguredExpr('sessionfixation-stable')" \ --action deny-403
Anexe a política de segurança ao serviço de back-end
No Cloud Shell:
gcloud compute backend-services update juice-shop-backend \ --security-policy block-with-modsec-crs \ --global
As regras podem levar algum tempo para serem propagadas (não mais de 10 minutos). Quando tiver certeza de que passou tempo suficiente, teste as vulnerabilidades demonstradas anteriormente para confirmar a aplicação das regras do WAF do Cloud Armor na próxima etapa.
7. Observar a proteção do Cloud Armor com o conjunto de regras principais do OWASP ModSecurity
Confirme se a vulnerabilidade da LFI foi mitigada
No Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/?a=../
Saída
HTTP/1.1 403 Forbidden <...>
Confirmar se o ataque RCE foi mitigado
No Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/ftp?doc=/bin/ls
Saída
HTTP/1.1 403 Forbidden <..>
Confirmar detecção de scanner conhecida
No Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP -H "User-Agent: blackwidow"
Saída
HTTP/1.1 403 Forbidden <..>
Confirmar que um ataque de protocolo foi mitigado
De acordo com o conjunto de regras principais do ModSecurity da OWASP versão 3.0.2, o ataque do protocolo é mitigado pela
No Cloud Shell
curl -Ii "http://$PUBLIC_SVC_IP/index.html?foo=advanced%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2035%0d%0a%0d%0a<html>Sorry,%20System%20Down</html>"
Saída
HTTP/1.1 403 Forbidden <..>
Confirmar que as tentativas de fixação de sessão estão bloqueadas
No Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/?session_id=a
Saída
HTTP/1.1 403 Forbidden <..>
8. Revise as regras de segurança do Cloud Armor
Agora que criamos a política de segurança, vamos dar uma olhada exatamente nas regras que foram configuradas.
As regras são avaliadas por prioridade: os números mais baixos são avaliados primeiro e, depois de acionados, o processamento não continua para as regras com valores de prioridade mais altos.
- Prioridade 9000 - Bloquear LFI (inclusão de arquivo local)
- Prioridade 9001: bloquear RCE (execução de código remoto/injeção de comando)
- Prioridade 9002: scanners de bloco detectados
- Prioridade 9003 - Bloquear ataques de protocolo, como divisão de HTTP e contrabando de HTTP
- Prioridade 9004 - Bloquear ataques de fixação de sessão
- Prioridade 10000: permitir que seu IP acesse o site
- Padrão de prioridade: negar.
*Observe a opção é configurada com o número de prioridade mais alto para permitir o acesso ao site, mas bloqueia qualquer ataque.
9. Observar os registros da política de segurança do Cloud Armor
Na página do console do Cloud Armor, é possível conferir os detalhes da política de segurança e clicar na guia Logs
, seguida do link View policy logs
para acessar a página do Cloud Logging. Ele vai filtrar automaticamente com base na política de segurança relevante, por exemplo, resource.type:(http_load_balancer) AND jsonPayload.enforcedSecurityPolicy.name:(block-with-modsec-crs)
: Observe os códigos de resposta de erro 403 e expanda os detalhes do registro para observar o nome da política de segurança aplicada, o valor do campo correspondente e os IDs de expressão pré-configurados (ou o ID da assinatura). As capturas de tela abaixo mostram exemplos dos registros das políticas de segurança aplicadas configuradas neste codelab.
Registro da LFI
Registro do RCE
Registro de detecção do scanner
Registro de ataque de protocolo
Registro de fixação de sessão
10. Limpeza do laboratório
Limpe os recursos agora que você concluiu o laboratório.
Execute estes comandos para excluir a política de segurança do Cloud Armor, o balanceador de carga, as instâncias, as regras de firewall e a rede VPC.
Remover a política de segurança do Cloud Armor do serviço de back-end
gcloud -q compute backend-services update juice-shop-backend --security-policy "" --global
Excluir a política de segurança do Cloud Armor
A exclusão da política de segurança exclui automaticamente as regras associadas.
gcloud -q compute security-policies delete block-with-modsec-crs
Exclua os recursos do balanceador de carga
Entre os recursos do balanceador de carga que devem ser excluídos estão a regra de encaminhamento, target-http-proxies, url-maps, back-end, verificações de integridade e o grupo de instâncias.
gcloud -q compute forwarding-rules delete juice-shop-rule --global gcloud -q compute target-http-proxies delete juice-shop-proxy gcloud -q compute url-maps delete juice-shop-loadbalancer gcloud -q compute backend-services delete juice-shop-backend \ --global gcloud -q compute health-checks delete tcp-port-3000 gcloud -q compute instance-groups unmanaged delete juice-shop-group --zone=us-central1-c
Excluir a instância
gcloud -q compute instances delete owasp-juice-shop-app --zone us-central1-c
Exclua as regras de firewall, a sub-rede e a VPC
gcloud -q compute firewall-rules delete allow-health-check gcloud -q compute firewall-rules delete allow-js-site gcloud -q compute networks subnets delete ca-lab-subnet --region us-central1 gcloud -q compute networks delete ca-lab-vpc
11. Parabéns!
Parabéns por concluir o codelab das regras pré-configuradas do WAF do Cloud Armor.
O que vimos
- Como configurar um grupo de instâncias e um balanceador de carga do Cloud global
- Como configurar políticas de segurança do Cloud Armor com regras de WAF pré-configuradas para proteção contra lfi, rce, scanners, ataques de protocolo e fixação de sessão.
- Como validar se o Cloud Armor mitigou alguns dos 10 principais ataques do OWASP usando registros
Próximas etapas
- Proteja seu aplicativo contra as 10 principais vulnerabilidades do OWASP com as regras do WAF pré-configuradas do Cloud Armor
- Ajustar regras com base nos níveis de sensibilidade
- Use a referência de linguagem das regras personalizadas para aplicação de segurança mais específica.