Codelab sul proxy TCP: limitazione di frequenza ed elenco di indirizzi IP negati con il bilanciatore del carico proxy TCP

1. Introduzione

Il bilanciamento del carico di Google Cloud viene implementato sul perimetro della rete Google, nei punti di presenza (POP) Google in tutto il mondo. Il traffico utente indirizzato a un bilanciatore del carico proxy TCP entra nella rete Google attraverso il POP più vicino all'utente. Quindi, il carico viene bilanciato sulla rete Google globale e indirizzato verso il backend più vicino con capacità disponibile sufficiente.

Cloud Armor è il sistema di rilevamento di attacchi DDoS e WAF (web application firewall) di Google. Cloud Armor è strettamente integrato con il bilanciatore del carico proxy TCP di Google Cloud e ti consente di eseguire query sul traffico in entrata per rilevare richieste indesiderate. La funzionalità di limitazione della frequenza di questo servizio ti consente di ridurre il traffico verso le risorse di backend in base al volume delle richieste e impedisce al traffico indesiderato di consumare risorse sulla tua rete Virtual Private Cloud (VPC).

I bilanciatori del carico proxy TCP/SSL di Google Cloud ti consentono di eseguire il proxy del traffico di tipo TCP/ SSL tra i tuoi servizi di backend.

In questo lab creerai un bilanciatore del carico TCP/SSL con un servizio di backend e limiterai l'accesso al bilanciatore del carico solo a un insieme specifico di client utente.

be33dadf836374bb.png

Obiettivi didattici

  • Come creare un bilanciatore del carico del proxy TCP/SSL
  • Come creare un criterio di sicurezza di Cloud Armor
  • Come creare una regola della lista di rifiuto IP per il bilanciatore del carico per proxy TCP/SSL in Cloud Armor
  • Come creare una regola di limitazione della frequenza per il bilanciatore del carico del proxy TCP in Cloud Armor
  • Come aggiungere il criterio di sicurezza a un servizio di backend di bilanciamento del carico TCP/SSL

Che cosa ti serve

  • Conoscenza di base di Google Compute Engine ( codelab)
  • Conoscenza di base del networking e di TCP/IP
  • Conoscenza di base della riga di comando Unix/Linux
  • È utile aver completato un tour del networking in Google Cloud con Networking in Google Cloud

2. Requisiti

Configurazione dell'ambiente a tuo ritmo

  1. Accedi alla console Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

Nota: puoi accedere facilmente alla console Cloud memorizzando il relativo URL, ovvero console.cloud.google.com.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Ricorda l'ID progetto, un nome univoco per tutti i progetti Google Cloud (il nome sopra indicato è già stato utilizzato e non funzionerà per te, scusa). Più avanti in questo codelab verrà indicato come PROJECT_ID.

Nota: se utilizzi un account Gmail, puoi lasciare l'impostazione predefinita su Nessuna organizzazione. Se utilizzi un account Google Workspace, scegli una località adatta alla tua organizzazione.

  1. Successivamente, dovrai abilitare la fatturazione in Cloud Console per poter utilizzare le risorse Google Cloud.

L'esecuzione di questo codelab non dovrebbe costare molto, se non del tutto. Assicurati di seguire le istruzioni nella sezione "Pulizia" che ti consigliano come arrestare le risorse per evitare addebiti al termine di questo tutorial. I nuovi utenti di Google Cloud possono partecipare al programma Prova senza costi di 300$.

Avvia Cloud Shell

Sebbene Google Cloud possa essere utilizzato da remoto dal tuo laptop, in questo codelab utilizzerai Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

Nella console Google Cloud, fai clic sull'icona di Cloud Shell nella barra degli strumenti in alto a destra:

bce75f34b2c53987.png

Dovrebbe richiedere solo pochi istanti per eseguire il provisioning e connettersi all'ambiente. Al termine, dovresti vedere qualcosa di simile a questo:

f6ef2b5f13479f3a.png

Questa macchina virtuale contiene tutti gli strumenti di sviluppo di cui avrai bisogno. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione di rete. Tutto il lavoro in questo lab può essere svolto semplicemente con un browser.

Prima di iniziare

In Cloud Shell, assicurati che l'ID progetto sia configurato

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

Abilita API

Attivare tutti i servizi necessari

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

3. Crea servizi di backend

Crea due istanze come segue: crea instance1-b1 nella zona 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"

Crea l'istanza 1-b2 nella zona 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"

Crea un gruppo di istanze vm-ig1

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

Crea una porta denominata per il gruppo di istanze. Per questo lab utilizzeremo la porta 110

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

Aggiungi le istanze al gruppo di istanze

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

