Tutorial básico II do VPC Service Controls: como solucionar problemas de violação de saída

1. Introdução

O VPC Service Controls (VPC-SC) é um controle de segurança no nível da organização no Google Cloud que permite que clientes corporativos reduzam os riscos de exfiltração de dados. O VPC Service Controls oferece acesso estilo confiança zero a serviços multilocatários, permitindo que os clientes restrinjam o acesso a IPs autorizados, contexto de cliente e parâmetros de dispositivos enquanto se conectam a serviços multilocatários na Internet e em outros serviços para reduzir perdas intencionais e não intencionais. Como vimos no Tutorial básico I do VPC Service Controls, é possível usar o VPC Service Controls para criar perímetros que protejam os recursos e os dados de serviços especificados explicitamente.

As metas deste tutorial são:

  • Entender os princípios básicos do VPC Service Controls
  • Atualizar e testar um perímetro de serviço usando o modo de teste
  • Proteger dois serviços com o VPC Service Controls
  • Resolver um problema de violação de saída do VPC Service Controls ao listar um objeto do Cloud Storage

2. Configuração e requisitos

Para este tutorial, precisamos dos seguintes pré-requisitos:

dbec101f41102ca2.png

Resources-setup

  1. Configure os recursos conforme descrito na seção "Resources-setup" do Tutorial básico I do VPC Service Controls.
  2. Verifique se você tem as permissões necessárias para administrar o Cloud Storage.
  3. Neste tutorial, vamos começar a usar a CLI em vez do console do Cloud. Em um dos ambientes de desenvolvimento, configure a CLI gcloud:
  • Cloud Shell: para usar um terminal on-line com a CLI gcloud já configurada, ative o Cloud Shell.

Ative o Cloud Shell clicando no ícone no canto superior direito do console do Cloud. A inicialização da sessão pode levar alguns segundos. Consulte o guia do Cloud Shell para mais detalhes.

a0ceb29950db4eac.png

  • Shell local: para usar um ambiente de desenvolvimento local, instale e inicialize a CLI gcloud.

Custo

É necessário ativar o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não vai 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. Novos usuários do Google Cloud podem aproveitar o programa de avaliação sem custos de US $300.

Os únicos recursos que vão gerar um custo são a instância de VM e o objeto do Cloud Storage. Um custo estimado da instância de VM pode ser encontrado na calculadora de preços. O custo estimado do Cloud Storage pode ser encontrado nesta lista de preços.

3. Criar um bucket e um objeto do Cloud Storage

Como mencionado anteriormente, vamos reutilizar os recursos criados no tutorial anterior. Então, vamos continuar com a criação do bucket do Cloud Storage. Neste tutorial, vamos começar a usar a CLI gcloud em vez do console.

  1. No console do Google, selecione ProjectX. Neste projeto, vamos criar o bucket do Storage e o objeto.
  2. Verifique se você definiu o Cloud Shell para usar o ProjectX executando o seguinte comando:
gcloud config set project PROJECT_ID
  1. No seu ambiente de desenvolvimento, execute este comando:
gcloud storage buckets create gs://BUCKET_NAME --location=us-central1
  1. Crie um objeto de armazenamento para que possamos lê-lo na instância de VM localizada em ProjectZ. Vamos criar um arquivo .txt.
nano hello.txt 

Adicione o que quiser ao arquivo de texto.

  1. Faça upload do objeto para o bucket.
gcloud storage cp /home/${USER}/hello.txt gs://BUCKET_NAME
  1. Verifique se o objeto foi enviado para o bucket listando.
gcloud storage ls gs://BUCKET_NAME

O arquivo hello.txt vai aparecer no console.

4. Proteger a API Storage do Cloud

No codelab anterior, criamos um perímetro e protegemos a API Compute Engine. Neste codelab, vamos editar o perímetro do modo de teste a seco e adicionar o Cloud Storage. Isso vai ajudar a determinar o impacto da proteção de perímetro, mostrando as violações do VPC Service Controls nos registros de auditoria. No entanto, os recursos vão permanecer acessíveis até que o perímetro seja aplicado.

  1. No console do Google, selecione sua organização e acesse o VPC Service Controls. Verifique se você está no escopo da organização.
  2. Abra o Cloud Shell e atualize o perímetro do modo de teste "SuperProtection" criado no laboratório anterior:
gcloud access-context-manager perimeters dry-run update SuperProtection --policy=POLICY --add-restricted-services=storage.googleapis.com
  1. Verifique se a API Storage do Cloud Storage foi atualizada descrevendo o perímetro
