Limitação de taxa com o Cloud Armor

1. Introdução

O balanceamento de carga HTTP(S) do Google Cloud é implantado nos pontos de presença (POP) na borda da rede do Google no mundo inteiro. O tráfego de usuários direcionado para um balanceador de carga HTTP(S) entra no POP mais próximo e a carga dele é balanceada na rede global do Google, no primeiro back-end que tiver capacidade suficiente disponível.

O Cloud Armor é o sistema de detecção distribuído de negação de serviço e firewall de aplicativos da Web (WAF) do Google. O Cloud Armor está fortemente acoplado ao balanceador de carga HTTP do Google Cloud e permite interrogar o tráfego de entrada sobre solicitações indesejadas. O recurso de limitação de taxa desse serviço permite restringir o tráfego para recursos de back-end com base no volume de solicitações e evita que o tráfego indesejado consuma recursos na rede de nuvem privada virtual (VPC).

Neste laboratório, você vai definir as configurações de um balanceador de carga HTTP com back-ends globais, como mostra o diagrama abaixo. Depois você vai fazer um teste de estresse no balanceador de carga e adicionar uma política de limitação de taxa do Cloud Armor para limitar o tráfego que chega aos seus recursos de back-end.

2e1b99d22f4f32a.png

O que você vai aprender

  • Como configurar um balanceador de carga HTTP com verificações de integridade adequadas.
  • Como criar uma política de limitação de taxa do Cloud Armor.
  • Como validar se a política de limitação de taxa está bloqueando o tráfego ao executar um teste de estresse em uma VM.

O que é necessário

  • Rede básica e conhecimento de HTTP
  • Conhecimento básico de linha de comando do Unix/Linux

2. Configuração e requisitos

Configuração de ambiente autoguiada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. Ele é uma string de caracteres que não é usada pelas APIs do Google e pode ser atualizada a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser alterado após a definição. O Console do Cloud gera automaticamente uma string única, geralmente não importa o que seja. Na maioria dos codelabs, você precisará fazer referência ao ID do projeto, que geralmente é identificado como PROJECT_ID. Então, se você não gostar dele, gere outro ID aleatório ou crie um próprio e veja se ele está disponível. Em seguida, ele fica "congelado" depois que o projeto é criado.
  • Há um terceiro valor, um Número de projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, você precisará ativar o faturamento no Console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e não gerar cobranças além deste tutorial, siga as instruções de "limpeza" encontradas no final do codelab. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Inicie o Cloud Shell

Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.

No Console do GCP, clique no ícone do Cloud Shell na barra de ferramentas localizada no canto superior direito:

bce75f34b2c53987.png

O provisionamento e a conexão com o ambiente levarão apenas alguns instantes para serem concluídos: Quando o processamento for concluído, você verá algo como:

f6ef2b5f13479f3a.png

Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Todo o trabalho neste laboratório pode ser feito apenas com um navegador.

Antes de começar

No Cloud Shell, verifique se o ID do projeto está configurado

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

Ativar APIs

Ative todos os serviços necessários

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

3. Configurar regras de firewall para permitir o tráfego HTTP para back-ends

Configure regras de firewall para permitir o tráfego HTTP para os back-ends das verificações de integridade do Google Cloud e do balanceador de carga.

Vamos usar a rede VPC default criada no projeto. Crie uma regra de firewall para permitir o tráfego HTTP nos back-ends. As verificações de integridade determinam quais instâncias de um balanceador de carga podem receber novas conexões. No caso do balanceamento de carga HTTP, as sondagens de verificação de integridade para as instâncias com carga balanceada são provenientes de endereços nos intervalos 130.211.0.0/22 e 35.191.0.0/16. Suas regras de firewall da VPC precisam permitir essas conexões. Além disso, os balanceadores de carga se comunicam com o back-end no mesmo intervalo de IP.

  1. No console do Cloud, acesse Menu de navegação ( mainmenu.png) > Rede VPC > Firewall.

dbdf491e6d7863f3.png

  1. Observe as regras de firewall atuais: ICMP, interna, RDP e SSH.Cada projeto do Google Cloud começa com a rede padrão e essas regras de firewall.
  2. Clique em Criar regra de firewall.
  3. Defina os valores a seguir e mantenha os demais como padrão:

Propriedade

Valor (digite o valor ou selecione a opção conforme especificado)

Nome

default-allow-health-check

Rede

default

Destinos

Tags de destino especificadas

Tags de destino

http-server

Filtro de origem

Intervalos de IP

Intervalos de IP de origem