4. Configurazione del bilanciatore del carico

A questo punto, creeremo un controllo di integrità.

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

Crea un servizio di 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

Aggiungi il gruppo di istanze al servizio di 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

Configurare un proxy TCP di destinazione

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

Prenotare indirizzi IPv4 statici globali

Utilizzerai questo indirizzo IP per raggiungere il servizio con bilanciamento del carico.

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

Configura le regole di forwarding globali per l'indirizzo IP del bilanciatore del carico.

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. Creazione di una regola firewall per il bilanciatore del carico del 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

Una volta creato il bilanciatore del carico, testalo con il seguente comando

Curl LB_IP:110

Successivamente, crea le VM per la convalida del rifiuto di accesso al bilanciatore del carico

Devi creare due istanze, ciascuna con un indirizzo IP pubblico e denominate test-server1 e test-server2

6. Creare un criterio di sicurezza in Cloud Armor

In questa sezione, creerai un criterio di sicurezza del backend e due regole nel criterio in Cloud Armor.

La prima regola impedirà a un insieme limitato di IP di accedere al bilanciatore del carico TCP impostando un criterio di sicurezza per negare determinati IP, mentre la seconda regola eseguirà la limitazione di frequenza.

  1. In Cloud Shell(fai riferimento a "Avvia Cloud Shell" in "Configurazione e requisiti" per istruzioni su come utilizzare Cloud Shell), crea un criterio di sicurezza del servizio di backend denominato rate-limit-and-deny-tcp come segue
gcloud compute security-policies create rate-limit-and-deny-tcp \
    --description "policy for tcp proxy rate limiting and IP deny"

Aggiungere regole ai criteri di sicurezza

Aggiungi una regola della lista di rifiuto al criterio 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"

Aggiungi una regola di limitazione della frequenza al criterio di sicurezza 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

Associa il criterio al servizio di backend del proxy TCP:

Esegui il seguente comando per assicurarti che il criterio di sicurezza sia associato al servizio di backend del proxy TCP.

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

Attivare il logging sul bilanciatore del carico del proxy TCP

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

7. Convalida la regola dell'elenco valori non consentiti

Convalida la regola dell'elenco di rifiuto accedendo al server di test il cui IP è stato specificato nella regola dell'elenco di rifiuto ed esegui il seguente comando

Curl LB_IP:110

Le richieste immediate potrebbero dare una risposta dal bilanciatore del carico, ma attendi che la richiesta curl venga rifiutata o ignorata e poi controlla i log in Cloud Logging per verificare la voce di log per l'attivazione della regola di rifiuto IP.

Vai a Cloud Logging e, in Risorse, seleziona il tipo di risorsa "tcp_ssl_proxy_rule" e imposta la destinazione di backend su "my-tcp-lb".

Con le risorse definite per il filtro, possiamo verificare che la regola di rifiuto IP sia in vigore dal valore PRIORITY 1000 nella voce del log e che l'azione configurata "DENY" sia in vigore poiché entrambe sono state indicate dalla regola di rifiuto e dall'IP rifiutato come mostrato di seguito

db9b835e0360dcaf.png

8. Convalida la regola di limitazione di frequenza

Verifica che la regola di limite di frequenza sia attiva inviando molte richieste in un breve periodo di tempo che superi la soglia definita (5 richieste al minuto).

Al termine, fai clic su Visualizza log nel servizio Cloud Armor per accedere a Cloud Logging, dove puoi filtrare i log in base al bilanciatore del carico per visualizzare i log di Cloud Armor man mano che arrivano.

Una voce di limitazione della frequenza dovrebbe essere come nello screenshot di seguito. Possiamo verificare che la regola di limite di frequenza sia in vigore dal valore PRIORITY pari a 3000 nella voce del log e dall'azione configurata, l'azione "RATE BASED BAN" è in vigore come indicato dalla regola di limitazione della frequenza.

37c76e5d7532623.png

9. Pulizia dell'ambiente

Assicurati di eliminare l'infrastruttura creata per evitare i costi di gestione dell'infrastruttura inutilizzata.

Il modo più rapido è eliminare l'intero progetto in Google Cloud per assicurarti che non ci siano risorse inutilizzate.Tuttavia, elimina le singole risorse con i seguenti comandi

Il bilanciatore del carico del proxy TCP

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

Il gruppo di istanze

gcloud compute instance-groups unmanaged delete vm-ig1

Le due istanze VM di test create

gcloud compute instances delete Instance_name --zone=instance_zone

Il servizio di backend

gcloud compute backend-services delete BACKEND_SERVICE_NAME

Le regole Cloud Armor all'interno del criterio

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

Il criterio di sicurezza di Cloud Armor

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