gcloud access-context-manager perimeters dry-run describe SuperProtection --policy=POLICY 

Na saída, você vai ver que a API Storage está listada abaixo dos serviços restritos.

junto com a API Compute Engine, mas com um rótulo "-vpcAccessibleServices: {}"":

2025ddc01a2e9a81.png

5. Verifique se a API Storage do Cloud foi protegida

No modo de teste, verifique se o perímetro "SuperProtection" está mostrando a negação listando o objeto da instância de VM criada no ProjectZ para o ProjectX, que está hospedando o bucket de armazenamento.

  1. No console do Cloud, acesse o seletor de projetos e selecione ProjectZ. Em seguida, navegue até Compute Engine > Instâncias de VM.
  2. Clique no botão "SSH" para se conectar à instância de VM e acessar a linha de comando dela.

5ca02149b78c11f9.png

  1. Liste o arquivo hello.txt que enviamos por upload anteriormente.
gcloud storage ls gs://BUCKET_NAME

Como a API Cloud Storage está protegida no modo de simulação, é possível listar os recursos, mas você precisa ter uma mensagem de erro nos registros de auditoria do ProjectZ.

  1. Acesse a API Análise de registros no ProjectZ e procure a última mensagem de erro do VPC Service Controls. Use este filtro para encontrar o registro que estamos procurando:
protoPayload.status.details.violations.type="VPC_SERVICE_CONTROLS"
"(Dry Run Mode) Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:UNIQUE_ID"

Esse filtro vai mostrar a última violação no modo de simulação que pertence ao Cloud Storage. Confira um exemplo de como o registro aparece. Podemos validar que a violação é de saída ao tentar listar o conteúdo no bucket localizado em ProjectX.

egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTX_ID"
sourceType: "Network"
targetResource: "projects/PROJECTZ_ID"
}
]
resourceNames: [
0: "projects//buckets/BUCKET_NAME"
]
securityPolicyInfo: {
organizationId: "ORGANIZATION_ID"
servicePerimeterName: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"
vpcServiceControlsUniqueId: "UNIQUE_ID"
}
methodName: "google.storage.objects.list"
  1. Como validamos que a chamada de API para o Cloud Storage gera uma violação do VPC Service Controls, vamos aplicar o perímetro com a nova configuração. Abra o Cloud Shell e aplique o perímetro de simulação:
gcloud access-context-manager perimeters dry-run enforce SuperProtection --policy=POLICY --async
  1. Conecte-se à instância de VM usando SSH e liste o bucket de armazenamento novamente para verificar se o perímetro de simulação foi aplicado corretamente.
gcloud storage ls gs://BUCKET_NAME

Vamos receber uma violação do VPC Service Controls na CLI da VM em vez de uma lista dos objetos do Storage:

