Codelab: Cloud Armor- und TCP/SSL-Proxy-Load-Balancer – Ratenbegrenzung und IP-Sperrliste

1. Einführung

Das Load-Balancing von Google Cloud wird an den weltweiten Edges des Google-Netzwerks in seinen Points of Presence (POPs) bereitgestellt. Der an einen TCP-Proxy-Load-Balancer geleitete Nutzertraffic gelangt in den POP, der dem Nutzer am nächsten liegt, und wird dann über das globale Google-Netzwerk auf das nächstgelegene Backend mit ausreichender Kapazität verteilt.

Cloud Armor ist das System von Google zur Erkennung von DDoS-Angriffen (Distributed Denial of Service) und Web Application Firewall (WAF). Cloud Armor ist eng mit dem TCP-Proxy-Load-Balancer von Google Cloud verknüpft und ermöglicht es Ihnen, eingehenden Traffic auf unerwünschte Anfragen zu prüfen. Mit der Ratenbegrenzungsfunktion dieses Dienstes können Sie den Traffic zu Backend-Ressourcen basierend auf dem Anfragevolumen begrenzen und verhindern, dass unerwünschter Traffic Ressourcen in Ihrem VPC-Netzwerk (Virtual Private Cloud) verbraucht.

Mit den TCP/SSL-Proxy-Load-Balancern von Google Cloud können Sie TCP/ SSL-Traffic zwischen Ihren Backend-Diensten weiterleiten.

In diesem Codelab erstellen Sie einen TCP/SSL-Proxy-Load-Balancer mit einem Backend-Dienst und verwenden Cloud Armor, um den Zugriff auf den Load-Balancer auf eine bestimmte Gruppe von Nutzerclients zu beschränken.

be33dadf836374bb.png

Lerninhalte

  • TCP/SSL-Proxy-Load-Balancer erstellen
  • Cloud Armor-Sicherheitsrichtlinie erstellen
  • Regel für IP-Sperrliste für TCP/SSL-Proxy-Load-Balancer in Cloud Armor erstellen
  • Ratenbegrenzungsregel für TCP-Proxy-Load-Balancer in Cloud Armor erstellen
  • Sicherheitsrichtlinie zu einem Backend-Dienst für TCP/SSL-Load-Balancing hinzufügen

Voraussetzungen

  • Grundkenntnisse zu Google Compute Engine ( Codelab)
  • Grundkenntnisse in den Bereichen Netzwerk und TCP/IP
  • Grundkenntnisse zu Unix/Linux-Befehlszeilen
  • Es ist hilfreich, wenn Sie das Codelab Netzwerke in Google Cloud absolviert haben.

2. Voraussetzungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

Hinweis: Wir empfehlen Ihnen, sich die URL console.cloud.google.com zu merken Damit können Sie mühelos auf die Cloud Console zugreifen.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. Er wird später in diesem Codelab als PROJECT_ID bezeichnet.

Hinweis: Wenn Sie ein Gmail-Konto verwenden, können Sie den Standardspeicherort auf „Keine Organisation“ festgelegt lassen. Wenn Sie ein Google Workspace-Konto verwenden, wählen Sie einen Speicherort aus, der für Ihre Organisation sinnvoll ist.

  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Google Cloud-Ressourcen verwenden zu können.

Die Durchführung dieses Codelabs sollte wenig oder gar nichts kosten. Folgen Sie den Anweisungen im Abschnitt „Bereinigen“, in dem Sie erfahren, wie Sie Ressourcen herunterfahren, damit Ihnen nach Abschluss dieses Codelabs keine Kosten entstehen. Neue Google Cloud-Nutzer können das kostenlose Testprogramm im Wert von 300$ nutzen.

Cloud Shell starten

Sie können Google Cloud von Ihrem Laptop aus per Fernzugriff nutzen. In diesem Codelab verwenden Sie jedoch Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Klicken Sie in der GCP Console oben rechts in der Symbolleiste auf das Cloud Shell-Symbol:

bce75f34b2c53987.png

Die Bereitstellung und Verbindung mit der Umgebung sollte nur wenige Augenblicke dauern. Wenn der Vorgang abgeschlossen ist, sollte Folgendes angezeigt werden:

f6ef2b5f13479f3a.png

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Für alle Aufgaben in diesem Codelab benötigen Sie lediglich einen Browser.

Hinweis

Prüfen Sie in Cloud Shell, ob Ihre Projekt-ID eingerichtet ist.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
PROJECT_ID=[YOUR-PROJECT-NAME]
echo $PROJECT_ID

APIs aktivieren

Alle erforderlichen Dienste aktivieren

gcloud services enable compute.googleapis.com
gcloud services enable logging.googleapis.com        
gcloud services enable monitoring.googleapis.com

