Política de firewall jerárquica con etiquetas controladas por IAM

1. Introducción

Cloud Next Generation Firewall (NGFW)

Cloud Next Generation Firewall es un servicio de firewall completamente distribuido con capacidades de protección avanzada, microsegmentación y cobertura generalizada para proteger tus cargas de trabajo de Google Cloud de los ataques internos y externos.

La NGFW de Cloud tiene los siguientes beneficios:

  • Servicio de firewall distribuido: Cloud NGFW proporciona una aplicación con estado basada en el host completamente distribuida en cada carga de trabajo para habilitar una arquitectura de seguridad de confianza cero.
  • Implementación y configuración simplificadas: Cloud NGFW implementa políticas de firewall jerárquicas y de red que se pueden adjuntar a un nodo de jerarquía de recursos. Estas políticas proporcionan una experiencia de firewall coherente en toda la jerarquía de recursos de Google Cloud.
  • Control detallado y microsegmentación: La combinación de políticas de firewall y etiquetas administradas por Identity and Access Management (IAM) proporciona un control detallado para el tráfico norte-sur y este-oeste, hasta una sola VM, en redes de nube privada virtual (VPC).

Políticas de firewall de red

La política de firewall de red actúa como un contenedor para las reglas de firewall. Las reglas definidas en una política de firewall de red no se aplican en ningún lugar hasta que la política se asocia con una red de VPC. Cada red de VPC puede tener una política de firewall de red asociada. Las políticas de firewall de red admiten etiquetas controladas por IAM (o solo etiquetas) en las reglas de firewall y se pueden usar para proporcionar identidad a la carga de trabajo.

Compartir una política de firewall de red en varias redes y la integración con etiquetas controladas por IAM simplifica en gran medida la configuración y administración de firewalls.

Con la introducción de la política de firewall de red, las políticas de firewall de Google Cloud ahora constan de los siguientes componentes:

  1. Política de firewall jerárquica
  2. Reglas de firewall de VPC
  3. Política de firewall de red global y política de firewall de red regional

Las políticas de firewall jerárquicas se admiten en los nodos de organización y carpeta dentro de la jerarquía de recursos, mientras que las reglas de firewall de VPC y las políticas de firewall de red se aplican a nivel de la VPC. Una gran diferencia entre las reglas de firewall de VPC y las políticas de firewall de red es que las primeras solo se pueden aplicar a una sola red de VPC, mientras que las políticas se pueden adjuntar a una sola VPC o a un grupo de VPC, entre otros beneficios como las actualizaciones por lotes.

En este lab, probaremos la política de firewall jerárquica y la política de firewall de red global.

Por último, también tenemos las reglas de firewall implícitas que se incluyen con cada red de VPC:

  • Una regla de salida cuya acción es permitir y el destino es 0.0.0.0/0
  • Una regla de entrada cuya acción es deny y el origen es 0.0.0.0/0

De forma predeterminada, la secuencia de aplicación se muestra en el siguiente diagrama:

86df8f0d19c64e80.png

Etiquetas administradas por IAM

Las nuevas etiquetas integradas en las reglas de políticas de firewall son recursos de pares clave-valor definidos a nivel de la organización o del proyecto en la jerarquía de recursos de Google Cloud. Una etiqueta de este tipo contiene un control de acceso de IAM que especifica quién puede hacer qué en la etiqueta. Por ejemplo, los permisos de IAM permiten especificar qué cuentas principales pueden asignar valores a las etiquetas y cuáles pueden adjuntar etiquetas a los recursos. Una vez que se aplica una etiqueta a un recurso, las reglas de la política de firewall pueden usarla para permitir y denegar el tráfico.

Las etiquetas de política se adhieren al modelo de recursos de herencia de Google Cloud, lo que significa que las etiquetas y sus valores se transmiten a través de la jerarquía desde sus elementos superiores. Como resultado, las etiquetas pueden crearse en un lugar y usarse en otras carpetas y proyectos en toda la jerarquía de recursos. Visita esta página para obtener más detalles sobre las etiquetas y la restricción de acceso.

