Cloud Armor para NLB/VM com regras definidas pelo usuário

1. Introdução

As políticas de segurança do Cloud Armor são usadas para configurar regras definidas pelo usuário e filtrar o tráfego na borda da rede do Google, antes da sua infraestrutura. As políticas de segurança do Network Edge podem ser usadas para ajudar a proteger e permitir ou bloquear o tráfego destinado aos seguintes tipos de endpoints: balanceador de carga de rede, encaminhamento de protocolo e VMs com IPs públicos.

7bc9d3ed0c03b54f.png

Neste codelab, vamos demonstrar como configurar políticas de segurança do Cloud Armor com regras definidas pelo usuário para evitar ataques DDoS.

f0a40260147e71b1.png

Figura 1. Cloud Armor para VM com proteção de IP público.

O que você vai aprender

  • Políticas de segurança do Cloud Armor com configuração de regras definidas pelo usuário
  • Configurações e testes de ajuste de UDP.

O que é necessário

  • Conhecimento de TCP/IP
  • Conhecimento da linha de comando do Unix/Linux

2. 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]
prodproject=YOUR-PROJECT-NAME
echo $prodproject

3. Criar rede VPC de destino

Na seção a seguir, vamos configurar redes VPC e configurações de rede relacionadas. A política de segurança de borda da rede do Cloud Armor é regional. Por isso, configuramos todos os recursos relacionados na região asia-southeast1.

Rede VPC

No Cloud Shell

gcloud compute networks create ca4nlb --project=$prodproject --subnet-mode=custom

Criar sub-rede

No Cloud Shell

gcloud compute networks subnets create ca4nlb-asia-southeast1 --project=$prodproject --range=10.0.0.0/24 --network=ca4nlb --region=asia-southeast1

Crie regras de firewall.

Nesta seção, vamos adicionar uma regra de firewall para permitir o tráfego UDP esperado para a porta 10000.

No Cloud Shell, crie uma regra de firewall para abrir a porta UDP 10000 para o teste a seguir.

gcloud compute firewall-rules create ca4nlb-udp10000 --allow udp:10000 --network ca4nlb --source-ranges 0.0.0.0/0 --enable-logging

No Cloud Shell, crie uma regra de firewall para permitir que o IAP se conecte às suas instâncias de VM.

gcloud compute firewall-rules create ca4nlb-iap-prod --network ca4nlb --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging

4. Criar instâncias de VM de destino

Crie uma VM de destino para testar políticas de segurança. Essa VM precisa ter um endereço IP público e a porta UDP 10000 aberta.

No Cloud Shell, crie a instância targetvm

gcloud compute instances create targetvm \
--zone=asia-southeast1-b \
--image-family=debian-11 \
--image-project=debian-cloud \
--network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=ca4nlb-asia-southeast1 \
--shielded-secure-boot \
--shielded-vtpm \
--shielded-integrity-monitoring

5. Configurar a proteção avançada contra DDoS da rede

No Cloud Shell

 gcloud compute security-policies create ca_advanced_ddos \
     --type CLOUD_ARMOR_NETWORK \
     --region asia-southeast1

 gcloud compute security-policies update ca_advanced_ddos \
     --network-ddos-protection ADVANCED \
     --region asia-southeast1

 gcloud compute network-edge-security-services create caedgepolicy \
     --security-policy ca_advanced_ddos \
     --region asia-southeast1

6. Criar uma política de segurança de borda de rede com regras padrão

Criar uma política de segurança de borda de rede

No Cloud Shell

gcloud alpha compute security-policies create customnetworkedge --type=CLOUD_ARMOR_NETWORK --region=asia-southeast1

Modificar a regra padrão

No Cloud Shell

gcloud alpha compute security-policies rules update 2147483647 --security-policy=customnetworkedge --action=deny --region=asia-southeast1

7. Criar uma política de segurança de borda de rede com regras configuradas e usadas

Deslocamento UDP predefinido pelo usuário e configurado na política do Cloud Armor. O pacote com esses "valores de ajuste" vai passar pela verificação da política e será enviado para a VM de back-end. No exemplo a seguir, vamos definir dois "offsets" com valores diferentes.