3. Backend-Dienste erstellen

Erstellen Sie zwei Instanzen: Erstellen Sie instance1-b1 in der Zone us-central1-b.

gcloud compute instances create vm-1-b1 \
    --image-family debian-9 \
    --image-project debian-cloud \
    --tags tcp-lb \
    --zone us-central1-b \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>This is VM1-b1 in central1-b</h1></body></html>' | tee /var/www/html/index.html
      EOF"

Erstellen Sie instance1-b2 in der Zone us-central1-b.

gcloud compute instances create vm-1-b2 \
    --image-family debian-9 \
    --image-project debian-cloud \
    --tags tcp-lb \
    --zone us-central1-b \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>This is VM1-b2 in central1-b</h1></body></html>' | tee /var/www/html/index.html
      EOF"

Erstellen Sie eine Instanzgruppe vm-ig1.

gcloud compute instance-groups unmanaged create vm-ig1  --zone us-central1-b

Erstellen Sie einen benannten Port für die Instanzgruppe. In diesem Codelab verwenden wir Port 110.

    gcloud compute instance-groups set-named-ports vm-ig1 \
--named-ports tcp 110:110 --zone us-central1-b

Fügen Sie die Instanzen der Instanzgruppe hinzu.

gcloud compute instance-groups unmanaged add-instances vm-ig1 \
   --instances vm-1-b1,vm-1-b2 --zone us-central1-b

4. Load-Balancer konfigurieren

Als Nächstes erstellen wir eine Systemdiagnose.

gcloud compute health-checks create tcp my-tcp-health-check --port 110

Backend-Dienst erstellen

gcloud compute backend-services create my-tcp-lb  --global-health-checks --global \
--protocol TCP --health-checks my-tcp-health-check --timeout 5m --port-name tcp110

Instanzgruppe dem Backend-Dienst hinzufügen

gcloud compute backend-services add-backend my-tcp-lb --global --instance-group \ vm-ig1 --instance-group-zone us-central1-b --balancing-mode UTILIZATION \ --max-utilization 0.8

Ziel-TCP-Proxy konfigurieren

gcloud compute target-tcp-proxies create my-tcp-lb-target-proxy --backend-service \ my-tcp-lb --proxy-header NONE

Globale statische IPv4-Adressen reservieren

Sie verwenden diese IP-Adresse, um auf Ihren Dienst mit Load-Balancing zuzugreifen.

gcloud compute addresses create tcp-lb-static-ipv4  --ip-version=IPV4   --global

Globale Weiterleitungsregeln für die LB-IP-Adresse konfigurieren

gcloud compute forwarding-rules create my-tcp-lb-ipv4-forwarding-rule \
    --global --target-tcp-proxy my-tcp-lb-target-proxy --address LB_STATIC_IPV4 \ --ports 110

5. Firewallregel für den TCP-Proxy-Load-Balancer erstellen

gcloud compute firewall-rules create allow-tcplb-and-health \
   --source-ranges 130.211.0.0/22,35.191.0.0/16 \
   --target-tags tcp-lb \
   --allow tcp:110

Testen Sie den Load-Balancer nach der Erstellung mit dem folgenden Befehl:

Curl LB_IP:110

Erstellen Sie als Nächstes VMs, um den verweigerten Zugriff auf den Load-Balancer zu prüfen.

Erstellen Sie zwei Instanzen mit jeweils einer öffentlichen IP-Adresse und den Namen test-server1 und test-server2.

6. Sicherheitsrichtlinie in Cloud Armor erstellen

In diesem Abschnitt erstellen Sie eine Backend-Sicherheitsrichtlinie und zwei Regeln in der Richtlinie in Cloud Armor.

Die erste Regel verhindert, dass eine begrenzte Anzahl von IPs auf den TCP-Load-Balancer zugreifen kann, indem eine Sicherheitsrichtlinie festgelegt wird, die bestimmte IPs ablehnt. Die zweite Regel führt eine Ratenbegrenzung durch.

  1. Erstellen Sie in Cloud Shell(Anleitungen zur Verwendung von Cloud Shell finden Sie unter „Cloud Shell starten“ im Abschnitt „Einrichtung und Voraussetzungen“) eine Sicherheitsrichtlinie für den Backend-Dienst mit dem Namen „rate-limit-and-deny-tcp“:
gcloud compute security-policies create rate-limit-and-deny-tcp \
    --description "policy for tcp proxy rate limiting and IP deny"

Regeln zur Sicherheitsrichtlinie hinzufügen

Fügen Sie als Nächstes der Cloud Armor-Richtlinie „rate-limit-and-deny-tcp“ eine Regel für die Sperrliste hinzu.