130.211.0.0/22, 35.191.0.0/16

Protocolos e portas

Em "Portas e protocolos especificados", marque tcp.

  1. Clique em Criar.

Como alternativa, se você estiver usando a linha de comando gcloud. Veja abaixo o comando:

gcloud compute firewall-rules create default-allow-health-check --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp --source-ranges=130.211.0.0/22,35.191.0.0/16 --target-tags=http-server

4. Configurar modelos de instâncias e criar grupos gerenciados de instâncias

Um grupo gerenciado de instâncias usa um modelo para criar um grupo de instâncias idênticas. Use modelos de instâncias para criar os back-ends do balanceador de carga HTTP.

Configure os modelos de instância

Um modelo é um recurso de API que pode ser usado para criar instâncias de VMs e grupos gerenciados de instâncias. Esses modelos definem o tipo de máquina, a imagem do disco de inicialização, as sub-redes, os rótulos e outras propriedades da instância. Crie um modelo de instância para us-east1 e outro para europe-west1.

  1. No console do Cloud, acesse Menu de navegação ( mainmenu.png) > Compute Engine > Modelos de instância e depois clique em Criar modelo de instância.
  2. Para Nome, digite us-east1-template.
  3. Em Série, selecione N1.
  4. Selecione Rede, Discos, Segurança, Gerenciamento , Locatário único.

b60e2a44c3e4d50e.png

  1. Acesse a seção Gerenciamento:

ee57f20ce55298fd.png

  1. Em Metadados, clique em Adicionar item e especifique o seguinte:

Key

Valor

startup-script-url

gs://cloud-training/gcpnet/httplb/startup.sh

  1. Clique em Rede.
  2. Defina os seguintes valores e mantenha os demais como padrão:

Propriedade

Valor (digite o valor ou selecione a opção conforme especificado)

Rede (sob interfaces de rede)

padrão

Sub-rede (sob interfaces de rede)

default (us-east1)

Tags de rede

http-server

  1. Clique em Criar.
  2. Aguarde a criação do modelo de instância.

Agora crie outro modelo de instância para europe-west1 copiando us-east1-template:

  1. Clique em us-east1-template e depois na opção Copiar na parte de cima.
  2. Em Nome, digite europe-west1-template.
  3. Selecione Rede, Discos, Segurança, Gerenciamento , Locatário único.
  4. Clique em Rede.
  5. Em Interfaces de rede,edite a interface padrão. Em Sub-rede, selecione padrão (europe-west1).
  6. Clique em Criar.

Crie os grupos de instâncias gerenciadas

Crie um grupo de instâncias gerenciadas em us-east1 e outro em europe-west1.

  1. Ainda em Compute Engine, clique em Grupos de instâncias no menu à esquerda.

72319de055de3942.png

  1. Clique em Criar grupo de instâncias. Selecione Novo grupo gerenciado de instâncias (sem estado).
  2. Defina os seguintes valores e mantenha o restante como padrão:

Propriedade

Valor (digite o valor ou selecione a opção conforme especificado)

Nome

us-east1-mig

Local

Várias zonas

Região

us-east1

Modelo de instância

us-east1-template

Escalonamento automático > Política de escalonamento automático > Clique no ícone de lápis > Tipo de métrica

Uso da CPU

Meta de uso da CPU

80. Clique em "Concluído".

Período de espera

45

Número mínimo de instâncias

1

Número máximo de instâncias

5

  1. Clique em Criar.

Agora repita o procedimento para criar um segundo grupo de instâncias para europe-west1-mig em europe-west1:

  1. Clique em Criar grupo de instâncias.
  2. Defina os seguintes valores e mantenha o restante como padrão:

Propriedade

Valor (digite o valor ou selecione a opção conforme especificado)

Nome

europe-west1-mig

Local

Várias zonas

Região

europe-west1

Modelo de instância

europe-west1-template

Escalonamento automático > Política de escalonamento automático > Clique no ícone de lápis > Tipo de métrica

Uso da CPU

Meta de uso da CPU

80. Clique em "Concluído".

Período de espera

45

Número mínimo de instâncias

1

Número máximo de instâncias

5

  1. Clique em Criar.

5. Configure o balanceador de carga HTTP

Configure o balanceador de carga HTTP para equilibrar o tráfego entre os dois back-ends (us-east1-mig em us-east1 e europe-west1-mig em europe-west1), como mostra o diagrama de rede:

2e1b99d22f4f32a.png

