Cloud Armor para NLB/VM con reglas definidas por el usuario

1. Introducción

Las políticas de seguridad de Cloud Armor se usan para configurar reglas definidas por el usuario que filtran el tráfico en el perímetro de la red de Google, antes de que llegue a tu infraestructura. Las políticas de seguridad perimetral de red se pueden usar para proteger y permitir o bloquear el tráfico que se dirige a los siguientes tipos de extremos: balanceador de cargas de red, reenvío de protocolos y VMs con IPs públicas.

7bc9d3ed0c03b54f.png

En este lab de código, mostraremos cómo configurar políticas de seguridad de Cloud Armor con reglas definidas por el usuario para evitar ataques DDoS.

f0a40260147e71b1.png

Figura 1: Cloud Armor para la protección de VMs con IP pública.

Qué aprenderás

  • Políticas de seguridad de Cloud Armor con configuración de reglas definidas por el usuario
  • Configuración y pruebas de UDP Offset

Requisitos

  • Conocimiento de TCP/IP
  • Conocimiento de la línea de comandos de Unix/Linux

2. Antes de comenzar

En Cloud Shell, asegúrate de que tu ID del proyecto esté configurado.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
prodproject=YOUR-PROJECT-NAME
echo $prodproject

3. Crea la red de VPC de destino

En la siguiente sección, configuraremos redes de VPC y otras configuraciones de redes relacionadas. La política de seguridad perimetral de red de Cloud Armor se basa en la región, por lo que configuramos todos los recursos relacionados en la región asia-southeast1.

Red de VPC

Desde Cloud Shell

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

Crear subred

Desde Cloud Shell

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

Crear reglas de firewall

En esta sección, agregaremos una regla de firewall para permitir el tráfico UDP esperado al puerto 10000.

Desde Cloud Shell, crea una regla de firewall para abrir el puerto UDP 10000 para las siguientes pruebas.

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

Desde Cloud Shell, crea una regla de firewall para permitir que IAP se conecte a tus instancias 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. Crea instancias de VM de destino

Crea una VM de destino para probar las políticas de seguridad. Esta VM debe tener una dirección IP pública y el puerto UDP 10000 abierto.

Desde Cloud Shell, crea la instancia 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. Configura la protección avanzada contra DSD de red

Desde 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. Crea una política de seguridad perimetral de red con reglas predeterminadas

Crea una política de seguridad de Network Edge

Desde Cloud Shell

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

Modificar regla predeterminada

Desde Cloud Shell

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

7. Crea una política de seguridad perimetral de red con reglas configuradas y utilizadas

Es el desplazamiento UDP predefinido por el usuario y configurado en la política de Cloud Armor. El paquete con estos "valores de desplazamiento" pasará la verificación de políticas y se enviará a la VM de backend. En el siguiente ejemplo, definiremos dos "desplazamientos" con valores diferentes.

El primer valor está justo después del encabezado UDP y coincide exactamente con 2 bytes 0x1700.

El segundo valor es el desplazamiento de 8 bytes del encabezado UDP, que coincide exactamente con 4 bytes 0x12345678.

El valor predefinido anterior se traducirá en una vista de bits de paquetes UDP.

cbfdaeb93292e07b.png

Desde 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. Vincula la política de seguridad a la VM de destino

Desde Cloud Shell, adjunta la política de seguridad a la 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

Desde Cloud Shell, describe la VM de destino y verás que se adjuntó securityPolicy. Registra la IP pública para las pruebas posteriores.

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

En Cloud Shell, desconecta la política de seguridad de la VM protegida.

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

9. Prepara recursos de prueba.

Create Test VPC Network

Desde Cloud Shell

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

Create Test Subnet

Desde Cloud Shell

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

Crear firewall

Desde Cloud Shell, crea una regla de firewall para permitir que IAP se conecte a tus instancias de VM.

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

Create Test VM

Desde 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. Verificación

Accede a la consola de la VM de prueba y, luego, instala el generador de paquetes packit.

sudo apt install packit

Según el diseño de desplazamiento de UDP, usa packit para generar paquetes UDP. Simulamos un paquete (-t udp) desde la dirección IP de origen de la interfaz (-s ens4) (-s 10.0.1.2) con puertos de origen (-S 10000) a la dirección IP de destino de targetVM (-d 35.240.148.100) con puertos de destino (-D 10000). El contenido del paquete coincide con los valores (-p "0x 17 00 00 00 00 00 00 00 12 34 56 78"). Enviaremos paquetes (-c 4).

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

En la VM de destino, ejecuta tcpdump para capturar el paquete 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

Si cambiamos los patrones de tráfico en la VM de prueba, no podremos capturar ningún paquete en la 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. Telemetría

Abre Cloud Metric y usa el siguiente código MQL para consultar los datos de telemetría de NetworkSecurityPolicy.

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

Genera un gran volumen de tráfico con el comando de desplazamiento de coincidencias.

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

Genera un gran volumen de tráfico con un comando de desplazamiento no coincidente.

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

La telemetría se filtra por policy_name y se agrupa por bloqueado. La línea azul indica el tráfico permitido por las reglas de la política. La línea verde indica el tráfico bloqueado por las reglas de política.

b11ba15d87f99775.png

12. Pasos para la limpieza

Desde una sola shell de Cloud en la terminal, borra los componentes del lab.

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. ¡Felicitaciones!

Felicitaciones por completar el codelab.

Temas abordados

  • Políticas de seguridad de Cloud Armor con reglas definidas por el cliente