TCP-Proxy-Codelab – Ratenbegrenzung und IP-Ablehnungsliste mit TCP-Proxy-Load-Balancer

1. Einführung

Das Load-Balancing von Google Cloud wird an den Edges des Google-Netzwerks in den weltweiten Points of Presence (POPs) von Google 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 Lab erstellen Sie einen TCP/SSL-Load-Balancer mit einem Backend-Dienst und beschränken den Zugriff auf den Load-Balancer auf eine bestimmte Gruppe von Nutzerclients.

be33dadf836374bb.png

Lerninhalte

  • TCP/SSL-Proxy-Load-Balancer erstellen
  • Cloud Armor-Sicherheitsrichtlinie erstellen
  • Regel für die IP-Sperrliste für den TCP/SSL-Proxy-Load-Balancer in Cloud Armor erstellen
  • Regel zur Ratenbegrenzung für den TCP-Proxy-Load-Balancer in Cloud Armor erstellen
  • Sicherheitsrichtlinie zu einem Backend-Dienst für das 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 die Tour zu Netzwerken in der GCP mit Netzwerke in Google Cloud abgeschlossen 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 der Anleitung im Abschnitt „Bereinigen“, in der 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

Während Sie Google Cloud von Ihrem Laptop aus per Fernzugriff nutzen können, wird in diesem Codelab Google Cloud Shell verwendet, 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, sollten Sie Folgendes sehen:

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

Aktivieren Sie alle erforderlichen Dienste.

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

Über diese IP-Adresse greifen Sie auf Ihren Dienst mit Load-Balancing zu.

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

Konfigurieren Sie globale Weiterleitungsregeln für die IP-Adresse des Load-Balancers.

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 erstellten Load-Balancer mit dem folgenden Befehl:

Curl LB_IP:110

Erstellen Sie als Nächstes VMs, um den Zugriff auf den Load-Balancer zu verweigern.

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 verweigert einer begrenzten Anzahl von IPs den Zugriff auf den TCP-Load-Balancer, indem eine Sicherheitsrichtlinie festgelegt wird, die bestimmte IPs verweigert. Die zweite Regel führt eine Ratenbegrenzung durch.

  1. Erstellen Sie in Cloud Shell(Anleitung 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 Regel zur Ratenbegrenzung 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

Hängen Sie die Richtlinie an den Backend-Dienst des TCP-Proxys an:

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 validieren

Validieren 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 den folgenden Befehl ausführen:

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 erkennen wir am Wert 1000 für PRIORITY im Logeintrag und daran, dass die konfigurierte Aktion "DENY" wirksam ist, da beide durch die Regel für die Sperrliste und die verweigerte IP-Adresse wie unten dargestellt angewiesen wurden.

db9b835e0360dcaf.png

8. Regel zur Ratenbegrenzung validieren

Prüfen Sie, ob die Regel zur Ratenbegrenzung 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 Regel zur Ratenbegrenzung wirksam ist. Dies erkennen wir am Wert 3000 für PRIORITY im Logeintrag und daran, dass die konfigurierte Aktion RATE BASED BAN wirksam ist, wie in der Regel zur Ratenbegrenzung angegeben.

37c76e5d7532623.png

9. Umgebung bereinigen

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

Am schnellsten geht das, wenn Sie das gesamte Projekt in der GCP löschen, um sicherzustellen, dass keine verwaisten 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