Política de firewall hierárquica com tags gerenciadas pelo IAM

1. Introdução

Cloud Next Generation Firewall (NGFW)

O Cloud Firewall de última geração é um serviço de firewall totalmente distribuído com recursos avançados de proteção, microssegmentação e cobertura abrangente para proteger suas cargas de trabalho do Google Cloud contra ataques internos e externos.

O Cloud NGFW tem os seguintes benefícios:

  • Serviço de firewall distribuído:o Cloud NGFW oferece uma aplicação com base em host totalmente distribuída com estado em cada carga de trabalho para ativar a arquitetura de segurança de confiança zero.
  • Configuração e implantação simplificadas:o Cloud NGFW implementa políticas de firewall hierárquicas e de rede que podem ser anexadas a um nó de hierarquia de recursos. Essas políticas fornecem uma experiência de firewall consistente em toda a hierarquia de recursos do Google Cloud.
  • Controle granular e microssegmentação:a combinação de políticas de firewall e tags gerenciadas pelo Identity and Access Management (IAM) oferece controle preciso para o tráfego norte-sul e leste-oeste até uma única VM em redes de nuvem privada virtual (VPC).

Políticas de firewall de rede

A política de firewall de rede atua como um contêiner para regras de firewall. As regras definidas em uma política de firewall de rede não são aplicadas em nenhum lugar até que a política seja associada a uma rede VPC. Cada rede VPC pode ter uma política de firewall de rede associada a ela. As políticas de firewall de rede são compatíveis com tags controladas pelo IAM (ou apenas tags) nas regras de firewall e podem ser usadas para fornecer identidade à carga de trabalho.

O compartilhamento de uma política de firewall de rede entre redes e a integração com tags gerenciadas pelo IAM simplificam muito a configuração e o gerenciamento de firewalls.

Com a introdução da política de firewall de rede, as políticas de firewall do Google Cloud agora consistem nos seguintes componentes:

  1. Política de firewall hierárquica
  2. Regras de firewall da VPC
  3. Política global de firewall de rede e política regional de firewall de rede

As políticas de firewall hierárquicas são compatíveis com os nós da organização e da pasta na hierarquia de recursos, enquanto as regras de firewall da VPC e as políticas de firewall de rede são aplicadas no nível da VPC. Uma grande diferença entre as regras de firewall da VPC e as políticas de firewall de rede é que as regras de firewall da VPC só podem ser aplicadas a uma única rede VPC, enquanto as políticas de firewall de rede podem ser anexadas a uma única VPC ou grupo de VPCs, entre outros benefícios, como atualizações em lote.

Neste laboratório, vamos testar a política hierárquica de firewall e a política de firewall de rede global.

Por fim, também temos as regras de firewall implícitas que vêm com todas as redes VPC:

  • Uma regra de saída cuja ação é permitir e o destino é 0.0.0.0/0
  • Uma regra de entrada com a ação negar e a origem 0.0.0.0/0

Por padrão, a sequência de aplicação é mostrada no diagrama a seguir:

86df8f0d19c64e80.png

Tags gerenciadas pelo IAM

As novas tags integradas às regras da política de firewall são recursos de par de chave-valor definidos no nível da organização ou do projeto da hierarquia de recursos do Google Cloud. Como o nome sugere, essa tag contém um controle de acesso do IAM que especifica quem pode fazer o quê na tag. Com as permissões do IAM, por exemplo, é possível especificar quais principais podem atribuir valores a tags e quais principais podem anexar tags a recursos. Depois que uma tag é aplicada a um recurso, as regras de política de firewall podem usá-la para permitir e negar o tráfego.

As tags seguem o modelo de recursos de herança do Google Cloud, o que significa que as tags e os respectivos valores são transmitidos para baixo na hierarquia dos pais. Como resultado, as tags podem ser criadas em um local e usadas por outras pastas e projetos em toda a hierarquia de recursos. Acesse esta página para mais detalhes sobre tags e restrição de acesso.

As tags não devem ser confundidas com tags de rede, que são strings adicionadas a instâncias do Compute Engine. Elas são associadas à instância e desaparecem quando ela é desativada. As regras de firewall da VPC podem incluir tags de rede, mas, como não são consideradas recursos de nuvem, elas não estão sujeitas ao controle de acesso do IAM. Acesse esta página para mais detalhes sobre a diferença.

