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 zdefiniowanych przez użytkownika reguł filtrowania ruchu na brzegu sieci Google, przed Twoją infrastrukturą. Zasady zabezpieczeń Network Edge mogą pomóc w ochronie i zezwalaniu na ruch kierowany do tych typów punktów końcowych lub blokowaniu go: sieciowy system równoważenia obciążenia, przekierowanie protokołu i maszyny wirtualne z publicznymi adresami IP.

7bc9d3ed0c03b54f.png

W tym module nauczysz się konfigurować zasady zabezpieczeń Cloud Armor z regułami zdefiniowanymi przez użytkownika, aby zapobiegać atakom typu DDoS.

f0a40260147e71b1.png

Rysunek 1. Cloud Armor do ochrony maszyn wirtualnych z publicznym adresem IP.

Czego się nauczysz

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

Czego potrzebujesz

  • Znajomość protokołu TCP/IP
  • Znajomość wiersza poleceń w systemach Unix/Linux

2. Zanim zaczniesz

W Cloud Shell sprawdź, czy identyfikator projektu jest skonfigurowany.

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

3. Tworzenie docelowej sieci VPC

W następnej sekcji skonfigurujemy sieci VPC i powiązane z nimi ustawienia sieciowe. Zasady zabezpieczeń brzegu sieci Cloud Armor są oparte na regionach. Wszystkie powiązane zasoby skonfigurowaliśmy 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 zezwoli na oczekiwany ruch UDP do portu 10000.

W Cloud Shell utwórz regułę zapory sieciowej, aby otworzyć port UDP 10000 na potrzeby testowania.

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

W Cloud Shell utwórz regułę zapory sieciowej, która zezwala 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.

Tworzenie instancji targetvm 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 zasady 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 zasady zabezpieczeń brzegu sieci z regułami skonfigurowanymi przez użytkownika

Wstępnie zdefiniowane przesunięcie UDP użytkownika skonfigurowane w zasadach Cloud Armor. Pakiet z tymi „wartościami przesunięcia” przejdzie weryfikację zasad i zostanie wysłany do maszyny wirtualnej backendu. W tym przykładzie zdefiniujemy 2 wartości „offset” o różnych wartościach.

Pierwsza wartość znajduje się tuż za nagłówkiem UDP i musi dokładnie odpowiadać 2 bajtowym 0x1700.

Druga wartość to przesunięcie 8 bajtów nagłówka UDP, które dokładnie odpowiada 4 bajtowym 0x12345678.

Powyższa zdefiniowana wartość zostanie przetłumaczona na 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łączanie zasad zabezpieczeń do docelowej maszyny wirtualnej

W Cloud Shell dołącz 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ą. Zobaczysz, że zasada zabezpieczeń jest do niej dołączona. Zapisz publiczny adres IP na potrzeby dalszych 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łącz zasadę 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.

Utwórz testową sieć VPC

Z Cloud Shell

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

Utwórz testową podsieć

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ą

W Cloud Shell utwórz regułę zapory sieciowej, która zezwala 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

Utwórz testową maszynę wirtualną

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ę w konsoli testowej maszyny wirtualnej i zainstaluj generator pakietów packit.

sudo apt install packit

Zgodnie z projektem przesunięcia UDP użyj narzędzia packit do wygenerowania pakietów UDP. Symulujemy pakiet (-t udp) z interfejsu (-s ens4) o źródłowym adresie IP (-s 10.0.1.2) i portach źródłowych (-S 10000) do docelowego adresu IP maszyny wirtualnej targetVM (-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'). Wyślemy (-c 4) pakiety.

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 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 na testowej maszynie wirtualnej, nie będziemy mogli przechwycić żadnych pakietów na 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 Cloud Metric i użyj poniższego zapytania MQL, aby wysłać zapytanie o dane telemetryczne 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

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

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

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 parametru policy_name i grupowane według parametru blocked. Niebieska linia wskazuje ruch dozwolony przez reguły zasad. Zielona linia oznacza ruch zablokowany przez reguły zasad.

b11ba15d87f99775.png

12. Procedura czyszczenia

Usuwanie komponentów laboratorium z jednej powłoki chmury w terminalu

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 ćwiczenia.

Omówione zagadnienia

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