Usa los Controles del servicio de VPC

Controles del servicio de VPC es una función de Google Cloud que te permite configurar un perímetro seguro para protegerte del robo de datos. En esta guía, se muestra cómo usar los Controles del servicio de VPC con Cloud Functions para agregar seguridad adicional a tus funciones.

Para obtener más información sobre las limitaciones conocidas de esta integración, consulta la documentación de Controles del servicio de VPC.

Configuración a nivel de la organización

Para usar los Controles del servicio de VPC con Cloud Functions, debes configurar un perímetro de servicio y políticas de la organización, lo que se hace a nivel de la organización. Esta configuración garantiza que se aplicarán las verificaciones de los Controles del servicio de VPC cuando se use Cloud Functions y que los desarrolladores solo podrán implementar funciones que cumplan con los Controles del servicio de VPC.

Configura un perímetro de Controles del servicio de VPC

Para configurar un perímetro de servicio, necesitas las funciones de visualizador de la organización (roles/resourcemanager.organizationViewer) y editor de Access Context Manager (roles/accesscontextmanager.policyEditor).

Sigue la Guía de inicio rápido de los Controles del servicio de VPC para realizar lo siguiente:

  1. Crear un perímetro de servicio
  2. Agregar uno o más proyectos al perímetro

  3. Restringir la API de Cloud Functions

Después de configurar el perímetro de servicio, se verificarán todas las llamadas a la API de Cloud Functions para garantizar que se originen en su interior.

Opcional: Habilita el acceso al perímetro para máquinas de desarrollo

Las verificaciones de los Controles del servicio de VPC se aplican a la API de Cloud Functions, por lo que las llamadas a esta fallan si no se originan en el perímetro de servicio. Por lo tanto, para administrar funciones con la API de Cloud Functions, la IU de Cloud Functions en Cloud Console o la herramienta de línea de comandos de gcloud, elige una de las siguientes opciones:

  • Usa una máquina que esté dentro del perímetro de los Controles del servicio de VPC. Por ejemplo, puedes usar una VM de Compute Engine o una máquina local conectada a tu red de VPC mediante VPN.

  • Otorga acceso al perímetro a los desarrolladores de funciones. Por ejemplo, puedes crear niveles de acceso que habiliten el acceso al perímetro según la dirección IP o la identidad de usuario. Para obtener más información, consulta Permite el acceso a recursos protegidos desde fuera de un perímetro.

Configura las políticas de la organización

Para administrar las políticas de la organización, necesitas la función de administrador de políticas de la organización (roles/orgpolicy.policyAdmin).

Para cumplir con los Controles del servicio de VPC y protegerte contra el robo de datos, configura las siguientes políticas de la organización que controlan la configuración de red permitida para Cloud Functions en el perímetro de servicio.

Restringe la configuración de entrada permitida

En la política de la organización cloudfunctions.allowedIngressSettings, se definen las opciones de configuración de entrada que pueden usar los desarrolladores para Cloud Functions. Establece esta política de la organización para exigir que los desarrolladores usen el valor ALLOW_INTERNAL_ONLY:

Console

  1. Ve a la página de la política Configuración de entrada permitida en Cloud Console:

    Ir a la política de la organización

  2. Haz clic en Editar.

  3. En la página Editar, selecciona Personalizar.

  4. En Aplicación de la política, selecciona Reemplazar.

  5. En Valores de la política, selecciona Personalizar.

  6. En Tipo de política, selecciona Permitir.

  7. En Valores personalizados, ingresa ALLOW_INTERNAL_ONLY.

  8. Haz clic en Guardar.

gcloud

Usa el comando gcloud beta resource-manager org-policies allow:

gcloud beta resource-manager org-policies allow \
  cloudfunctions.allowedIngressSettings ALLOW_INTERNAL_ONLY \
  --organization ORGANIZATION_ID

En el ejemplo anterior, ORGANIZATION_ID es el ID de la organización.

Después de implementar esta política de la organización, todas las funciones deberán usar el valor ALLOW_INTERNAL_ONLY en su configuración de entrada. Esto significa que las funciones de HTTP solo pueden aceptar tráfico proveniente de una red de VPC que esté dentro del perímetro de servicio. Las implementaciones de funciones en las que se especifique un valor diferente fallarán.

Exige un conector de VPC

En la política de la organización cloudfunctions.requireVPCConnector, se define si las funciones necesitan o no un conector de Acceso a VPC sin servidores. Haz lo siguiente para establecer esta política de la organización y aplicar la restricción:

