Como usar o VPC Service Controls

O VPC Service Controls é um recurso do Google Cloud em que é possível configurar um perímetro seguro para evitar a filtragem externa de dados. Neste guia, explicamos como usar o VPC Service Controls com o Cloud Functions para aumentar a segurança das suas funções.

Para limitações conhecidas dessa integração, consulte a documentação do VPC Service Controls.

Configuração no nível da organização

Para usar o VPC Service Controls com o Cloud Functions, configure um perímetro de serviço e as políticas da organização, o que é feito no nível da organização. Com essa configuração, é possível confirmar se as verificações do VPC Service Controls foram aplicadas ao uso do Cloud Functions e se os desenvolvedores implantaram apenas funções compatíveis com o VPC Service Controls.

Configure um perímetro do VPC Service Controls

Para configurar um perímetro de serviço, é preciso ter os papéis de Visualizador da organização (roles/resourcemanager.organizationViewer) e Editor do Access Context Manager (roles/accesscontextmanager.policyEditor).

Siga o Guia de início rápido do VPC Service Controls para:

  1. criar um perímetro de serviço;
  2. adicionar um ou mais projetos ao perímetro;

  3. restringir a API Cloud Functions.

Depois de configurar o perímetro de serviço, todas as chamadas para a API Cloud Functions são verificadas para garantir que sejam originadas dentro do mesmo perímetro.

Opcional: ativar o acesso do perímetro para máquinas de desenvolvimento

Como as verificações do VPC Service Controls são aplicadas à API Cloud Functions, as chamadas à API Cloud Functions resultam em erro, a menos que sejam originadas do perímetro de serviço. Assim, para gerenciar funções com a API Cloud Functions, a IU do Cloud Functions no Console do Cloud ou a ferramenta de linha de comando gcloud, escolha uma das seguintes opções:

  • Use uma máquina dentro do perímetro do VPC Service Controls. Por exemplo, use uma VM do Compute Engine ou um computador no local conectado à rede VPC via VPN.

  • Conceda aos desenvolvedores de funções acesso ao perímetro. Por exemplo, crie níveis de acesso que permitam o acesso ao perímetro com base no endereço IP ou na identidade do usuário. Consulte Como conceder acesso a recursos protegidos de fora do perímetro para mais informações.

Configure políticas da organização

Para gerenciar as políticas da organização, é necessário o papel de Administrador da política da organização (roles/orgpolicy.policyAdmin).

Para estar alinhado ao VPC Service Controls e evitar a exfiltração de dados, estabeleça as seguintes políticas da organização que controlam as configurações de rede que podem ser permitidas para o Cloud Functions no perímetro de serviço.

Restrinja configurações de entrada permitidas

A política organizacional cloudfunctions.allowedIngressSettings controla as configurações de entrada que os desenvolvedores podem usar para o Cloud Functions. Configure esta política para exigir que os desenvolvedores usem o valor ALLOW_INTERNAL_ONLY:

Console

  1. Acesse a página Configurações de entrada permitidas da política no Console do Cloud:

    Acessar a política da organização

  2. Clique em Editar.

  3. Na página Editar, selecione Personalizar.

  4. Em Aplicação da política, selecione Substituir.

  5. Em Valores da política, selecione Personalizada.

  6. Em Tipo de política, selecione Permitir.

  7. Em Valores personalizados, digite ALLOW_INTERNAL_ONLY.

  8. Clique em Salvar.

gcloud

Use o comando gcloud beta resource-manager org-policies allow:

gcloud beta resource-manager org-policies allow \
  cloudfunctions.allowedIngressSettings ALLOW_INTERNAL_ONLY \
  --organization ORGANIZATION_ID

ORGANIZATION_ID é o ID da organização.

Assim que essa política da organização estiver em vigor, todas as funções precisarão usar o valor ALLOW_INTERNAL_ONLY nas configurações de entrada. Isso significa que as funções HTTP só podem aceitar tráfego proveniente de uma rede VPC dentro do perímetro de serviço. As implantações de função que especificam um valor diferente não funcionarão.

Exija o conector VPC

A política da organização cloudfunctions.requireVPCConnector controla se um conector de acesso VPC sem servidor é necessário para as funções. Defina a política da organização para aplicar essa restrição:

