Atelier de programmation sur le proxy TCP : limitation du débit et liste de refus d'adresses IP avec un équilibreur de charge proxy TCP

1. Introduction

L'équilibrage de charge Google Cloud est déployé à la périphérie du réseau Google dans les points of presence (POP) de Google à travers le monde. Le trafic utilisateur dirigé vers un équilibreur de charge proxy TCP entre dans le POP le plus proche de l'utilisateur. Ensuite, l'équilibrage de la charge sur le réseau mondial de Google permet d'acheminer le trafic jusqu'au backend le plus proche disposant d'une capacité suffisante.

Cloud Armor est le système de détection du déni de service distribué et du pare-feu d'application Web (WAF) de Google. Cloud Armor est étroitement lié à l'équilibreur de charge proxy TCP de Google Cloud et vous permet d'interroger le trafic entrant pour les requêtes indésirables. La fonctionnalité de limitation du débit de ce service vous permet de restreindre le trafic vers les ressources backend en fonction du volume de requêtes et d'empêcher le trafic indésirable de consommer des ressources sur votre réseau cloud privé virtuel (VPC).

Les équilibreurs de charge proxy TCP/SSL de Google Cloud vous permettent d'acheminer par proxy le trafic de type TCP/ SSL entre vos services de backend.

Dans cet atelier, vous allez créer un équilibreur de charge TCP/SSL avec un service de backend et limiter l'accès à l'équilibreur de charge à un ensemble spécifique de clients utilisateurs.

be33dadf836374bb.png

Points abordés

  • Créer un équilibreur de charge proxy TCP/SSL
  • Créer une stratégie de sécurité Cloud Armor
  • Créer une règle de liste de refus d'adresses IP pour l'équilibreur de charge proxy TCP/SSL dans Cloud Armor
  • Créer une règle de limitation du débit pour l'équilibreur de charge proxy TCP dans Cloud Armor
  • Ajouter une règle de sécurité à un service de backend d'équilibrage de charge TCP/SSL

Prérequis

  • Connaissances de base sur Google Compute Engine ( codelab)
  • Connaissances de base sur la gestion de réseaux et les protocoles TCP/IP
  • Connaissances de base de la ligne de commande Unix/Linux
  • Il est utile d'avoir suivi la visite guidée de la mise en réseau dans GCP avec Networking in the Google Cloud.

2. Conditions requises

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à la console Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

Remarque: Vous pouvez facilement accéder à la console Cloud en mémorisant son URL, à savoir console.cloud.google.com.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Mémorisez l'ID du projet. Il s'agit d'un nom unique permettant de différencier chaque projet Google Cloud (le nom ci-dessus est déjà pris ; vous devez en trouver un autre). Il sera désigné par le nom "PROJECT_ID" dans la suite de cet atelier de programmation.

Remarque: Si vous utilisez un compte Gmail, vous pouvez conserver l'emplacement par défaut défini sur "Aucune organisation". Si vous utilisez un compte Google Workspace, choisissez un emplacement pertinent pour votre organisation.

  1. Vous devez ensuite activer la facturation dans Cloud Console pour pouvoir utiliser les ressources Google Cloud.

L'exécution de cet atelier de programmation est très peu coûteuse, voire gratuite. Veillez à suivre les instructions de la section "Nettoyer" qui indique comment désactiver les ressources afin d'éviter les frais une fois ce tutoriel terminé. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300$.

Démarrer Cloud Shell

Bien que Google Cloud puisse être utilisé à distance depuis votre ordinateur portable, nous allons nous servir de Google Cloud Shell pour cet atelier de programmation, un environnement de ligne de commande exécuté dans le cloud.

Depuis la console GCP, cliquez sur l'icône Cloud Shell de la barre d'outils située dans l'angle supérieur droit :

bce75f34b2c53987.png

Le provisionnement et la connexion à l'environnement prennent quelques instants seulement. Une fois l'opération terminée, le résultat devrait ressembler à ceci :

f6ef2b5f13479f3a.png

Cette machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez réaliser toutes les activités de cet atelier dans un simple navigateur.

Avant de commencer

Dans Cloud Shell, assurez-vous que l'ID de votre projet est configuré.

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

Activer les API

Activer tous les services nécessaires

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

3. Créer des services de backend

Créez deux instances comme suit : Créez l'instance 1-b1 dans la 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"

Créer l'instance 1-b2 dans la 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"

Créer un groupe d'instances vm-ig1

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

Définissez un port désigné pour le groupe d'instances. Pour cet atelier, nous utiliserons le port 110.

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

Ajouter les instances au groupe d'instances

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

4. Configurer l'équilibreur de charge

Nous allons maintenant créer une vérification d'état.

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

Créer un service de backend

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

Ajouter le groupe d'instances au service de backend

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

Configurer un proxy TCP cible

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

Réserver des adresses IPv4 statiques globales