2. O que você vai aprender

  • Como criar tags gerenciadas pelo IAM para usar com o Cloud NGFW e com escopo global.
  • Como anexar tags a VMs.
  • Como criar uma política hierárquica de firewall e associá-la a uma pasta.
  • Como criar uma regra de firewall na política hierárquica de firewall e especificar origem e destino usando tags controladas pelo IAM.

3. Arquitetura geral do laboratório

1bfe78ad755496e5.png

Organização e pastas:

  • Você vai criar duas pastas, folder1 e folder2, diretamente na sua organização.

Projetos:

  • Em folder1, crie um projeto host. Esse projeto vai conter a rede VPC compartilhada.
  • Em folder2, crie um projeto de serviço. Esse projeto vai conter as VMs que usam a VPC compartilhada.

Networking:

  • Uma rede VPC chamada mynet será criada no projeto host e configurada como uma VPC compartilhada. Isso permite que os recursos no projeto de serviço usem a rede.
  • Duas VMs serão criadas no projeto de serviço e conectadas à VPC compartilhada mynet.

Tags gerenciadas pelo IAM:

  • Você vai criar uma tag gerenciada pelo IAM chamada http_tags com dois valores, http_server e http_client, no nível da organização. Essas tags/valores serão usados para identificar e aplicar regras de firewall às VMs.

Políticas de firewall:

  • Uma política hierárquica de firewall será criada e associada a folder1. Uma regra nessa política usa as tags gerenciadas pelo IAM para permitir o tráfego de http-client para http-server na porta 80.
  • Uma política de firewall de rede será criada no projeto host e associada à VPC mynet. Essa política vai incluir uma regra para permitir o acesso SSH do IAP às VMs para fins de teste.

4. Etapas de preparação

Primeiro, configure os papéis do IAM, a infraestrutura de rede e as instâncias necessárias na sua organização do Google Cloud.

Papéis do IAM necessários para trabalhar no laboratório

Começamos atribuindo os papéis do IAM necessários à conta do GCP no nível da organização.

  • Administrador da organização (roles/resourcemanager.organizationAdmin): permite gerenciar políticas do IAM e conferir as políticas da organização, pastas e projetos.
  • Administrador de tags(roles/resourcemanager.tagAdmin): permite criar, atualizar e excluir tags seguras.
  • Usuário de Tags (roles/resourcemanager.tagUser): permite acessar a lista de tags seguras e gerenciar as associações delas com os recursos.
  • Papel de administrador da política de firewall da organização do Compute (roles/compute.orgFirewallPolicyAdmin): esse papel oferece controle total das políticas de firewall da organização do Compute Engine.
  • Papel de administrador dos recursos da organização no Compute (roles/compute.orgSecurityResourceAdmin): esse papel oferece controle total das associações de políticas de firewall do Compute Engine à organização ou pasta.
  • Administrador de rede do Compute (roles/compute.networkAdmin): esse papel oferece controle total dos recursos de rede do Compute Engine.
  • Administrador da instância do Compute( Beta) (roles/compute.instanceAdmin): esse papel oferece controle total dos recursos de instância do Compute Engine.
  • Administrador do Logging (roles/logging.admin): esse papel dá acesso a todas as permissões de geração de registros e permissões dependentes.
  • Administrador da conta de serviço (roles/iam.serviceAccountAdmin): permite criar e gerenciar contas de serviço.
  • Administrador do Service Usage (roles/serviceusage.serviceUsageAdmin): esse papel permite ativar, desativar e inspecionar estados de serviço, inspecionar operações, consumir cota e gerar faturamento para o projeto de um consumidor.
  • Administrador de VPC compartilhada do Compute (roles/compute.xpnAdmin): esse papel permite administrar uma rede de VPC compartilhada (XPN).

Criar pastas e projetos

No Cloud Shell, faça o seguinte para criar folder1 e folder2:

gcloud auth login

export org_id=$(gcloud organizations list --format='value(ID)')
export BILLING_ACCOUNT_ID=$(gcloud billing accounts list --format='value(ACCOUNT_ID)')
export folder1=[FOLDER1 NAME]
export folder2=[FOLDER2 NAME]
export hostproject=[HOST PROJECT NAME]
export serviceproject=[SERVICE PROJECT NAME]
export regionname=[REGION NAME]
export zonename=[COMPUTE ZONE NAME]

gcloud resource-manager folders create --display-name=$folder1 --organization=$org_id
export folder1_id=$(gcloud resource-manager folders list --organization=$org_id --filter="displayName=$folder1" --format="value(ID)")
gcloud resource-manager folders create --display-name=$folder2 --organization=$org_id
export folder2_id=$(gcloud resource-manager folders list --organization=$org_id --filter="displayName=$folder2" --format="value(ID)")