O primeiro valor está logo após o cabeçalho UDP, correspondendo exatamente a 2 bytes 0x1700.

O segundo valor é o deslocamento de 8 bytes do cabeçalho UDP, correspondendo exatamente a 4 bytes 0x12345678

O valor acima do pré-definido será convertido em uma visualização de bits de pacote UDP.

cbfdaeb93292e07b.png

No Cloud Shell

gcloud alpha compute security-policies add-user-defined-field customnetworkedge \
--user-defined-field-name=SIG1_AT_0 \
--base=udp --offset=8 --size=2 --mask=0xFF00 \
--region=asia-southeast1

gcloud alpha compute security-policies add-user-defined-field customnetworkedge \
--user-defined-field-name=SIG2_AT_8 \
--base=udp --offset=16 --size=4 --mask=0xFFFFFFFF \
--region=asia-southeast1

gcloud alpha compute security-policies rules create 1000 \
--security-policy=customnetworkedge \
--network-user-defined-fields="SIG1_AT_0;0x1700,SIG2_AT_8;0x12345678" \
--action=allow --region=asia-southeast1

8. Anexar política de segurança à VM de destino

No Cloud Shell, anexe a política de segurança à VM protegida.

gcloud alpha compute instances network-interfaces update targetvm \
--security-policy=customnetworkedge \
--security-policy-region=asia-southeast1 \
--network-interface=nic0 \
--zone=asia-southeast1-b

No Cloud Shell, descreva a VM de destino. Você vai ver que a securityPolicy está anexada. Registre o IP público para os testes a seguir.

gcloud alpha compute instances describe targetvm --zone=asia-southeast1-b

networkInterfaces:
- accessConfigs:
  - kind: compute#accessConfig
    name: External NAT
    natIP: 35.240.148.100
    networkTier: PREMIUM
    securityPolicy: https://www.googleapis.com/compute/alpha/projects/<project>/regions/asia-southeast1/securityPolicies/customnetworkedge

No Cloud Shell, desvincule a política de segurança da VM protegida.

gcloud alpha compute instances network-interfaces update targetvm \
--network-interface=nic0 \
--zone=asia-southeast1-b \
--security-policy= 

9. Prepare os recursos de teste.

Criar rede VPC de teste

No Cloud Shell

gcloud compute networks create test --project=$prodproject --subnet-mode=custom

Criar sub-rede de teste

No Cloud Shell

gcloud compute networks subnets create test-asia-southeast1 --project=$prodproject --range=10.0.1.0/24 --network=test --region=asia-southeast1

Criar firewall

No Cloud Shell, crie uma regra de firewall para permitir que o IAP se conecte às suas instâncias de VM.

gcloud compute firewall-rules create test-iap-prod --network test --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging

Criar VM de teste

No Cloud Shell

gcloud compute instances create test01 \
    --zone=asia-southeast1-b \
    --image-family=debian-11 \
    --image-project=debian-cloud \
    --network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=test-asia-southeast1 \
    --shielded-secure-boot \
    --shielded-vtpm \
    --shielded-integrity-monitoring

10. Verificação

Faça login no console da VM de teste e instale o gerador de pacotes packit.

sudo apt install packit

Seguindo o design de compensação de UDP, use o packit para gerar pacotes UDP. Simulamos um pacote (-t udp) do endereço IP de origem (-s 10.0.1.2) da interface (-s ens4) para o endereço IP de destino (-d 35.240.148.100) da targetVM com portas de destino (-D 10000) e de origem (-S 10000). O conteúdo do pacote corresponde aos valores (-p "0x 17 00 00 00 00 00 00 00 12 34 56 78"). Vamos enviar (-c 4) pacotes.

sudo packit -m inject -t UDP -i ens4 -s 10.0.1.2 -d 35.240.148.100 -S 10000 -D 10000 -p '0x 17 00 00 00 00 00 00 00 12 34 56 78' -c 4

Na VM de destino, execute o tcpdump para capturar o pacote UDP.

sudo tcpdump port 10000 -v -n 