Console

  1. Acesse a página Exigir conector VPC da política no Console do Cloud:

    Acessar a política da organização

  2. Clique em Editar.

  3. Na página Editar, selecione Personalizar.

  4. Em Aplicação, selecione Ativada.

  5. Clique em Salvar.

gcloud

Use o comando gcloud beta resource-manager org-policies enable-enforce:

gcloud beta resource-manager org-policies enable-enforce \
  cloudfunctions.requireVPCConnector \
  --organization ORGANIZATION_ID

ORGANIZATION_ID é o ID da organização.

Assim que essa política da organização estiver em vigor, todas as funções deverão usar um conector de acesso VPC sem servidor. As implantações de função que não especificam um conector não funcionarão.

Restringir as configurações de saída do conector VPC permitidas

A política organizacional cloudfunctions.allowedVpcConnectorEgressSettings controla as configurações de saída que os desenvolvedores têm permissão para usar no Cloud Functions. Defina a política da organização para permitir apenas o valor ALL_TRAFFIC:

Console

  1. Acesse a página Configurações de saída do conector VPC permitidas da política no Console do Cloud:

    Acessar a política da organização

  2. Clique em Editar.

  3. Na página Editar, selecione Personalizar.

  4. Em Aplicação da política, selecione Substituir.

  5. Em Valores da política, selecione Personalizada.

  6. Em Tipo de política, selecione Permitir.

  7. Em Valores personalizados, digite ALL_TRAFFIC.

  8. Clique em Salvar.

gcloud

Use o comando gcloud beta resource-manager org-policies allow:

gcloud beta resource-manager org-policies allow \
  cloudfunctions.allowedVpcConnectorEgressSettings ALL_TRAFFIC \
  --organization ORGANIZATION_ID

ORGANIZATION_ID é o ID da organização.

Assim que essa política da organização estiver em vigor, todas as funções deverão usar o valor ALL_TRAFFIC para as configurações de saída. Isso significa que as funções precisam rotear todo o tráfego de saída pela rede VPC. As implantações de função que especificam um valor diferente não funcionarão.

Configuração no nível do projeto

Para projetos individuais no perímetro de serviço, realize outras configurações para usar o VPC Service Controls.

Configure redes VPC

Para acessar as APIs e os serviços do Google e, ao mesmo tempo, reduzir os riscos de exfiltração de dados, as solicitações precisam ser enviadas para o intervalo de IP virtual (VIP, na sigla em inglês) restrito, 199.36.153.4/30 (restricted.googleapis.com).

Para cada rede VPC de um projeto, siga estas etapas para bloquear o tráfego de saída, exceto o tráfego para o intervalo VIP restrito:

  1. Configure as regras de firewall para impedir que os dados saiam da rede VPC:

    • Crie uma regra de saída de negação que bloqueie todo o tráfego de saída.

    • Crie uma regra de saída de permissão em que seja possível rotear o tráfego para 199.36.153.4/30 na porta 443 do TCP. Confira se ele tem uma prioridade antes da regra de saída de negação criada. Isso permite a saída somente para o intervalo VIP restrito.

  2. Configure o DNS para resolver *.googleapis.com em restricted.googleapis.com.

  3. Configure o DNS com um mapeamento de registro A *.cloudfunctions.net no intervalo de IP 199.36.153.4/30. Faça isso com o Cloud DNS:

    gcloud dns managed-zones create ZONE_NAME \
    --visibility=private \
    --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/default \
    --description=none \
    --dns-name=cloudfunctions.net
    
    gcloud dns record-sets transaction start --zone=ZONE_NAME
    
    gcloud dns record-sets transaction add --name=*.cloudfunctions.net. \
    --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
    --zone=ZONE_NAME \
    --ttl=300
    
    gcloud dns record-sets transaction execute --zone=ZONE_NAME
    

Nesta etapa, as solicitações provenientes da rede VPC:

  • não podem sair da rede VPC, impedindo a saída fora do perímetro de serviço;
  • só podem alcançar APIs e serviços do Google que verificam o VPC Service Controls, evitando a exfiltração pelas APIs do Google.

Conceder à conta de serviço do Cloud Build acesso ao perímetro do VPC Service Controls