Las etiquetas no se deben confundir con las etiquetas de red, que son cadenas que se pueden agregar a las instancias de Compute Engine, se asocian con la instancia y desaparecen cuando se retira la instancia. Las reglas de firewall de VPC pueden incluir etiquetas de red, pero como no se consideran recursos de la nube, no están sujetas al control de acceso de IAM. Visita esta página para conocer los detalles de la diferencia.

2. Qué aprenderás

  • Cómo crear etiquetas controladas por IAM para usar con Cloud NGFW y con alcance global
  • Cómo adjuntar etiquetas a las VMs
  • Cómo crear una política de firewall jerárquica y asociarla a una carpeta
  • Cómo crear una regla de firewall en la política de firewall jerárquica y especificar el origen y el destino con etiquetas controladas por IAM

3. Arquitectura general del lab

1bfe78ad755496e5.png

Organización y carpetas:

  • Crearás dos carpetas, folder1 y folder2, directamente debajo de tu organización.

Proyectos:

  • Dentro de folder1, crearás un proyecto host. Este proyecto contendrá la red de VPC compartida.
  • Dentro de folder2, crearás un proyecto de servicio. Este proyecto contendrá las VMs que usan la VPC compartida.

Establecimiento de contactos:

  • Se creará una red de VPC llamada mynet en el proyecto host y se configurará como una VPC compartida. Esto permite que los recursos del proyecto de servicio usen la red.
  • Se crearán dos VMs en el proyecto de servicio y se conectarán a la VPC compartida mynet.

Etiquetas administradas por IAM:

  • Crearás una etiqueta regida por IAM llamada http_tags con dos valores, llamados http_server y http_client, a nivel de la organización. Estos valores y etiquetas se usarán para identificar y aplicar reglas de firewall a las VMs.

Políticas de firewall:

  • Se creará una política de firewall jerárquica y se asociará con folder1. Una regla dentro de esta política usará las etiquetas controladas por IAM para permitir el tráfico de http-client a http-server en el puerto 80.
  • Se creará una política de firewall de red en el proyecto host y se asociará con la VPC de mynet. Esta política incluirá una regla para permitir el acceso SSH de IAP a las VMs con fines de prueba.

4. Pasos de preparación

Primero, configura los roles de IAM, la infraestructura de red y las instancias necesarios en tu organización de Google Cloud.

Roles de IAM necesarios para trabajar en el lab

Comenzaremos por asignar los roles de IAM necesarios a la cuenta de GCP a nivel de la organización.

  • Administrador de la organización (roles/resourcemanager.organizationAdmin): Este rol te permite administrar las políticas de IAM y ver las políticas de la organización de carpetas, proyectos y organizaciones.
  • Administrador de etiquetas(roles/resourcemanager.tagAdmin): Este rol te permite crear, actualizar y borrar etiquetas seguras.
  • Rol de usuario de etiquetas (roles/resourcemanager.tagUser): Este rol te permite acceder a la lista de etiquetas seguras y administrar sus asociaciones con los recursos.
  • Rol de administrador de la política de firewall de Compute para la organización (roles/compute.orgFirewallPolicyAdmin): Este rol te otorga control total sobre las políticas de firewall de Compute Engine para la organización.
  • Rol de administrador de recursos de Compute en la organización (roles/compute.orgSecurityResourceAdmin): Este rol te otorga control total sobre las asociaciones de la política de firewall de Compute Engine con la organización o la carpeta.
  • Administrador de red de Compute (roles/compute.networkAdmin): Este rol te otorga control total sobre los recursos de redes de Compute Engine.
  • Administrador de instancias de Compute( beta) (roles/compute.instanceAdmin): Este rol te otorga control total de los recursos de instancias de Compute Engine.
  • Administrador de Logging (roles/logging.admin): Este rol te otorga acceso a todos los permisos de registro y a los permisos dependientes.
  • Administrador de cuenta de servicio (roles/iam.serviceAccountAdmin): Este rol te permite crear y administrar cuentas de servicio.
  • Administrador de Service Usage (roles/serviceusage.serviceUsageAdmin): Este rol te permite habilitar, inhabilitar e inspeccionar estados de servicio, inspeccionar operaciones y consumir cuota y facturación para un proyecto de consumo.
  • Administrador de VPC compartida de Compute (roles/compute.xpnAdmin): Este rol te permite administrar una red de VPC compartida (XPN).

