Cloud Armor für NLB/VM mit benutzerdefinierten Regeln

1. Einführung

Cloud Armor-Sicherheitsrichtlinien werden verwendet, um nutzerdefinierte Regeln zum Filtern von Traffic am Rand des Google-Netzwerks zu konfigurieren, vor Ihrer Infrastruktur. Mit Network Edge-Sicherheitsrichtlinien können Sie Traffic schützen und zulassen oder blockieren, der auf die folgenden Endpunkttypen ausgerichtet ist: Network Load Balancer, Protokollweiterleitung und VMs mit öffentlichen IP-Adressen.

7bc9d3ed0c03b54f.png

In diesem Codelab wird gezeigt, wie Sie Cloud Armor-Sicherheitsrichtlinien mit benutzerdefinierten Regeln konfigurieren, um DDoS-Angriffe zu verhindern.

f0a40260147e71b1.png

Abbildung 1. Cloud Armor für VMs mit öffentlicher IP-Adresse.

Lerninhalte

  • Cloud Armor-Sicherheitsrichtlinien mit benutzerdefinierten Regeln konfigurieren
  • UDP-Offset-Konfigurationen und ‑Tests.

Voraussetzungen

  • Kenntnisse von TCP/IP
  • Kenntnisse der Unix-/Linux-Befehlszeile

2. Hinweis

Prüfen Sie in Cloud Shell, ob Ihre Projekt-ID eingerichtet ist.

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

3. Ziel-VPC-Netzwerk erstellen

Im folgenden Abschnitt richten wir VPC-Netzwerke und zugehörige Netzwerkkonfigurationen ein. Die Cloud Armor-Sicherheitsrichtlinie für den Netzwerk-Edge ist regional. Wir richten alle zugehörigen Ressourcen in der Region „asia-southeast1“ ein.

VPC-Netzwerk

Über Cloud Shell

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

Subnetz erstellen

Über Cloud Shell

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

Firewallregeln erstellen

In diesem Abschnitt fügen wir eine Firewallregel hinzu, um den erwarteten UDP-Traffic an Port 10000 zuzulassen.

Erstellen Sie in Cloud Shell eine Firewallregel, um den UDP-Port 10000 für die folgenden Tests zu öffnen.

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

Erstellen Sie in Cloud Shell eine Firewallregel, damit IAP eine Verbindung zu Ihren VM-Instanzen herstellen kann.

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

4. Ziel-VM-Instanzen erstellen

Erstellen Sie eine Ziel-VM zum Testen von Sicherheitsrichtlinien. Diese VM sollte eine öffentliche IP-Adresse und einen offenen UDP-Port 10000 haben.

Instanz „targetvm“ über Cloud Shell erstellen

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. Erweiterten DDoS-Schutz für Netzwerke konfigurieren

Über 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. Network Edge-Sicherheitsrichtlinie mit Standardregeln erstellen

Network Edge-Sicherheitsrichtlinie erstellen

Über Cloud Shell

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

Standardregel ändern

Über Cloud Shell

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

7. Sicherheitsrichtlinie für Network Edge mit benutzerkonfigurierten Regeln erstellen

Vom Nutzer vordefinierter UDP-Offset, der in der Cloud Armor-Richtlinie konfiguriert ist. Pakete mit diesen „Offset-Werten“ bestehen die Richtlinienprüfung und werden an die Backend-VM gesendet. Im folgenden Beispiel definieren wir zwei „offset“-Parameter mit unterschiedlichen Werten.

Der erste Wert befindet sich direkt nach dem UDP-Header und entspricht genau 2 Byte 0x1700.

Der zweite Wert ist ein Offset von 8 Byte des UDP-Headers und entspricht genau 4 Byte 0x12345678.

Der oben vordefinierte Wert wird in eine Bitansicht des UDP-Pakets übersetzt.

cbfdaeb93292e07b.png

Über 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. Sicherheitsrichtlinie an Ziel-VM anhängen

Hängen Sie in Cloud Shell die Sicherheitsrichtlinie an die geschützte VM an.

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

Wenn Sie in Cloud Shell die Ziel-VM beschreiben, sehen Sie, dass die securityPolicy angehängt ist. Notieren Sie sich die öffentliche IP-Adresse für die folgenden Tests.

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

Trennen Sie in Cloud Shell die Sicherheitsrichtlinie von der geschützten VM.

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

9. Testressourcen vorbereiten

Test-VPC-Netzwerk erstellen

Über Cloud Shell

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

Test-Subnetz erstellen

Über Cloud Shell

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

Firewall erstellen

Erstellen Sie in Cloud Shell eine Firewallregel, damit IAP eine Verbindung zu Ihren VM-Instanzen herstellen kann.

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

Test-VM erstellen

Über 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. Bestätigung

Melden Sie sich in der Console der Test-VM an und installieren Sie den Paketgenerator packit.

sudo apt install packit

Verwenden Sie packit, um UDP-Pakete zu generieren, die dem UDP-Offset-Design entsprechen. Wir simulieren ein Paket (-t udp) von der Quell-IP-Adresse der Schnittstelle (-s ens4) (-s 10.0.1.2) mit Quellports (-S 10000) an die Ziel-IP-Adresse der targetVM (-d 35.240.148.100) mit Zielports (-D 10000). Der Paketinhalt stimmt mit den Werten überein (-p „0x 17 00 00 00 00 00 00 00 12 34 56 78“). Wir senden (-c 4) Pakete.

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

Führen Sie auf der Ziel-VM „tcpdump“ aus, um das UDP-Paket zu erfassen.

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

Wenn wir die Traffic-Muster in der Test-VM ändern, können wir keine Pakete in der Ziel-VM erfassen.

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

Öffnen Sie Cloud Metric und verwenden Sie die folgende MQL, um Telemetriedaten der NetworkSecurityPolicy abzufragen.

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

Mit dem Befehl „match offset“ lässt sich ein hohes Traffic-Volumen generieren.

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

Hohes Traffic-Volumen mit einem Befehl für den Abgleichs-Offset generieren

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

Die Telemetrie wird nach „policy_name“ gefiltert und nach „blocked“ gruppiert. Die blaue Linie zeigt den Traffic an, der gemäß den Richtlinienregeln zulässig ist. Die grüne Linie steht für Traffic, der durch Richtlinienregeln blockiert wurde.

b11ba15d87f99775.png

12. Bereinigungsschritte

Lab-Komponenten über eine einzelne Cloud Shell im Terminal löschen

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. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs.

Behandelte Themen

  • Cloud Armor-Sicherheitsrichtlinien mit kundendefinierten Regeln