Cloud Armor dla systemu równoważenia obciążenia/maszyny wirtualnej z regułami zdefiniowanymi przez użytkownika

1. Wprowadzenie

Zasady zabezpieczeń Cloud Armor służą do konfigurowania reguł zdefiniowanych przez użytkownika w celu filtrowania ruchu na brzegu sieci Google, w stosunku do Twojej infrastruktury. Zasady zabezpieczeń brzegu sieci mogą służyć do ochrony i zezwalania na ruch kierowany na te typy punktów końcowych, a także do zezwalania na nie lub do blokowania ruchu kierowanego na te typy punktów końcowych: sieciowy system równoważenia obciążenia, przekierowanie protokołu i maszyny wirtualne z publicznymi adresami IP.

7bc9d3ed0c03b54f.png

W tym module dotyczącym kodu pokażemy, jak skonfigurować zasady zabezpieczeń Cloud Armor za pomocą reguł zdefiniowanych przez użytkownika, aby zapobiegać atakom DDoS.

f0a40260147e71b1.png

Rysunek 1. Cloud Armor do maszyn wirtualnych z publiczną ochroną IP.

Czego się nauczysz

  • Zasady zabezpieczeń Cloud Armor z konfiguracją reguł definiowanych przez użytkownika
  • Konfiguracje i testowanie przesunięcia UDP.

Czego potrzebujesz

  • Wiedza na temat protokołów TCP/IP
  • znajomości wiersza poleceń systemu Unix lub Linux;

2. Zanim zaczniesz

Sprawdź w Cloud Shell, czy identyfikator projektu jest skonfigurowany

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

3. Utwórz docelową sieć VPC

W następnej sekcji skonfigurujemy sieci VPC i powiązane z nimi konfiguracje sieci. Zasada zabezpieczeń brzegu sieci Cloud Armor jest oparta na regionach, wszystkie powiązane zasoby zostały skonfigurowane w regionie asia-southeast1.

Sieć VPC

Z Cloud Shell

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

Utwórz podsieć

Z Cloud Shell

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

Utwórz reguły zapory sieciowej.

W tej sekcji dodamy regułę zapory sieciowej, która przepuszcza oczekiwany ruch UDP na port 10 000.

W Cloud Shell utwórz regułę zapory sieciowej, aby otworzyć port UDP 10000 na potrzeby poniższych testów.

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

Utwórz w Cloud Shell regułę zapory sieciowej, która pozwoli IAP na łączenie się z instancjami maszyn wirtualnych.

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

4. Tworzenie docelowych instancji maszyn wirtualnych

Utwórz docelową maszynę wirtualną do testowania zasad zabezpieczeń. Ta maszyna wirtualna powinna mieć publiczny adres IP i otwarty port UDP 10000.

Utwórz docelową maszynę wirtualną w Cloud Shell

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. Konfigurowanie zaawansowanej ochrony przed atakami typu DDoS w sieci

Z 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. Tworzenie zasad zabezpieczeń brzegu sieci z regułami domyślnymi

Tworzenie zasady zabezpieczeń brzegu sieci

Z Cloud Shell

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

Modyfikowanie reguły domyślnej

Z Cloud Shell

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

7. Tworzenie zasad zabezpieczeń brzegu sieci z używanymi regułami

Użytkownik wstępnie zdefiniował przesunięcie UDP i został skonfigurowany w zasadzie Cloud Armor. Pakiet z tymi „wartościami przesunięcia” przejdzie weryfikację zgodności z zasadami i wyśle ją do maszyny wirtualnej backendu. W poniższym przykładzie zdefiniujemy dwa „przesunięcie” o różnych wartościach.

Pierwsza wartość znajduje się tuż po nagłówku UDP – dokładnie pasuje do 2 bajtów 0x1700

Druga wartość to przesunięcie o 8 bajtów nagłówka UDP – dokładnie pasuje do 4 bajtów 0x12345678

Powyżej wstępnie zdefiniowanej wartości zostanie wyświetlony widok bitów pakietu UDP.

cbfdaeb93292e07b.png

Z 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. Dołącz zasadę zabezpieczeń do docelowej maszyny wirtualnej

Z poziomu Cloud Shell dołączanie zasad zabezpieczeń do chronionej maszyny wirtualnej.

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

W Cloud Shell opisz docelową maszynę wirtualną. Wyświetli się zasada SecurityPolicy. Zarejestruj publiczny adres IP na potrzeby kolejnych testów.

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

Odłączenie zasady zabezpieczeń od chronionej maszyny wirtualnej w Cloud Shell.

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

9. Przygotuj zasoby testowe.

Tworzenie testowej sieci VPC

Z Cloud Shell

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

Utwórz podsieć testową

Z Cloud Shell

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

Utwórz zaporę sieciową

Utwórz w Cloud Shell regułę zapory sieciowej, która pozwoli IAP na łączenie się z instancjami maszyn wirtualnych.

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

Tworzenie testowej maszyny wirtualnej

Z 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. Weryfikacja

Zaloguj się do testowej konsoli maszyny wirtualnej i zainstaluj generator pakietów packit.

sudo apt install packit

Zgodnie z projektem przesunięcia UDP użyj polecenia packit do wygenerowania pakietów UDP. Symulujemy pakiet (-t udp) z interfejsu (-s ens4) źródłowego adresu IP (-s 10.0.1.2) z portami źródłowymi (-S 10000) do docelowego adresu IP docelowej maszyny wirtualnej (-d 35.240.148.100) z portami docelowymi (-D 10000). Zawartość pakietu pasuje do wartości (-p ‘0x 17 00 00 00 00 00 00 00 12 34 56 78'). Będziemy wysyłać pakiety (-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

W docelowej maszynie wirtualnej uruchom tcpdump, aby przechwycić pakiet 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

Jeśli zmienimy wzorce ruchu w testowej maszynie wirtualnej, nie będziemy mogli przechwycić żadnych pakietów w docelowej maszynie wirtualnej.

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. Dane telemetryczne

Otwórz wskaźnik Cloud, użyj poniżej MQL, aby wysyłać zapytania dotyczące danych telemetrycznych 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

Generuj duży ruch, korzystając z polecenia przesunięcia dopasowania.

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

Generuj duży ruch za pomocą polecenia przesunięcia.

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

Dane telemetryczne są filtrowane według nazwy policy_name i grupowane według zablokowanych. Niebieska linia wskazuje ruch dozwolony przez reguły zasad. Zielona linia wskazuje ruch zablokowany przez reguły zasad.

b11ba15d87f99775.png

12. Procedura czyszczenia

Z pojedynczej powłoki Cloud Shell w terminalu usuń komponenty modułu

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. Gratulacje!

Gratulujemy ukończenia ćwiczeń z programowania.

Omówione zagadnienia

  • Zasady zabezpieczeń Cloud Armor z regułami zdefiniowanymi przez klienta