Vous utiliserez cette adresse IP pour accéder à votre service à équilibrage de charge.

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

Configurez des règles de transfert globales pour l'adresse IP de l'équilibreur de charge.

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. Créer une règle de pare-feu pour l'équilibreur de charge proxy TCP

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

Une fois votre équilibreur de charge créé, testez-le à l'aide de la commande suivante :

Curl LB_IP:110

Créez ensuite des VM pour la validation du refus d'accès à l'équilibreur de charge.

Vous devez créer deux instances, chacune avec une adresse IP publique et nommée "test-server1" et "test-server2".

6. Créer une règle de sécurité dans Cloud Armor

Dans cette section, vous allez créer une stratégie de sécurité backend et deux règles dans la stratégie Cloud Armor.

La première règle interdira l'accès à l'équilibreur de charge TCP à un ensemble limité d'adresses IP en définissant une règle de sécurité pour refuser certaines adresses IP, et la seconde règle limitera le débit.

  1. Dans Cloud Shell(consultez la section "Démarrer Cloud Shell" sous "Configuration et conditions requises" pour savoir comment utiliser Cloud Shell), créez une stratégie de sécurité du service de backend appelée "rate-limit-and-deny-tcp" comme suit :
gcloud compute security-policies create rate-limit-and-deny-tcp \
    --description "policy for tcp proxy rate limiting and IP deny"

Ajouter des règles à la stratégie de sécurité

Ajoutez ensuite une règle de liste de refus à la stratégie Cloud Armor "rate-limit-and-deny-tcp".

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"

Ajouter une règle de limitation du débit à la stratégie de sécurité Cloud Armor "rate-limit-and-deny-tcp"

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

Associez la règle au service de backend du proxy TCP:

Exécutez la commande suivante pour vous assurer que la stratégie de sécurité est associée au service de backend du proxy TCP.

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

Activer la journalisation sur l'équilibreur de charge proxy TCP

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

7. Valider la règle de liste de refus

Pour valider la règle de liste de refus, connectez-vous au serveur de test dont l'adresse IP a été spécifiée dans la règle de liste de refus, puis exécutez la commande suivante :

Curl LB_IP:110

Les requêtes immédiates peuvent fournir une réponse de l'équilibreur de charge, mais attendre que la requête curl soit refusée ou supprimée, puis consulter les journaux dans Cloud Logging pour vérifier l'entrée de journal pour la règle de refus d'adresse IP en cours de déclenchement.

Accédez à Cloud Logging et, sous "Ressources", sélectionnez le type de ressource "tcp_ssl_proxy_rule". et définissez la cible backend sur "my-tcp-lb".

Avec les ressources définies pour le filtrage, nous pouvons vérifier que la règle de refus d'adresse IP est appliquée à partir de la valeur PRIORITY de 1 000 dans l'entrée de journal et que l'action configurée "DENY" est en cours, car les instructions de la règle de refus et de l'adresse IP refusée ont été données, comme indiqué ci-dessous.

db9b835e0360dcaf.png

8. Valider la règle de limitation du débit

Vérifiez que la règle de limite de débit est en vigueur en envoyant de nombreuses requêtes dans un court laps de temps qui dépasse le seuil défini (5 requêtes par minute).

Une fois cette opération effectuée, cliquez sur "View logs" (Afficher les journaux) dans le service Cloud Armor. Vous accédez alors à Cloud Logging, où vous pouvez filtrer les journaux en fonction de l'équilibreur de charge pour voir les journaux Cloud Armor à mesure qu'ils arrivent.

Une entrée de limitation du débit doit se présenter comme indiqué dans la capture d'écran ci-dessous. Nous pouvons vérifier que la règle de limitation du débit est bien appliquée à partir de la valeur PRIORITY de 3 000 dans l'entrée de journal et à partir de l'action configurée, c'est-à-dire que l'action "RATE BASED BAN" (BAN BASÉE SUR LE TAUX) est appliquée comme indiqué dans la règle de limitation du débit.

37c76e5d7532623.png

9. Nettoyage de l'environnement

Veillez à nettoyer l'infrastructure créée pour éviter les coûts d'exploitation de l'infrastructure inutilisée.

Le moyen le plus rapide consiste à supprimer l'intégralité du projet dans GCP pour vous assurer qu'il ne reste aucune ressource inexploitée sans surveillance.Cependant, supprimez les ressources individuelles à l'aide des commandes suivantes :

L'équilibreur de charge proxy TCP

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

Le groupe d'instances

gcloud compute instance-groups unmanaged delete vm-ig1

Les deux instances de VM de test créées

gcloud compute instances delete Instance_name --zone=instance_zone

Le service de backend

gcloud compute backend-services delete BACKEND_SERVICE_NAME

Les règles Cloud Armor de la stratégie

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

Cloud Armor : stratégie de sécurité

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