No Cloud Shell, faça o seguinte para criar o projeto host em folder1:

gcloud projects create  --name=$hostproject --folder=$folder1_id

Você vai ver o seguinte. Pressione Y para criar o projeto com o novo ID do projeto.

No project ID provided.

Use [NEW-PROJECT-ID] as project ID (Y/n)?

Anote o ID do projeto. No Cloud Shell, faça o seguinte para exportar para hostproject_id:

export hostproject_id=[HOSTPROJECT ID]

No Cloud Shell, faça o seguinte para vincular o projeto host à conta de faturamento:

gcloud billing projects link $hostproject_id \
--billing-account=$BILLING_ACCOUNT_ID

No Cloud Shell, faça o seguinte para criar o projeto de serviço em folder2:

gcloud projects create  --name=$serviceproject --folder=$folder2_id

Você vai ver o seguinte. Pressione Y para criar o projeto com o novo ID do projeto.

No project ID provided.

Use [NEW-PROJECT-ID] as project ID (Y/n)?

Anote o ID do projeto. No Cloud Shell, faça o seguinte para exportar para serviceproject_id:

export serviceproject_id=[SERVICEPROJECT ID]

No Cloud Shell, faça o seguinte para vincular o projeto de serviço à conta de faturamento:

gcloud billing projects link $serviceproject_id \
--billing-account=$BILLING_ACCOUNT_ID

Criar tags gerenciadas pelo IAM

Uma tag é um par de chave-valor que pode ser anexado a uma organização, pasta ou projeto. Consulte Como criar e gerenciar tags e as permissões necessárias para mais detalhes.

Criamos uma tag no nível da organização, http-tags. A finalidade da tag é para uso do Cloud NGFW. Não restringimos o escopo a uma única rede. A tag tem escopo global. Mais tarde, vamos aplicar a tag às VMs criadas no projeto de serviço em folder2.

No Cloud Shell, faça o seguinte:

gcloud resource-manager tags keys create http_tags \
    --parent=organizations/$org_id \
    --purpose GCE_FIREWALL \
    --purpose-data organization=auto

Vamos usar o ID da chave de tag para anotar a VM durante a criação. No Cloud Shell, faça o seguinte para receber o ID da chave de tag:

export http_tags_id=$(gcloud resource-manager tags keys describe $org_id/http_tags --format="value(name)")
echo $http_tags_id

No Cloud Shell, faça o seguinte para criar dois novos valores de tag, http_server e http_client:

 gcloud resource-manager tags values create http_server \
      --parent $org_id/http_tags
 gcloud resource-manager tags values create http_client \
      --parent $org_id/http_tags

Vamos usar o ID da tag e o ID do valor da tag para anotar a VM durante a criação. No Cloud Shell, faça o seguinte para receber o ID do valor da tag de http_server e http_client:

export http_tags_http_server_id=$(gcloud resource-manager tags values describe $org_id/http_tags/http_server --format="value(name)")
echo $http_tags_http_server_id

export http_tags_http_client_id=$(gcloud resource-manager tags values describe $org_id/http_tags/http_client --format="value(name)")
echo $http_tags_http_client_id

Ativar APIs nos projetos host e de serviço

No Cloud Shell, faça o seguinte:

gcloud services enable compute.googleapis.com --project=$serviceproject_id
gcloud services enable compute.googleapis.com --project=$hostproject_id

Criar uma VPC no projeto host

No projeto host, crie uma rede VPC com modo de sub-rede personalizado. Para isso, faça o seguinte no Cloud Shell:

gcloud compute networks create mynet \
    --subnet-mode=custom \
    --project=$hostproject_id

Criar sub-redes no projeto host

No Cloud Shell, faça o seguinte para criar uma sub-rede IPv4:

gcloud compute networks subnets create mysubnet \
    --network=mynet \
    --range=10.0.0.0/28 \
    --region=$regionname \
    --project=$hostproject_id

Ativar a VPC compartilhada no projeto host

No Cloud Shell, faça o seguinte para ativar a VPC compartilhada no projeto host:

gcloud compute shared-vpc enable $hostproject_id

Anexar projeto de serviço para VPC compartilhada no projeto host

No Cloud Shell, faça o seguinte para anexar o projeto de serviço à VPC compartilhada no projeto host:

gcloud compute shared-vpc associated-projects add $serviceproject_id --host-project=$hostproject_id 

Criar o Cloud Router e o Cloud NAT no projeto host

O Cloud NAT é usado para permitir a saída da Internet para que as VMs façam o download e a instalação de aplicativos.

gcloud compute routers create $regionname-cr \
   --network=mynet \
   --region=$regionname \
   --project=$hostproject_id
gcloud compute routers nats create $regionname-nat \
    --router=$regionname-cr \
    --region=$regionname \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips \
    --project=$hostproject_id

Criar instâncias no projeto de serviço

No projeto de serviço, crie duas instâncias nas sub-redes que você acabou de criar na VPC compartilhada no projeto host. Uma instância é chamada de http-server, e anotamos a tag de http_tags com o valor de http_server. A outra instância é chamada de http-client, e anotamos a tag de http_tags com o valor de http_client. Execute os comandos a seguir no Cloud Shell:

gcloud compute instances create http-client \
    --project=$serviceproject_id \
   --subnet=projects/$hostproject_id/regions/$regionname/subnetworks/mysubnet \
    --zone=$zonename \
    --no-address \
    --resource-manager-tags=$http_tags_id=$http_tags_http_client_id

gcloud compute instances create http-server \
    --project=$serviceproject_id \
    --subnet=projects/$hostproject_id/regions/$regionname/subnetworks/mysubnet \
    --zone=$zonename \
    --no-address \
    --resource-manager-tags=$http_tags_id=$http_tags_http_server_id \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    a2enmod ssl
    sudo a2ensite default-ssl
    echo "I am a Http Server." | \
    tee /var/www/html/index.html
    systemctl restart apache2'

Anote o IP interno de http-server. Vamos usá-lo na etapa de teste da regra de firewall mais adiante.

export http_server_ip=$(gcloud compute instances describe http-server --zone $zonename --format='value(networkInterfaces[0].networkIP)' --project $serviceproject_id)
echo $http_server_ip

5. Criar uma política de firewall de rede global no projeto host

Vamos criar uma política de firewall de rede global no projeto host e associá-la à VPC compartilhada no projeto host.

gcloud config set project $hostproject_id
gcloud compute network-firewall-policies create  mynet-fw-policy \
--global \
--project=$hostproject_id
gcloud compute network-firewall-policies associations create \
    --firewall-policy=mynet-fw-policy \
    --network=mynet \
    --name=mynet-fw-policy \
    --global-firewall-policy \
    --project=$hostproject_id

Para permitir que o IAP se conecte às suas instâncias de VM, crie uma regra de firewall na política de firewall de rede:

  • Aplica-se a todas as instâncias de VM que você quer acessar usando o IAP.
  • Permite o tráfego de entrada do intervalo de IP 35.235.240.0/20. Esse intervalo contém todos os endereços IP que o IAP usa para o encaminhamento de TCP.
gcloud compute network-firewall-policies rules create 1000 \
    --action=ALLOW \
    --firewall-policy=mynet-fw-policy \
    --description="mynet-allow-iap" \
    --direction=INGRESS \
    --src-ip-ranges=35.235.240.0/20 \
    --layer4-configs=tcp:22  \
    --global-firewall-policy \
    --project=$hostproject_id

No console, acesse o projeto host e encontre a política de firewall de rede global recém-criada em "Política de firewall". É possível verificar a regra de firewall recém-criada na política de firewall de rede. Este é o link do console para acessar a página. Mude o seletor de projeto para o projeto host no console.

6. Testar o acesso da VM http-client à VM http-server

Faça SSH na VM chamada http-client e teste se ela pode acessar http-server na porta HTTP 80.

No Cloud Shell, faça o seguinte:

gcloud compute ssh \
    --zone=$zonename "http-client" \
    --tunnel-through-iap \
    --project=$serviceproject_id

Use curl para acessar o servidor da Web.

curl -m 10 [http_server_ip]

Você vai ver o resultado do comando curl. Não há regra de firewall de entrada para permitir a porta 80 para http-server.

A conexão expirou após 10.000 milissegundos.

Saia da sessão SSH para voltar ao Cloud Shell.

exit

7. Criar políticas e regras de firewall hierárquicas

Vamos criar uma política hierárquica de firewall em folder1 e associar a política a folder1. As regras de firewall na política serão aplicadas ao projeto host em folder1.

Criar política de firewall hierárquica

gcloud compute firewall-policies create \
  --folder=$folder1_id \
  --short-name=my-folder1-fw-policy