gcloud compute security-policies rules create 1000 --action deny --security-policy \ rate-limit-and-deny-tcp --description "deny test-server1" --src-ip-ranges \ "enter-test-server-1ip-here"

Fügen Sie der Cloud Armor-Sicherheitsrichtlinie „rate-limit-and-deny-tcp“ eine Ratenbegrenzungsregel hinzu.

gcloud compute security-policies rules create 3000   \ --security-policy=rate-limit-and-deny-tcp  \       
--expression="true"  --action=rate-based-ban  --rate-limit-threshold-count=5  \          
--rate-limit-threshold-interval-sec=60  --ban-duration-sec=300      \         
--conform-action=allow  --exceed-action=deny-404  --enforce-on-key=IP

Richtlinie an den Backend-Dienst des TCP-Proxys anhängen:

Führen Sie den folgenden Befehl aus, um zu prüfen, ob die Sicherheitsrichtlinie an den Backend-Dienst des TCP-Proxys angehängt ist.

gcloud compute backend-services update my-tcp-lb --security-policy \ rate-limit-and-deny-tcp

Logging für den TCP-Proxy-Load-Balancer aktivieren

gcloud beta compute backend-services update my-tcp-lb \ 
--enable-logging --logging-sample-rate=1

7. Regel für die Sperrliste prüfen

Prüfen Sie die Regel für die Sperrliste, indem Sie sich auf dem Testserver anmelden, dessen IP in der Regel für die Sperrliste angegeben wurde, und führen Sie den folgenden Befehl aus:

Curl LB_IP:110

Bei sofortigen Anfragen erhalten Sie möglicherweise eine Antwort vom Load-Balancer. Warten Sie jedoch, bis die Curl-Anfrage abgelehnt oder verworfen wird, und sehen Sie sich dann die Logs in Cloud Logging an, um den Logeintrag für die ausgelöste Regel für die IP-Sperrliste zu prüfen.

Wählen Sie in Cloud Logging unter „Ressourcen“ den Ressourcentyp „tcp_ssl_proxy_rule“ aus und legen Sie das Backend-Ziel als „my-tcp-lb“ fest.

Mit den für die Filterung definierten Ressourcen können wir prüfen, ob die Regel für die IP-Sperrliste wirksam ist. Dies ist anhand des WERTS für die PRIORITÄT von 1000 im Logeintrag und der konfigurierten Aktion "DENY" zu erkennen, da beide durch die Regel für die Sperrliste und die abgelehnte IP-Adresse wie unten dargestellt angewiesen wurden.

db9b835e0360dcaf.png

8. Ratenbegrenzungsregel prüfen

Prüfen Sie, ob die Ratenbegrenzungsregel wirksam ist, indem Sie viele Anfragen in kurzer Zeit senden, die den definierten Schwellenwert (5 Anfragen pro Minute) überschreiten.

Klicken Sie anschließend im Cloud Armor-Dienst auf „Logs ansehen“. Dadurch gelangen Sie zu Cloud Logging, wo Sie die Logs nach dem Load-Balancer filtern können, um die Cloud Armor-Logs zu sehen, sobald sie eingehen.

Ein Eintrag zur Ratenbegrenzung sollte wie im Screenshot unten aussehen. Wir können prüfen, ob die Ratenbegrenzungsregel wirksam ist. Dies ist anhand des WERTS für die PRIORITÄT von 3000 im Logeintrag und der konfigurierten Aktion "RATE BASED BAN" zu erkennen, da beide durch die Ratenbegrenzungsregel angewiesen wurden.

37c76e5d7532623.png

9. Umgebung bereinigen

Bereinigen Sie die erstellte Infrastruktur, um Kosten für nicht verwendete Infrastruktur zu vermeiden.

Am schnellsten geht das, wenn Sie das gesamte Projekt in der GCP löschen, um sicherzustellen, dass keine nicht verwalteten Ressourcen zurückbleiben.Löschen Sie jedoch die einzelnen Ressourcen mit den folgenden Befehlen:

Der TCP-Proxy-Load-Balancer

gcloud compute target-tcp-proxies delete my-tcp-lb

Die Instanzgruppe

gcloud compute instance-groups unmanaged delete vm-ig1

Die beiden erstellten VM-Testinstanzen

gcloud compute instances delete Instance_name --zone=instance_zone

Der Backend-Dienst

gcloud compute backend-services delete BACKEND_SERVICE_NAME

Die Cloud Armor-Regeln in der Richtlinie

gcloud compute security-policies rules delete 1000  \ --security-policy=rate-limit-and-deny-tcp && 
gcloud compute security-policies rules delete 3000  \ --security-policy=rate-limit-and-deny-tcp

Die Cloud Armor-Sicherheitsrichtlinie

gcloud compute security-policies delete rate-limit-and-deny-tcp