O Cloud Functions usa o Cloud Build para criar o código-fonte em um contêiner executável. Para usar o Cloud Functions com o VPC Service Controls, você precisa configurar a conta de serviço do Cloud Build para ter acesso ao perímetro de serviço:

Encontrar o nome da conta de serviço.

Node 8 e Go 1.11

Como a versão é executada no projeto de locatário, você precisa usar a seguinte solução alternativa:

  1. Implante uma função no projeto. Use o padrão no Console do Google Cloud:

    Criar função

  2. Aguarde que a implantação não dê certo e clique no nome da função na lista para acessar a página Detalhes da função.

  3. Veja a mensagem de erro "Falha na implantação", que começa com Build failed: Unable to build your function due to VPC Service Controls. A mensagem de erro contém um endereço de e-mail que é o nome da conta de serviço.

Também é possível usar um script como o seguinte para encontrar o endereço da conta de serviço na linha de comando:

#!/bin/bash

REGION="us-central1" # Your region
CONNECTOR_NAME="test-connector" # Your VPC connector name

# Deploy and delete an HTTP-triggered function
gcloud functions deploy FUNCTION_NAME --trigger-http --runtime nodejs8 --region $REGION --ingress-settings=internal-only --egress-settings=all --vpc-connector $CONNECTOR_NAME -q
gcloud functions delete FUNCTION_NAME --region $REGION -q

# Search log entries for Cloud Build failures
LOG_ENTRIES=$(gcloud logging read "resource.type=\"audited_resource\" AND protoPayload.serviceName=\"containerregistry.googleapis.com\"" --freshness=10m)
SERVICE_ACCTS=$(echo "$LOG_ENTRIES" | grep -oE "\d+@\w+.gserviceaccount.com" | sort | uniq)

# Print out service account IDs
echo "$SERVICE_ACCTS"

em que FUNCTION_NAME pode ser qualquer função HTTP, como uma simples função Hello World (em inglês).

Outros ambientes de execução

  1. Se você estiver usando o Java 11, Python 3.7 ou 3.8, Node 10 ou Go 1.13, use a página do IAM no Console do Google Cloud para encontrar a conta de serviço do Cloud Build.

    Abrir o IAM

  2. Verifique se o projeto correto aparece na lista suspensa.

  3. Pesquise cloudbuild.gserviceaccount.com. O endereço de e-mail no formato my-project-number@cloudbuild.gserviceaccount.com é o nome da conta de serviço.

Conceder à conta de serviço acesso ao perímetro de serviço.

Quando tiver o nome da conta de serviço, siga o guia em Limitar acesso por usuário ou conta de serviço para criar um nível de acesso. Consulte Como adicionar um nível de acesso a um perímetro atual para incluir o nível de acesso no perímetro de serviço.

Depois de conceder à conta de serviço do Cloud Build o acesso ao perímetro de serviço do VPC Service Controls, as implantações de função terão êxito.

Implantar funções que sigam o VPC Service Controls

Assim que o VPC Service Controls estiver configurado para o Cloud Functions, confira se todas as funções implantadas no perímetro de serviço obedecem às políticas da organização especificadas. Isso significa que:

  • Todas as funções precisam usar um conector acesso VPC sem servidor. Consulte Como se conectar a uma rede VCP para mais informações.
  • Todas as funções precisam permitir somente o tráfego de fontes internas. Consulte Configurações de entrada para mais informações.
  • Todas as funções precisam rotear todo o tráfego de saída pela rede VPC. Consulte Configurações de saída para mais informações.

As implantações de funções que não atenderem aos critérios acima não funcionarão.

Inspecione as funções atuais para garantir a conformidade com o VPC Service Controls

Depois de configurar o VPC Service Controls, as funções novas criadas em projetos dentro do perímetro de serviço são automaticamente verificadas para fins de conformidade. No entanto, para evitar a interrupção das cargas de trabalho em andamento, as funções atuais continuam funcionando e podem não estar em conformidade com as políticas da organização.

Recomenda-se inspecionar as funções atuais e atualizar ou reimplantar as funções, conforme necessário. Para facilitar esse processo, crie um script que use a API Cloud Functions para listar as funções e destacar as que não especificam as configurações de rede adequadas.