Inicie a configuração

  1. No console do Cloud, clique em Menu de navegação ( mainmenu.png) > Clique em Serviços de rede > Balanceamento de carga e, em seguida, clique em Criar balanceador de carga.
  2. Em Balanceamento de carga HTTP(S), clique em Iniciar configuração.

8197d8f041e8eafd.png

  1. Selecione Da Internet para minhas VMs, Balanceador de carga HTTP(S) clássico e clique em Continuar.
  2. Defina o Nome como http-lb.

Configure o back-end

Os serviços de back-end direcionam o tráfego de entrada para um ou mais back-ends anexados. Cada back-end é composto por um grupo de instâncias e metadados com capacidade adicional de serviço.

  1. Clique em Configuração de back-end.
  2. Em Serviços e buckets de back-end, clique em Criar um serviço de back-end.
  3. Defina os valores a seguir e mantenha os demais como padrão:

Propriedade

Valor (selecione a opção conforme especificado)

Nome

http-backend

Grupo de instâncias

us-east1-mig

Números de portas

80

Modo de balanceamento

Taxa

RPS máximo

50 (por instância)

Capacidade

100

  1. Clique em Concluído.
  2. Clique em Adicionar back-end.
  3. Defina os valores seguintes e mantenha os outros como padrão:

Propriedade

Valor (selecione a opção conforme especificado)

Grupo de instâncias

europe-west1-mig

Números de portas

80

Modo de balanceamento

Utilização

Utilização máxima de back-end

80

Capacidade

100

  1. Clique em Concluído.
  2. Em Verificação de integridade, selecione Criar verificação de integridade.

199239806577ceac.png

  1. Defina os seguintes valores e mantenha o restante como padrão:

Propriedade

Valor (selecione a opção conforme especificado)

Nome

http-health-check

Protocolo

TCP

Porta

80

20f7af9fce140475.png

  1. Clique em Salvar.
  2. Marque a caixa Ativar a geração de registros.
  3. Defina a Taxa de amostragem como 1:

dab4b15c13917786.png

  1. Clique em Criar para criar o serviço de back-end.

2db64614f855f239.png

Configure o front-end

As regras de host e caminho determinam como o tráfego será direcionado. Por exemplo, você pode direcionar o tráfego de vídeo para um back-end e o tráfego estático para outro back-end. No entanto, você não definirá as regras de host e caminho neste laboratório.

  1. Clique em Configuração de front-end.
  2. Especifique o seguinte e não altere os outros valores:

Propriedade

Valor (digite o valor ou selecione a opção conforme especificado)

Protocolo

HTTP

Versão IP

IPv4

Endereço IP

Temporário

Porta

80

  1. Clique em Concluído.
  2. Clique em Adicionar IP e porta do front-end.
  3. Especifique o seguinte e não altere os outros valores:

Propriedade

Valor (digite o valor ou selecione a opção conforme especificado)

Protocolo

HTTP

Versão do IP

IPv6

Endereço IP

Temporário

Porta

80

  1. Clique em Concluído.

Analise e crie o balanceador de carga HTTP

  1. Clique em Analisar e finalizar.

2c88715aa5f22800.png

  1. Confira os Serviços de back-end e Front-end.

b2fffef90be309f0.png

  1. Clique em Criar.
  2. Aguarde o balanceador de carga ser criado.
  3. Clique no nome do balanceador de carga (http-lb).
  4. Anote os endereços IPv4 e IPv6 do balanceador de carga para usá-los na próxima tarefa. Eles serão exibidos como [LB_IP_v4] e [LB_IP_v6], respectivamente.

6. Teste o balanceador de carga HTTP

Agora que você já criou o balanceador de carga HTTP para seus back-ends, verifique se o tráfego está sendo encaminhado ao serviço de back-end.

Acesse o balanceador de carga HTTP

Para testar o acesso do IPv4 ao balanceador de carga HTTP, abra uma nova guia no navegador e digite o endereço http://[LB_IP_v4]. Não se esqueça de substituir [LB_IP_v4] pelo endereço IPv4 do balanceador de carga.

Se você tiver um endereço IPv6 local, tente usar o endereço IPv6 do balanceador de carga HTTP navegando até http://[LB_IP_v6]. Não se esqueça de substituir [LB_IP_v6] pelo endereço IPv6 do balanceador de carga.

812d1fc75d9dfb3c.png

Faça o teste de estresse no balanceador de carga HTTP

Crie uma nova VM para simular uma carga do balanceador de carga HTTP usando o siege. Depois determine se o tráfego deverá ser balanceado nos dois back-ends quando a carga for alta.

  1. No console, acesse Menu de navegação ( mainmenu.png) > Compute Engine > Instâncias de VM.
  2. Clique em Criar instância.
  3. Defina os valores a seguir e mantenha os demais como padrão:

Propriedade

Valor (digite o valor ou selecione a opção conforme especificado)

Nome

siege-vm

Região

us-west1

Zona

us-west1-c

Série

N1

  1. Clique em Criar.
  2. Aguarde a instância siege-vm ser criada.
  3. Em siege-vm, clique em SSH para iniciar um terminal e se conectar.
  4. Execute este comando para instalar o siege:
sudo apt-get -y install siege
  1. Para armazenar o endereço IPv4 do balanceador de carga HTTP em uma variável de ambiente, execute o seguinte comando, substituindo [LB_IP_v4] pelo endereço IPv4:
export LB_IP=[LB_IP_v4]
  1. Para simular uma carga, execute este comando:
siege -c 250 http://$LB_IP

A resposta será parecida com esta (não copie o exemplo abaixo):

New configuration template added to /home/student/.siege
Run siege -C to view the current settings in that file
** SIEGE 4.0.4
** Preparing 250 concurrent users for battle.
The server is now under siege...
  1. No console do Cloud, clique no Menu de navegação ( mainmenu.png) e em Serviços de rede > Balanceamento de carga:
  2. Clique em http-lb.
  3. Clique na guia Monitoramento. Monitore o tráfego entre a América do Norte e os dois back-ends por dois a três minutos.

No começo, o tráfego precisa ser direcionado apenas para us-east1-mig, mas, conforme o RPS aumenta, ele também é direcionado para europe-west1-mig.

ead1e6d5c1f4cc4b.png

Isso demonstra que, por padrão, o tráfego é encaminhado para o back-end mais próximo, mas se a carga for muito alta, ele poderá ser distribuído entre os back-ends.

e5c6a657706c832c.png

  1. Volte para o terminal SSH da instância siege-vm.
  2. Pressione CTRL+C para interromper a execução do siege.

7. Criar política de limitação de taxa do Cloud Armor

Nesta seção, você vai usar o Cloud Armor para definir uma política de limitação de taxa para negar o acesso da siege-vm ao balanceador de carga HTTP.

  1. No Cloud Shell(consulte "Iniciar o Cloud Shell" em "Configuração e requisitos" para instruções sobre como usar o Cloud Shell), crie uma política de segurança na gcloud:
gcloud compute security-policies create rate-limit-siege \
    --description "policy for rate limiting"
  1. Em seguida, adicione uma regra de limitação de taxa:
gcloud beta compute security-policies rules create 100 \
    --security-policy=rate-limit-siege     \
    --expression="true" \
    --action=rate-based-ban                   \
    --rate-limit-threshold-count=50           \
    --rate-limit-threshold-interval-sec=120   \
    --ban-duration-sec=300           \
    --conform-action=allow           \
    --exceed-action=deny-404         \
    --enforce-on-key=IP
  1. Anexe a política de segurança ao http-backend do serviço de back-end:
gcloud compute backend-services update http-backend \
    --security-policy rate-limit-siege –-global
  1. No console, acesse Menu de navegação > Segurança de rede > Cloud Armor:
  2. Clique em rate-limit-siege. Sua política será parecida com esta:

8be87aa31c2ed74e.png

Verificar a política de segurança

  1. Volte para o terminal SSH de siege-vm.
  2. Execute um curl no IP do LB para verificar se você ainda pode se conectar a ele. Você deve receber uma resposta 200.
curl http://$LB_IP
  1. No terminal SSH de siege-vm, para simular uma carga, execute o seguinte comando:
siege -c 250 http://$LB_IP

A saída será semelhante a esta (não copie, este é o exemplo de saída):

** SIEGE 4.0.4
** Preparing 250 concurrent users for battle.
The server is now under siege...
  1. Analise os registros da política de segurança para saber se esse tráfego também está bloqueado.
  2. No console, acesse Menu de navegação > Segurança da rede > Cloud Armor.
  3. Clique em rate-limit-siege.
  4. Clique em Registros.

f8be7c01c3d7c8f5.png

  1. Clique em Conferir os registros da política.
  2. Na página de geração de registros, apague todo o texto na prévia da consulta.
  3. Selecione o recurso como Balanceador de carga HTTP do Cloud > http-lb-forwarding-rule > http-lb e clique em Adicionar. Como alternativa, abaixo está a consulta MQL(linguagem de consulta de monitoramento), que você pode copiar e colar no editor de consultas:
resource.type="http_load_balancer" resource.labels.forwarding_rule_name="http-lb-forwarding-rule" resource.labels.url_map_name="http-lb"
  1. Clique em Executar consulta.
  2. Expanda uma entrada de registro nos resultados da consulta.
  3. Expanda httpRequest. A origem da solicitação deve ser o endereço IP da instância siege-vm. Se não for, expanda outra entrada do registro.
  4. Expanda jsonPayload.
  5. Expandir aplicaSecurityPolicy.

151f575ba7b3bde9.png

Observe que configureAction está definido como RATE_BASED_BAN com o nome rate-limit-siege.

  1. Como verificação adicional, acesse o Menu de navegação ( mainmenu.png) e clique em Serviços de rede > Balanceamento de carga: Clique em http-lb. Clique na guia Monitoramento.

ab9a8a66573a5ebd.png

Confira o tráfego do siege nos gráficos. Além disso, o tráfego com limitação de taxa não chega ao back-end e é bloqueado pela política do Cloud Armor.

Parabéns! Você concluiu este laboratório sobre limitação de taxa com o Cloud Armor

©2020 Google LLC. Todos os direitos reservados. Google e o logotipo do Google são marcas registradas da Google LLC. Todos os outros nomes de empresas e produtos podem ser marcas registradas das empresas a que estão associados.

8. Limpeza do laboratório

  1. Acesse Segurança de rede >> Cloud Armor >> %POLICY NAME% e selecione "excluir"

eeafa7cafa11c4c7.png

  1. Navegue até Rede >> Serviços de rede >> "Balanceamento de carga". Selecione o balanceador de carga que você criou e clique em "Excluir".

3886458f25cfbd36.png

Selecione o serviço de back-end e a verificação de integridade como recursos adicionais a serem excluídos -

a0193e91b2f4cb6f.png

  1. Acesse o Menu de navegação ( mainmenu.png) > Compute Engine > Grupos de instâncias. Selecione os dois grupos gerenciados de instâncias e clique em "Excluir".

5027d56977997f70.png

Digite "delete" para confirmar a exclusão na caixa de texto.

Aguarde a exclusão dos grupos gerenciados de instâncias. Isso também exclui as instâncias no grupo. Só é possível excluir os modelos após a exclusão do grupo de instâncias.

  1. Acesse Modelos de instância no painel à esquerda**.** Selecione os dois modelos de instâncias e clique em "Excluir".

8d88abacd32c11ce.png

  1. Navegue até Instâncias de VM no painel à esquerda**.** Selecione as reticências ao lado da instância siege-vm e clique em "Excluir".

2b58ab43695836e9.png

  1. Acesse o Menu de navegação ( mainmenu.png) > Rede VPC > Firewall. Selecione default-allow-health-check e clique em delete -

561d5e771d36d85.png

9. Parabéns!

Você implementou a limitação de taxa com o Cloud Armor com sucesso. Você configurou um balanceador de carga HTTP com back-ends em us-east1 e europe-west1. Depois você fez um teste de estresse no balanceador de carga com uma VM e usou a limitação de taxa com o Cloud Armor para negar o endereço IP. Você analisou os registros da política de segurança para saber por que o tráfego foi bloqueado.

O que vimos

  • Como configurar modelos de instâncias e criar grupos gerenciados de instâncias.
  • Como configurar um balanceador de carga HTTP.
  • Como criar uma política de limitação de taxa do Cloud Armor.
  • Como validar se a política de limitação de taxa está funcionando conforme o esperado.

Próximas etapas

  • Tente configurar uma política de limitação de taxa com base em um intervalo de IP de origem. Exemplo de comando abaixo:
gcloud alpha compute security-policies rules create 105 \
    --security-policy sec-policy     \
    --src-ip-ranges "1.2.3.0/24"     \
    --action throttle                \
    --rate-limit-threshold-count 100 \
    --rate-limit-threshold-interval-sec 60 \
    --conform-action allow           \
    --exceed-action deny-429         \
    --enforce-on-key IP
  • Tente configurar uma política de limitação de taxa com base no código da região. Exemplo de comando abaixo:
gcloud alpha compute security-policies rules create 101 \
    --security-policy sec-policy     \
    --expression "origin.region_code == 'US'" \
    --action rate-based-ban                 \
    --rate-limit-threshold-count 10         \
    --rate-limit-threshold-interval-sec 60  \
    --ban-duration-sec 300           \
    --ban-threshold-count 1000       \
    --ban-threshold-interval-sec 600 \
    --conform-action allow           \
    --exceed-action deny-403         \
    --enforce-on-key IP