Criar regra de firewall na política de firewall hierárquica

A regra permite que VMs com um valor de tag http_tags/http_client acessem VMs com um valor de tag http_tags/http_server na porta TCP 80.

gcloud compute firewall-policies rules create 100 \
  --organization=$org_id \
  --firewall-policy my-folder1-fw-policy \
  --direction=INGRESS \
  --layer4-configs=tcp:80 \
  --action=allow \
  --src-secure-tags=$org_id/http_tags/http_client \
  --target-secure-tags=$org_id/http_tags/http_server \
  --description=folder1-allow-http

Associe a política de firewall hierárquica à pasta1

gcloud compute firewall-policies associations create \
   --firewall-policy=my-folder1-fw-policy \
   --folder=$folder1_id \
   --name=my-folder1-fw-policy\
   --organization=$org_id

No console, acesse o folder1 e encontre a política de firewall hierárquica recém-criada em "Política de firewall". A política de firewall é mostrada em "Políticas de firewall localizadas nesta pasta". É possível verificar a regra de firewall recém-criada na política de firewall hierárquica. Este é o link do console para acessar a página. Mude o seletor de projetos para folder1 no console.

8. Testar o acesso da VM http-client à VM http-server

Verifique as políticas de firewall efetivas aplicadas à VPC compartilhada no projeto host.

No Cloud Shell, faça o seguinte:

gcloud compute networks get-effective-firewalls mynet --project=$hostproject_id

A política hierárquica de firewall herdada vai aparecer assim:

TYPE: org-firewall
FIREWALL_POLICY_NAME: <NUMBER_FOR_YOUR_FW_POLICY>
FIREWALL_POLICY_PRIORITY: 
PRIORITY: 100
ACTION: ALLOW
DIRECTION: INGRESS
DISABLED: False
IP_RANGES:

You will see the network firewall policy to the VPC like this:
TYPE: network-firewall-policy
FIREWALL_POLICY_NAME: mynet-fw-policy
FIREWALL_POLICY_PRIORITY: 1000
PRIORITY: 1000
ACTION: ALLOW
DIRECTION: INGRESS
DISABLED: False
IP_RANGES: 35.235.240.0/20

Faça SSH na VM chamada http-client e teste se ela pode acessar http-server na porta HTTP 80.

No Cloud Shell, faça o seguinte:

gcloud compute ssh \
    --zone=$zonename "http-client" \
    --tunnel-through-iap \
    --project=$serviceproject_id

Use curl para acessar o servidor da Web.

curl [http_server_ip]

O comando curl vai retornar uma resposta de http-server.

I am a Http Server.

A regra de firewall de entrada da política de firewall hierárquica permite o acesso de http-client a http-server na porta 80.

Saia da sessão SSH para voltar ao Cloud Shell.

exit

9. Limpar

Limpar as VMs no projeto de serviço

No Cloud Shell, faça o seguinte:

gcloud compute instances delete http-server --zone $zonename --project=$serviceproject_id
gcloud compute instances delete http-client --zone $zonename --project=$serviceproject_id

Limpar a política de firewall hierárquica

No Cloud Shell, faça o seguinte:

gcloud compute firewall-policies associations delete my-folder1-fw-policy \
   --firewall-policy=my-folder1-fw-policy \
   --organization=$org_id
gcloud compute firewall-policies rules delete 100 \
  --organization=$org_id \
  --firewall-policy=my-folder1-fw-policy
gcloud compute firewall-policies delete my-folder1-fw-policy \
  --organization=$org_id

Limpar tags no nível da organização

No Cloud Shell, faça o seguinte:

gcloud resource-manager tags values delete $http_tags_http_server_id
gcloud resource-manager tags values delete $http_tags_http_client_id
gcloud resource-manager tags keys delete $http_tags_id

Limpar o projeto host

No Cloud Shell, faça o seguinte:

gcloud compute shared-vpc associated-projects remove $serviceproject_id --host-project=$hostproject_id 
gcloud compute shared-vpc disable $hostproject_id
gcloud projects delete $hostproject_id

Limpar o projeto de serviço

No Cloud Shell, faça o seguinte:

gcloud projects delete $serviceproject_id

Limpar pastas

No Cloud Shell, faça o seguinte:

gcloud resource-manager folders delete $folder1_id
gcloud resource-manager folders delete $folder2_id

10. Parabéns

Você testou com sucesso a política de firewall hierárquica com tags gerenciadas pelo IAM.