Como proteger o tráfego de entrada do Cloud Run

1. Visão geral

Este laboratório mostra como restringir o acesso a um serviço do Cloud Run e permitir apenas solicitações de uma carga de trabalho em execução no local ou na VPC do seu projeto. Há duas camadas de controle de acesso que você pode usar: configurações de entrada e políticas de gerenciamento de identidade e acesso (IAM).

5aed47d10595c878.png

Configurações de entrada

Com as configurações de entrada, você pode filtrar solicitações com base na origem da rede (interna ou externa). Por padrão, todas as solicitações são permitidas, incluindo as da Internet pública.

Política de IAM

As políticas do IAM permitem filtrar solicitações com base na identidade do remetente e são comumente usadas para autenticar solicitações de serviço a serviço.

Neste laboratório, você vai aprender como e quando usar as configurações de ingress.

Os hosts locais se conectam pela VPC

Neste laboratório, vamos simular uma carga de trabalho local. Para conectar um host local ao Cloud Run, configure o Acesso privado do Google para hosts locais. Isso inclui a configuração de um gateway do Cloud VPN na rede VPC, conforme mostrado abaixo.

31611f6a2f12fd0c.png

Como simular uma carga de trabalho local usando um servidor de salto na VPC

Neste laboratório, você vai simular o envio de solicitações de um host local enviando solicitações de uma máquina virtual do Compute Engine na VPC, conforme mostrado aqui.

aebf22740c7a84f0.png

A máquina virtual do Compute Engine que você vai usar como servidor de salto tem a mesma origem de rede que o gateway de VPN do Cloud. Por isso, é possível usar essa máquina para simular o envio de solicitações de uma carga de trabalho local.

2. Configuração e requisitos

Configuração de ambiente personalizada

  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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google É possível atualizar o local a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto.
  • Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative 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 evitar cobranças além deste tutorial, exclua os recursos criados ou exclua o projeto inteiro. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Configuração do ambiente

  1. Defina uma variável de ambiente para o ID do projeto para uso em comandos posteriores:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ZONE=us-central1-a
  1. Ative as APIs necessárias para executar este laboratório.
gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  compute.googleapis.com \
  artifactregistry.googleapis.com
  1. Clone o repositório do app de exemplo e navegue até o diretório
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service
  1. Definir a região e a zona padrão para o Compute Engine e o Cloud Run
gcloud config set compute/region ${REGION}
gcloud config set run/region ${REGION}
gcloud config set compute/zone ${ZONE}

3. Implante o serviço

Primeiro, você vai implantar o serviço e deixá-lo acessível ao público. Depois que você verificar que pode enviar solicitações do navegador, vamos bloquear o serviço e permitir apenas solicitações de fontes de rede internas.

Ao executar o comando abaixo, siga estas instruções:

  • Local do código-fonte (...): verifique se você está no diretório do serviço de registro de parceiro e pressione Enter para aceitar o padrão
  • Nome do serviço (partner-registration-service): pressione Enter para aceitar o padrão
  • Permitir invocações não autenticadas para [partner-registration-service] (s/n)? S
gcloud run deploy 

Quando esse comando for concluído, ele vai listar o URL do seu serviço do Cloud Run. A saída será semelhante a esta lista:

Service [partner-registration-service] revision [partner-registration-service-00001-haz] has been deployed and is serving 100 percent of traffic.
Service URL: https://partner-registration-service-ssssssssss-uc.a.run.app

Abra o URL do serviço no navegador. Você vai ver esta saída:

Partner registration service: RUNNING

Configurar o serviço para permitir apenas solicitações internas

Agora, você vai usar as configurações de entrada do serviço do Cloud Run para permitir apenas solicitações de fontes internas. As origens internas incluem recursos em redes VPC que estão no mesmo projeto (ou perímetro do VPC Service Controls) que o serviço do Cloud Run, o que é perfeito para nosso caso de uso.

Além disso, as solicitações de outros produtos do Google Cloud são consideradas internas, mesmo que não façam parte da VPC. Esses produtos incluem, por exemplo, o Pub/Sub e os fluxos de trabalho.

As solicitações dessas origens permanecem na rede do Google, mesmo que acessem seu serviço no URL run.app, e o acesso público é proibido.

Atualize o serviço para permitir apenas solicitações internas:

gcloud run services update partner-registration-service --ingress=internal

Se você abrir o URL do serviço novamente, ele vai mostrar a mensagem "Erro: proibido - acesso proibido".

Como o navegador envia a solicitação de uma origem de rede externa, e não de uma origem interna, é exatamente isso que você espera que aconteça no projeto do Google Cloud. Seu serviço está mais seguro.

4. Criar uma máquina virtual do Compute Engine como um servidor de salto

A próxima etapa é simular solicitações de um servidor local por um gateway da Cloud VPN, criando uma instância do Compute Engine na VPC para usar como um servidor de salto:

gcloud compute instances create jump-server --scopes=https://www.googleapis.com/auth/cloud-platform

A saída deste comando será semelhante a esta:

NAME         ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
jump-server  us-central1-a  n1-standard-1               10.128.0.10  34.170.108.8  RUNNING

Enviar uma solicitação da instância do Compute Engine para o serviço

Agora, você vai abrir um terminal na máquina virtual e enviar uma solicitação diretamente da máquina na rede VPC.

Se o comando a seguir solicitar que você configure o SSH no Cloud Shell, siga as instruções:

gcloud compute ssh jump-server

Acesse o URL do serviço do Cloud Run com este comando:

gcloud run services describe partner-registration-service --region us-central1

As primeiras linhas da saída vão ficar assim:

✔ Service partner-registration-service in region us-central1

URL:     https://partner-registration-service-ssssssssss-uc.a.run.app
Ingress: internal

Agora copie o URL e envie uma solicitação da instância do Compute Engine usando o curl. Essa solicitação deve ser bem-sucedida, porque a instância de VM é executada na rede VPC do projeto, ou seja, é uma fonte interna.

export SERVICE_URL=https://

curl ${SERVICE_URL}

A saída vai ser:

Partner registration service: RUNNING

5. E o controle de acesso baseado no IAM?

Este laboratório mostrou como e quando usar as configurações de ingress. As configurações de ingress são uma ótima primeira etapa se você estiver conectando uma carga de trabalho local ao Cloud Run.

O controle de acesso baseado no IAM exige mais esforço para ser implementado, especialmente se você estiver fazendo a chamada de um host local:

  • O IAM exige que você gerencie credenciais de conta de serviço de longa duração no host
  • O IAM exige mudanças no código para assinar solicitações usando as credenciais da conta de serviço.

O Google recomenda uma abordagem multicamadas para o controle de acesso. Usar as configurações de entrada para restringir o acesso apenas a hosts internos é um ótimo começo, mas não pare por aí.

6. Parabéns!

Parabéns, você concluiu o codelab.

O que vem em seguida:

Conheça outros codelabs da Cymbal Eats:

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto ou mantenha o projeto e exclua cada um dos recursos.

Excluir o projeto

O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para este tutorial.

Referências úteis

Confira outros recursos para saber mais sobre as duas camadas de controle de acesso no Cloud Run.