ERROR: (gcloud.storage.ls) User [PROJECT_NUMBER-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:"UNIQUE_ID"

Evitamos a exfiltração de dados usando o VPC Service Controls para impedir a leitura ou cópia de dados para um recurso fora do perímetro.

6. Resolver problemas de negação da lista.

Vamos resolver o problema da negação que recebemos da CLI da instância de VM. Vamos verificar os registros de auditoria e procurar o ID exclusivo do VPC Service Controls.

  1. Acesse o seletor de projetos e escolha "ProjectZ".
  2. Encontre o ID exclusivo do VPC Service Controls nos registros de auditoria usando a seguinte consulta na Análise de registros:
resource.type="audited_resource"
protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"

Isso vai mostrar todos os registros de auditoria do VPC Service Controls. Vamos procurar o último registro de erros. Como a chamada de API foi feita da instância de VM, o principal precisa ser a conta de serviço do Compute Engine "PROJECT_NUMBER-compute@developer.gserviceaccount.com"

Como já temos o ID exclusivo do VPC Service Controls, podemos usá-lo para acessar o registro desejado diretamente usando este filtro:

protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_ID"
  1. Clique no cabeçalho VPC Service Controls e selecione "Resolver problemas de negação", que vai abrir o solucionador de problemas do VPC Service Controls.

Essa API vai mostrar em uma interface amigável o motivo da violação e se ela foi de entrada ou saída, entre outras coisas úteis.

Neste exercício, vamos procurar o seguinte:

authenticationInfo: {
principalEmail: "PROJECT_ID-compute@developer.gserviceaccount.com"
egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTZ_ID"
sourceType: "Network"
targetResource: "projects/PROJECTX_ID"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"

Essas informações são suficientes para sabermos que precisamos criar uma regra de saída para permitir que a conta de serviço do Compute Engine acesse o bucket de armazenamento do ProjectZ para o ProjectX. Além disso, a rede não está no mesmo perímetro. Portanto, precisamos permitir a comunicação da VPC com os serviços e compartilhar dados entre os perímetros de serviço.

  1. Ative o Cloud Shell e crie um arquivo .yaml com a regra de saída usando um editor de texto.
nano egresstorage.yaml 
- egressTo:
    operations:
    - serviceName: storage.googleapis.com
      methodSelectors:
      - method: \"*\"
    resources:
    - projects/PROJECTX_ID
 egressFrom:
    identities:
    - serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com
  1. Atualize a política de entrada que protege o ProjectZ.
gcloud access-context-manager perimeters update SuperProtection --set-egress-policies=egresstorage.yaml --policy=POLICY 

Agora podemos tentar acessar o bucket na instância de VM novamente.

  1. No console do Cloud, acesse o seletor de projetos e selecione ProjectZ. Em seguida, navegue até Compute Engine > Instâncias de VM.
  2. Clique no botão "SSH" para se conectar à instância de VM e acessar a linha de comando dela.
  3. Depois de acessar a CLI da VM, tente listar os objetos no bucket de armazenamento.
gcloud storage ls gs://BUCKET_NAME/

Você vai receber a seguinte mensagem de erro:

ERROR: (gcloud.storage.ls) User [PROJECT_ID-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): PROJECT_ID-compute@developer.gserviceaccount.com does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist).
  1. Precisamos conceder uma permissão de leitura de objetos à conta de serviço do Compute Engine para listar os objetos no bucket de armazenamento.
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com --role=roles/storage.objectViewer
  1. Mais uma vez, vamos tentar listar o arquivo hello.txt na CLI da instância de VM .
gcloud storage ls gs://BUCKET_NAME/
.
.
gs://BUCKET_NAME/hello.txt

Agora podemos listar o objeto sem uma violação de permissão do VPC Service Controls, mas e o download do arquivo? Vamos tentar.

gcloud storage cp gs://BUCKET_NAME/hello.txt /home/${USER}

e vamos receber a seguinte saída:

Copying gs://BUCKET_NAME/hello.txt to file:///home/${USER}
 Completed files 1/1 | 54.0B/54.0B  

7. Limpeza

Não há cobrança extra pelo uso do VPC Service Controls quando o serviço não está em uso, mas é recomendável limpar a configuração usada neste laboratório. Você também pode excluir sua instância de VM e/ou projetos do Cloud para evitar cobranças. A exclusão do projeto na nuvem interrompe o faturamento de todos os recursos usados nele.

  1. Para excluir a instância de VM, marque a caixa de seleção à esquerda do nome dela e clique em Excluir.

da0abf0894fe03cd.png

  1. Para excluir o perímetro, siga estas etapas:
  • No console do Google Cloud, clique em Segurança e em VPC Service Controls no escopo da organização.
  • Na página "VPC Service Controls", na linha da tabela correspondente ao perímetro que você quer excluir, clique no ícone "Excluir".
  1. Para excluir o nível de acesso, siga estas etapas:
  • No console do Google Cloud, abra a página Access Context Manager no escopo da pasta.
  • Na grade, na linha do nível de acesso que você quer excluir, clique em "Ícone de exclusão" e em Excluir.
  1. Para excluir o objeto e o bucket do Storage, siga estas etapas:
  • No console do Google Cloud, abra a página de buckets do Cloud Storage .
  • Marque a caixa de seleção ao lado do bucket criado.
  • Clique em Excluir.
  • Na janela que é aberta, confirme que você quer excluir o bucket.
  • Clique em Excluir.
  1. Para encerrar seu projeto, siga estas etapas:
  • No console do Google Cloud, acesse a página Configurações do IAM e do administrador do projeto que você quer excluir.
  • Na página "Configurações do IAM e administrador", clique em Desativar.
  • Digite o ID do projeto e clique em Encerrar mesmo assim.

8. Parabéns!

Neste codelab, você atualizou, aplicou e solucionou problemas de um perímetro de simulação do VPC Service Controls.

Saiba mais

Licença

Este conteúdo está sob a licença Atribuição 2.0 Genérica da Creative Commons.