Crea carpetas y proyectos

Dentro de Cloud Shell, realiza las siguientes acciones para crear folder1 y folder2:

gcloud auth login

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

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

En Cloud Shell, haz lo siguiente para crear el proyecto host en folder1:

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

Verás lo siguiente. Presiona Y para crear el proyecto con el nuevo ID.

No project ID provided.

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

Toma nota del ID del proyecto. En Cloud Shell, haz lo siguiente para exportarlo a hostproject_id:

export hostproject_id=[HOSTPROJECT ID]

En Cloud Shell, realiza las siguientes acciones para vincular el proyecto host a la cuenta de facturación:

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

En Cloud Shell, realiza las siguientes acciones para crear el proyecto de servicio en folder2:

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

Verás lo siguiente. Presiona Y para crear el proyecto con el nuevo ID.

No project ID provided.

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

Toma nota del ID del proyecto. En Cloud Shell, realiza las siguientes acciones para exportarlo a serviceproject_id:

export serviceproject_id=[SERVICEPROJECT ID]

En Cloud Shell, realiza las siguientes acciones para vincular el proyecto de servicio a la cuenta de facturación:

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

Crea etiquetas administradas por IAM

Una etiqueta es un par clave-valor que se puede adjuntar a una organización, una carpeta o un proyecto. Consulta Crea y administra etiquetas y los permisos necesarios para obtener más detalles.

Creamos una etiqueta a nivel de la organización, http-tags. El propósito de la etiqueta es para el uso de Cloud NGFW. No restringimos el alcance a una sola red, ya que la etiqueta tiene un alcance global. Más adelante, aplicaremos la etiqueta a las VMs creadas en el proyecto de servicio en folder2.

Dentro de Cloud Shell, haz lo siguiente:

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

Usaremos el ID de la clave de la etiqueta para anotar la VM durante la creación. En Cloud Shell, haz lo siguiente para obtener el ID de la clave de la etiqueta:

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

En Cloud Shell, realiza las siguientes acciones para crear dos valores de etiqueta nuevos, http_server y http_client:

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

Usaremos el ID de la etiqueta y el ID del valor de la etiqueta para anotar la VM durante la creación. En Cloud Shell, realiza las siguientes acciones para obtener el ID del valor de la etiqueta de http_server y http_client:

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

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

Habilita las APIs en el proyecto host y el proyecto de servicio

Dentro de Cloud Shell, haz lo siguiente:

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

Crea una VPC en el proyecto host

En el proyecto host, crea una red de VPC con el modo de subred personalizado. Para ello, realiza las siguientes acciones en Cloud Shell:

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

Crea subredes en el proyecto host

Dentro de Cloud Shell, realiza las siguientes acciones para crear una subred IPv4:

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

Habilita la VPC compartida en el proyecto host

En Cloud Shell, realiza las siguientes acciones para habilitar la VPC compartida en el proyecto host:

gcloud compute shared-vpc enable $hostproject_id

Adjunta un proyecto de servicio para la VPC compartida en el proyecto host

En Cloud Shell, realiza las siguientes acciones para adjuntar el proyecto de servicio a la VPC compartida en el proyecto host:

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

Crea Cloud Router y Cloud NAT en el proyecto host

Cloud NAT se usa para permitir la salida a Internet de las VMs para descargar e instalar aplicaciones.

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

Crea instancias en el proyecto de servicio

En el proyecto de servicio, crea dos instancias en las subredes que acabas de crear en la VPC compartida del proyecto host. Una instancia se llama http-server y anotamos la etiqueta de http_tags con el valor de http_server. La otra instancia se llama http-client y anotamos la etiqueta de http_tags con el valor de http_client. Ejecuta los siguientes comandos en Cloud Shell:

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

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

Anota la IP interna de http-server. La usaremos en el paso posterior de prueba de la regla de firewall.

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

5. Crea una política de firewall de red global en el proyecto host

Crearemos una política de firewall de red global en el proyecto host y la asociaremos a la VPC compartida en el proyecto host.

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