tcpdump: listening on ens4, link-type EN10MB (Ethernet), snapshot length 262144 bytes
06:36:18.434106 IP (tos 0x0, ttl 128, id 17173, offset 0, flags [none], proto UDP (17), length 40)
    35.197.157.140.10000 > 10.0.0.2.10000: UDP, length 12
06:36:19.433656 IP (tos 0x0, ttl 128, id 55641, offset 0, flags [none], proto UDP (17), length 40)
    35.197.157.140.10000 > 10.0.0.2.10000: UDP, length 12
06:36:20.433935 IP (tos 0x0, ttl 128, id 27161, offset 0, flags [none], proto UDP (17), length 40)
    35.197.157.140.10000 > 10.0.0.2.10000: UDP, length 12
06:36:21.434150 IP (tos 0x0, ttl 128, id 46782, offset 0, flags [none], proto UDP (17), length 40)
    35.197.157.140.10000 > 10.0.0.2.10000: UDP, length 12

Se mudarmos os padrões de tráfego na VM de teste, não será possível capturar pacotes na VM de destino.

sudo packit -m inject -t UDP -i ens4 -s 10.148.0.6 -d 34.87.79.31 -S 10000 -D 10000 -p '0x 33 33 00 00 00 00 00 00 12 34 56 78' -c 4

11. Telemetria

Abra a métrica do Cloud e use a MQL abaixo para consultar dados de telemetria de NetworkSercurityPolicy.

fetch networksecurity.googleapis.com/RegionalNetworkSecurityPolicy
| metric 'networksecurity.googleapis.com/l3/external/packet_count'
| filter (resource.policy_name == 'customnetworkedge')
| align rate(1m)
| every 1m
| group_by [metric.blocked], [value_packet_count_mean: mean(value.packet_count)]
| group_by 1m, [value_packet_count_mean_mean: mean(value_packet_count_mean)]
| every 1m

Gere tráfego de alto volume com o comando de ajuste de correspondência.

sudo packit -m inject -t UDP -i ens4 -s 10.148.0.6 -d 34.87.79.31 -S 10000 -D 10000 -p '0x 17 00 00 00 00 00 00 00 12 34 56 78' -c 1000000 -w 0.001

[result]
Injected: 1000000  Packets/Sec: 10309.27  Bytes/Sec: 412371.13  Errors: 0

Gere tráfego de alto volume com um comando de ajuste de posição não correspondente.

sudo packit -m inject -t UDP -i ens4 -s 10.148.0.6 -d 34.87.79.31 -S 10000 -D 10000 -p '0x 11 00 00 00 00 00 00 00 12 34 56 78' -c 1000000 -w 0.001

[result]
Injected: 1000000  Packets/Sec: 10309.27  Bytes/Sec: 412371.13  Errors: 0

A telemetria é filtrada por "policy_name" e agrupada por "blocked". A linha azul indica o tráfego permitido pelas regras da política. A linha verde indica o tráfego bloqueado por regras de política.

b11ba15d87f99775.png

12. Etapas de limpeza

Excluir componentes do laboratório de um único shell na nuvem no terminal

gcloud compute instances delete targetvm --zone=asia-southeast1-b

gcloud compute firewall-rules delete ca4nlb-udp10000

gcloud compute firewall-rules delete ca4nlb-iap-prod

gcloud compute networks subnets delete ca4nlb-asia-southeast1 --region=asia-southeast1

gcloud compute networks delete ca4nlb

gcloud alpha compute security-policies delete customnetworkedge --region=asia-southeast1

gcloud alpha compute network-edge-security-services delete caedgepolicy --region=asia-southeast1

gcloud alpha compute security-policies delete ca_advanced_ddos --region=asia-southeast1

gcloud compute instances delete test01 --zone=asia-southeast1-b

gcloud compute firewall-rules delete test-iap-prod

gcloud compute networks subnets delete test-asia-southeast1 --region=asia-southeast1

gcloud compute networks delete test

13. Parabéns!

Parabéns por concluir o codelab.

O que vimos

  • Políticas de segurança do Cloud Armor com regras definidas pelo cliente