Console

  1. Ve a la página de la política Exigir conector de VPC en Cloud Console:

    Ir a la política de la organización

  2. Haz clic en Editar.

  3. En la página Editar, selecciona Personalizar.

  4. En Aplicación, selecciona Activado.

  5. Haz clic en Guardar.

gcloud

Usa el comando gcloud beta resource-manager org-policies enable-enforce:

gcloud beta resource-manager org-policies enable-enforce \
  cloudfunctions.requireVPCConnector \
  --organization ORGANIZATION_ID

En el ejemplo anterior, ORGANIZATION_ID es el ID de la organización.

Después de implementar esta política de la organización, todas las funciones deberán usar un conector de Acceso a VPC sin servidores. Las implementaciones de funciones en las que no se especifique un conector fallarán.

Restringe la configuración de salida permitida del conector de VPC

En la política de la organización cloudfunctions.allowedVpcConnectorEgressSettings, se definen las opciones de configuración de salida que pueden usar los desarrolladores para Cloud Functions. Haz lo siguiente para establecer esta política de la organización y permitir solo el valor ALL_TRAFFIC:

Console

  1. Ve a la página de la política Configuración de salida permitida del conector de VPC en Cloud Console:

    Ir a la política de la organización

  2. Haz clic en Editar.

  3. En la página Editar, selecciona Personalizar.

  4. En Aplicación de la política, selecciona Reemplazar.

  5. En Valores de la política, selecciona Personalizar.

  6. En Tipo de política, selecciona Permitir.

  7. En Valores personalizados, ingresa ALL_TRAFFIC.

  8. Haz clic en Guardar.

gcloud

Usa el comando gcloud beta resource-manager org-policies allow:

gcloud beta resource-manager org-policies allow \
  cloudfunctions.allowedVpcConnectorEgressSettings ALL_TRAFFIC \
  --organization ORGANIZATION_ID

En el ejemplo anterior, ORGANIZATION_ID es el ID de la organización.

Después de implementar esta política de la organización, todas las funciones deberán usar el valor ALL_TRAFFIC en su configuración de salida. Esto significa que las funciones deben enrutar todo el tráfico de salida por tu red de VPC. Las implementaciones de funciones en las que se especifique un valor diferente fallarán.

Configuración a nivel de proyecto

Para usar los Controles del servicio de VPC en proyectos individuales que están dentro del perímetro de servicio, debes realizar una configuración adicional.

Configura redes de VPC

Para acceder a los servicios y las API de Google, y mitigar los riesgos de robo de datos, las solicitudes deben enviarse al rango de IP virtual (VIP) restringido 199.36.153.4/30 (restricted.googleapis.com).

Sigue estos pasos para bloquear el tráfico de salida de cada red de VPC en un proyecto, excepto el que se dirige al rango VIP restringido:

  1. Configura las reglas de firewall para evitar que los datos abandonen la red de VPC:

    • Crea una regla de rechazo de salida que bloquee todo el tráfico saliente.

    • Crea una regla de autorización de salida que permita el tráfico hacia 199.36.153.4/30 en el puerto TCP 443. Asegúrate de que tenga prioridad antes de la regla de rechazo de salida que acabas de crear. Esto permite la salida solo al rango VIP restringido.

  2. Configura el DNS para establecer *.googleapis.com como restricted.googleapis.com.

  3. Configura el DNS con un registro A que asigne cloudfunctions.net al rango de IP 199.36.153.4/30. Puedes hacer esto con Cloud DNS:

    gcloud dns managed-zones create ZONE_NAME \
    --visibility=private \
    --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/default \
    --description=none \
    --dns-name=cloudfunctions.net
    
    gcloud dns record-sets transaction start --zone=ZONE_NAME
    
    gcloud dns record-sets transaction add --name=*.cloudfunctions.net. \
    --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
    --zone=ZONE_NAME \
    --ttl=300
    
    gcloud dns record-sets transaction execute --zone=ZONE_NAME
    

En este punto, puede suceder lo siguiente con las solicitudes que se originan en la red de VPC:

  • Las solicitudes no pueden salir de la red de VPC, lo que impide la salida fuera del perímetro del servicio.
  • Las solicitudes pueden llegar a las API y los servicios de Google que cumplen con los Controles del servicio de VPC, lo que evita el robo mediante las API de Google.

Otorga acceso a la cuenta de servicio de Cloud Build al perímetro de los Controles del servicio de VPC

Cloud Functions usa Cloud Build para compilar tu código fuente en un contenedor ejecutable. A fin de usar Cloud Functions con los Controles del servicio de VPC, debes configurar la cuenta de servicio de Cloud Build a fin de que tenga acceso al perímetro de servicio. Para ello, sigue estos pasos:

Busca el nombre de la cuenta de servicio

Node 8 o 10 y Go 1.11

Debido a que la compilación se ejecuta en el proyecto de usuario, debes usar la siguiente solución alternativa:

  1. Implementa una función en tu proyecto. Usa la configuración predeterminada en Google Cloud Console:

    Crear función

  2. Espera a que la implementación falle y, luego, en la lista, haz clic en el nombre de la función para ir a la página Detalles de la función.

  3. Consulta el mensaje de error de implementación, que comienza con Build failed: Unable to build your function due to VPC Service Controls. El mensaje de error contiene una dirección de correo electrónico, que es el nombre de la cuenta de servicio.

También puedes usar una secuencia de comandos como la siguiente para encontrar la dirección de la cuenta de servicio desde la línea de comandos:

#!/bin/bash

REGION="us-central1" # Your region
CONNECTOR_NAME="test-connector" # Your VPC connector name

# Deploy and delete an HTTP-triggered function
gcloud functions deploy FUNCTION_NAME --trigger-http --runtime nodejs8 --region $REGION --ingress-settings=internal-only --egress-settings=all --vpc-connector $CONNECTOR_NAME -q
gcloud functions delete FUNCTION_NAME --region $REGION -q

# Search log entries for Cloud Build failures
LOG_ENTRIES=$(gcloud logging read "resource.type=\"audited_resource\" AND protoPayload.serviceName=\"containerregistry.googleapis.com\"" --freshness=10m)
SERVICE_ACCTS=$(echo "$LOG_ENTRIES" | grep -oE "\d+@\w+.gserviceaccount.com" | sort | uniq)

# Print out service account IDs
echo "$SERVICE_ACCTS"

En el ejemplo anterior, FUNCTION_NAME puede ser cualquier función de HTTP, como una función Hello World sencilla.

Otros entornos de ejecución

  1. Si usas Java 11, Python 3.7 o 3.8, o Go 1.13, usa la página de IAM en Google Cloud Console para encontrar la cuenta de servicio de Cloud Build.

    Abrir IAM

  2. Asegúrate de que se muestre el proyecto correcto en el menú desplegable del proyecto.

  3. Busca cloudbuild.gserviceaccount.com. La dirección de correo electrónico con el formato my-project-number@cloudbuild.gserviceaccount.com es el nombre de la cuenta de servicio.

Otorga acceso a la cuenta de servicio al perímetro de servicio

Una vez que tengas el nombre de la cuenta de servicio, sigue la guía en Limita el acceso por usuario o cuenta de servicio para crear un nivel de acceso. Para agregar el nivel de acceso a tu perímetro de servicio, consulta Agrega un nivel de acceso a un perímetro existente.

Después de otorgar acceso a la cuenta de servicio de Cloud Build al perímetro de servicio de los Controles del servicio de VPC, las implementaciones de funciones se realizarán de forma correcta.

Implementa funciones que cumplan con los Controles del servicio de VPC

Después de configurar los Controles del servicio de VPC para Cloud Functions, tendrás que asegurarte de que todas las funciones implementadas dentro del perímetro de servicio cumplan con las políticas de la organización especificadas. Esto significa lo siguiente:

  • Todas las funciones deben usar un conector de Acceso a VPC sin servidores. Consulta Conéctate a una red de VPC para obtener más información.
  • Todas las funciones deben permitir tráfico solo desde fuentes internas. Consulta la documentación sobre la configuración de entrada para obtener más información.
  • Todas las funciones deben enrutar todo el tráfico de salida a través de la red de VPC. Consulta la configuración de salida para obtener más información.

Las implementaciones de funciones que no cumplan con los criterios anteriores tendrán errores.

Audita las funciones existentes para garantizar que cumplan con los Controles del servicio de VPC

Después de configurar los Controles del servicio de VPC, se verificará de manera automática si las funciones nuevas creadas en los proyectos que están en el perímetro de servicio cumplen con estos controles. Sin embargo, para evitar la interrupción de las cargas de trabajo existentes, las funciones establecidas seguirán operando y es posible que no cumplan con las políticas de la organización.

Te recomendamos que audites las funciones existentes y que actualices o vuelvas a implementar las funciones según sea necesario. Si quieres facilitar este proceso, puedes crear una secuencia de comandos que use la API de Cloud Functions para enumerar tus funciones y destacar aquellas que no especifiquen la configuración de red adecuada.