Para permitir que IAP se conecte a tus instancias de VM, crea una regla de firewall en la política de firewall de red:

  • Se aplica a todas las instancias de VM a las que deseas acceder mediante IAP.
  • Permite el tráfico de entrada desde el rango de IP 35.235.240.0/20. Este rango contiene todas las direcciones IP que IAP usa para el reenvío de TCP.
gcloud compute network-firewall-policies rules create 1000 \
    --action=ALLOW \
    --firewall-policy=mynet-fw-policy \
    --description="mynet-allow-iap" \
    --direction=INGRESS \
    --src-ip-ranges=35.235.240.0/20 \
    --layer4-configs=tcp:22  \
    --global-firewall-policy \
    --project=$hostproject_id

En la consola, puedes ir al proyecto host y buscar la política de firewall de red global recién creada en Política de firewall. Puedes verificar la regla de firewall recién creada en la política de firewall de red. Este es el vínculo a la consola para que llegues allí. Asegúrate de cambiar el selector de proyectos al proyecto host en la consola.

6. Prueba el acceso desde la VM de cliente http a la VM de servidor http

Establece una conexión SSH a la VM llamada http-client y prueba si puede acceder a http-server en el puerto HTTP 80.

Dentro de Cloud Shell, haz lo siguiente:

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

Usa curl para acceder al servidor web.

curl -m 10 [http_server_ip]

Verás el resultado del comando curl. No hay una regla de firewall de entrada que permita el puerto 80 para http-server.

Se agotó el tiempo de espera de la conexión después de 10,000 milisegundos.

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

exit

7. Crea una política de firewall jerárquica y reglas de firewall

Crearemos una política de firewall jerárquica en folder1 y la asociaremos a folder1. Las reglas de firewall de la política se aplicarán al proyecto host en folder1.

Crea una política jerárquica de firewall

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

Crea una regla de firewall en la política de firewall jerárquica

La regla permite que las VMs con un valor de etiqueta de http_tags/http_client accedan a las VMs con un valor de etiqueta de http_tags/http_server en el puerto TCP 80.

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

Asocia la política de firewall jerárquica con folder1

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

En la consola, puedes ir a folder1 y encontrar la política de firewall jerárquica recién creada en Política de firewall. La política de firewall se muestra en "Políticas de firewall ubicadas en esta carpeta". Puedes verificar la regla de firewall recién creada en la política de firewall jerárquica. Este es el vínculo a la consola para que llegues allí. Asegúrate de cambiar el selector de proyectos a folder1 en la consola.

8. Prueba el acceso desde la VM de cliente http a la VM de servidor http

Verifica las políticas de firewall vigentes que se aplican a la VPC compartida en el proyecto host.

Dentro de Cloud Shell, haz lo siguiente:

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

Verás la política de firewall jerárquica heredada de la siguiente manera:

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

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

Establece una conexión SSH a la VM llamada http-client y prueba si puede acceder a http-server en el puerto HTTP 80.

Dentro de Cloud Shell, haz lo siguiente:

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

Usa curl para acceder al servidor web.

curl [http_server_ip]

Verás que el comando curl devuelve correctamente la respuesta de http-server.

I am a Http Server.

La regla de firewall de entrada de la política de firewall jerárquica permite el acceso de http-client a http-server en el puerto 80.

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

exit

9. Limpia

Limpia las VMs en el proyecto de servicio

Dentro de Cloud Shell, haz lo siguiente:

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

Cómo limpiar la política de firewall jerárquica

Dentro de Cloud Shell, haz lo siguiente:

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

Cómo limpiar las etiquetas a nivel de la organización

Dentro de Cloud Shell, haz lo siguiente:

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

Limpia el proyecto host

Dentro de Cloud Shell, haz lo siguiente:

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

Limpia el proyecto de servicio

Dentro de Cloud Shell, haz lo siguiente:

gcloud projects delete $serviceproject_id

Cómo limpiar carpetas

Dentro de Cloud Shell, haz lo siguiente:

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

10. Felicitaciones

Probaste correctamente la política de firewall jerárquica con etiquetas controladas por IAM.