1. Introducción
Los Controles del servicio de VPC (VPC-SC) son un control de seguridad a nivel de la organización en Google Cloud que permite a los clientes empresariales mitigar los riesgos de robo de datos. Los Controles del servicio de VPC proporcionan un estilo de acceso de confianza cero a los servicios de múltiples usuarios, ya que permiten que los clientes restrinjan el acceso a las IPs autorizadas, al contexto del cliente y a los parámetros del dispositivo cuando se conectan a servicios de múltiples usuarios desde Internet y otros servicios para reducir las pérdidas intencionales y no intencionales. Como vimos en el Instructivo básico I de los Controles del servicio de VPC, puedes usar los Controles del servicio de VPC para crear perímetros que protejan los recursos y datos de los servicios que especifiques de forma explícita.
Los objetivos de este instructivo son los siguientes:
- Comprender los conceptos básicos de los Controles del servicio de VPC
- Actualiza un perímetro de servicio y pruébalo con el modo de ejecución de prueba
- Protege dos servicios con los Controles del servicio de VPC
- Soluciona problemas relacionados con un incumplimiento de salida de los Controles del servicio de VPC mientras se muestra un objeto de Cloud Storage
2. Configuración y requisitos
Para este instructivo, necesitamos los siguientes requisitos previos:
- Organización de GCP.
- Es una carpeta dentro de la organización.
- 2 proyectos de GCP dentro de la misma organización colocados en la carpeta
- Los permisos obligatorios a nivel de la organización
- Cuenta de facturación para ambos proyectos
- Tutorial básico I sobre los Controles del servicio de VPC: Configuración de los Controles del servicio de VPC y Access Context Manager

Resources-setup
- Configura los recursos como se describe en la sección "Configuración de recursos" del Instructivo básico I de los Controles del servicio de VPC.
- Verifica que tengas los permisos necesarios para administrar Cloud Storage.
- En este instructivo, comenzaremos a usar la CLI en lugar de la consola de Cloud. En uno de los entornos de desarrollo, configura la CLI de gcloud:
- Cloud Shell: Para usar una terminal en línea con la CLI de gcloud ya configurada, activa Cloud Shell.
Haz clic en el ícono de la esquina superior derecha de la consola de Cloud para activar Cloud Shell. La sesión puede tardar unos segundos en inicializarse. Consulta la guía de Cloud Shell para obtener más detalles.

- Shell local: Para usar un entorno de desarrollo local, instala e inicializa la CLI de gcloud.
Costo
Debes habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no costará mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa de prueba gratuita de USD 300.
Los únicos recursos que generarán un costo son la instancia de VM y el objeto de Cloud Storage. Puedes encontrar un costo estimado de la instancia de VM en la calculadora de precios. El costo estimado de Cloud Storage se puede encontrar en esta lista de precios.
3. Crea un bucket y un objeto de Storage
Como se mencionó anteriormente, volveremos a usar los recursos creados en el instructivo anterior. Por lo tanto, continuaremos con la creación del bucket de Cloud Storage. En este instructivo, comenzaremos a usar la CLI de gcloud en lugar de la consola.
- En la consola de Google, selecciona ProjectX. En este proyecto, crearemos el bucket de Storage y el objeto.
- Asegúrate de configurar Cloud Shell para que use ProjectX ejecutando el siguiente comando:
gcloud config set project PROJECT_ID
- En tu entorno de desarrollo, ejecuta el siguiente comando:
gcloud storage buckets create gs://BUCKET_NAME --location=us-central1
- Crea un objeto de almacenamiento para que podamos leerlo desde la instancia de VM ubicada en ProjectZ. Crearemos un archivo .txt.
nano hello.txt
Agrega lo que quieras al archivo de texto.
- Sube el objeto al bucket.
gcloud storage cp /home/${USER}/hello.txt gs://BUCKET_NAME
- Verifica que el objeto se haya subido al bucket enumerándolo.
gcloud storage ls gs://BUCKET_NAME
Deberías ver el archivo hello.txt en la lista de la consola.
4. Protege la API de Cloud Storage
En el codelab anterior, creamos un perímetro y protegimos la API de Compute Engine. En este codelab, editaremos el perímetro del modo de ejecución de prueba y agregaremos Cloud Storage. Esto nos ayudará a determinar el impacto de la protección del perímetro, ya que nos mostrará los incumplimientos de los Controles del servicio de VPC en los registros de auditoría, pero los recursos seguirán siendo accesibles hasta que apliquemos el perímetro.
- En la consola de Google, selecciona tu organización y accede a los Controles del servicio de VPC. Asegúrate de estar en el permiso de la organización.
- Abre Cloud Shell y actualiza el perímetro de simulacro “SuperProtection” que creaste en el lab anterior:
gcloud access-context-manager perimeters dry-run update SuperProtection --policy=POLICY --add-restricted-services=storage.googleapis.com
- Verifica que la API de Cloud Storage se haya actualizado describiendo el perímetro
gcloud access-context-manager perimeters dry-run describe SuperProtection --policy=POLICY
En el resultado, verás que la API de Cloud Storage aparece debajo de los servicios restringidos.
junto con la API de Compute Engine, pero con una etiqueta "-vpcAccessibleServices: {}"":

5. Verifica que la API de Cloud Storage esté protegida
En el modo de prueba, verifica que el perímetro "SuperProtection" muestre el rechazo enumerando el objeto desde la instancia de VM creada en ProjectZ a ProjectX, que aloja el bucket de Storage.
- En la consola de Cloud, ve al selector de proyectos y selecciona ProjectZ. Luego, navega a Compute Engine > Instancias de VM.
- Haz clic en el botón SSH para conectarte a la instancia de VM y acceder a su línea de comandos.

- Enumera el archivo hello.txt que subimos anteriormente.
gcloud storage ls gs://BUCKET_NAME
Como la API de Cloud Storage está protegida en el modo de prueba, deberías poder enumerar los recursos, pero debes tener un mensaje de error en los registros de auditoría de ProjectZ.
- Ve a la API de Logs Explorer en ProjectZ y busca el último mensaje de error de los Controles del servicio de VPC. Puedes usar este filtro para obtener el registro que buscamos:
protoPayload.status.details.violations.type="VPC_SERVICE_CONTROLS" "(Dry Run Mode) Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:UNIQUE_ID"
Este filtro nos mostrará el último incumplimiento en el modo de prueba que pertenece a Cloud Storage. A continuación, se muestra un ejemplo de cómo se ve el registro y cómo podemos validar que el incumplimiento es de salida cuando intentamos enumerar el contenido del bucket ubicado en ProjectX.
egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTX_ID"
sourceType: "Network"
targetResource: "projects/PROJECTZ_ID"
}
]
resourceNames: [
0: "projects//buckets/BUCKET_NAME"
]
securityPolicyInfo: {
organizationId: "ORGANIZATION_ID"
servicePerimeterName: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"
vpcServiceControlsUniqueId: "UNIQUE_ID"
}
methodName: "google.storage.objects.list"
- Como validamos que la llamada a la API de Cloud Storage genera un incumplimiento de los Controles del servicio de VPC, aplicaremos el perímetro con la nueva configuración. Abre Cloud Shell y aplica el perímetro de ejecución en seco:
gcloud access-context-manager perimeters dry-run enforce SuperProtection --policy=POLICY --async
- Conéctate a la instancia de VM con SSH y vuelve a enumerar el bucket de almacenamiento para verificar que el perímetro de prueba se haya aplicado correctamente.
gcloud storage ls gs://BUCKET_NAME
Obtendremos un incumplimiento de los Controles del servicio de VPC en la CLI de la VM en lugar de una lista de los objetos de Storage:
ERROR: (gcloud.storage.ls) User [PROJECT_NUMBER-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:"UNIQUE_ID"
Logramos evitar el robo de datos con los Controles del servicio de VPC para impedir la lectura o copia de datos en un recurso fuera del perímetro.
6. Soluciona el problema del rechazo de la lista.
Solucionaremos el rechazo que recibimos de la CLI de la instancia de VM. Verifiquemos los registros de auditoría y busquemos el ID único de los Controles del servicio de VPC.
- Ve al selector de proyectos y elige ProjectZ.
- Busca el ID único de los Controles del servicio de VPC en los registros de auditoría con la siguiente consulta en el Explorador de registros:
resource.type="audited_resource" protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
Se mostrarán todos los registros de auditoría de los Controles del servicio de VPC. Buscaremos el último registro de errores. Como la llamada a la API se realizó desde la instancia de VM, la principal debe ser la cuenta de servicio de Compute Engine "PROJECT_NUMBER-compute@developer.gserviceaccount.com"".
Como ya tenemos el ID único de los Controles del servicio de VPC, podemos usarlo para obtener el registro deseado directamente con este filtro:
protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_ID"
- Haz clic en el encabezado Controles del servicio de VPC y selecciona "Solucionar problemas de rechazo", lo que abrirá el solucionador de problemas de los Controles del servicio de VPC.
Esta API nos mostrará en una IU amigable el motivo del incumplimiento y si se trató de un incumplimiento de ingreso o salida, entre otras cosas útiles.
En este ejercicio, buscaremos lo siguiente:
authenticationInfo: {
principalEmail: "PROJECT_ID-compute@developer.gserviceaccount.com"
egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTZ_ID"
sourceType: "Network"
targetResource: "projects/PROJECTX_ID"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"
Esta información es suficiente para saber que debemos crear una regla de salida para permitir que la cuenta de servicio de Compute Engine acceda al bucket de almacenamiento del proyecto Z al proyecto X. También podemos ver que la red no está en el mismo perímetro, por lo que debemos permitir la comunicación de la VPC con los servicios y compartir datos entre los perímetros de servicio.
- Activa Cloud Shell y crea un archivo .yaml con la regla de salida usando un editor de texto.
nano egresstorage.yaml
- egressTo:
operations:
- serviceName: storage.googleapis.com
methodSelectors:
- method: \"*\"
resources:
- projects/PROJECTX_ID
egressFrom:
identities:
- serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com
- Actualiza la política de entrada que protege ProjectZ.
gcloud access-context-manager perimeters update SuperProtection --set-egress-policies=egresstorage.yaml --policy=POLICY
Ahora podemos volver a intentar acceder al bucket desde la instancia de VM.
- En la consola de Cloud, ve al selector de proyectos y selecciona ProjectZ. Luego, navega a Compute Engine > Instancias de VM.
- Haz clic en el botón SSH para conectarte a la instancia de VM y acceder a su línea de comandos.
- Una vez que estés en la CLI de la VM, intenta enumerar los objetos del bucket de Storage.
gcloud storage ls gs://BUCKET_NAME/
Recibirás el siguiente mensaje de error:
ERROR: (gcloud.storage.ls) User [PROJECT_ID-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): PROJECT_ID-compute@developer.gserviceaccount.com does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist).
- Debemos otorgar un permiso de lector de objetos a la cuenta de servicio de Compute Engine para poder enumerar los objetos en el bucket de Storage.
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com --role=roles/storage.objectViewer
- Una vez más, intentemos enumerar el archivo hello.txt desde la CLI de la instancia de VM .
gcloud storage ls gs://BUCKET_NAME/ . . gs://BUCKET_NAME/hello.txt
Ahora podemos enumerar el objeto sin un incumplimiento de permiso de los Controles del servicio de VPC, pero ¿qué sucede con la descarga del archivo? Probemos eso.
gcloud storage cp gs://BUCKET_NAME/hello.txt /home/${USER}
Obtendremos el siguiente resultado:
Copying gs://BUCKET_NAME/hello.txt to file:///home/${USER}
Completed files 1/1 | 54.0B/54.0B
7. Limpieza
Si bien no se cobra por separado el uso de los Controles del servicio de VPC cuando el servicio no está en uso, se recomienda limpiar la configuración utilizada en este lab. También puedes borrar tu instancia de VM o tus proyectos de Cloud para evitar que se generen cargos. Si borras tu proyecto de Cloud, se dejan de facturar todos los recursos que usaste en ese proyecto.
- Para borrar tu instancia de VM, selecciona la casilla de verificación que se encuentra a la izquierda del nombre de la instancia y, luego, haz clic en Borrar.

- Para borrar el perímetro, completa los siguientes pasos:
- En la consola de Google Cloud, haz clic en Seguridad y, luego, en Controles del servicio de VPC en el alcance de la organización.
- En la página Controles del servicio de VPC, en la fila de la tabla correspondiente al perímetro que deseas borrar, haz clic en el ícono de borrar.
- Para borrar el nivel de acceso, completa los siguientes pasos:
- En la consola de Google Cloud, abre la página Access Context Manager en el permiso de la carpeta.
- En la cuadrícula, en la fila del nivel de acceso que deseas borrar, haz clic en "Ícono de borrar" y, luego, en Borrar.
- Para borrar el objeto y el bucket de Storage, completa los siguientes pasos:
- En la consola de Google Cloud, abre la página de buckets de Cloud Storage .
- Selecciona la casilla de verificación que se encuentra junto al bucket que creaste.
- Haz clic en Borrar.
- En la ventana que se abre, confirma que deseas borrar el bucket.
- Haz clic en Borrar.
- Para apagar tu proyecto, completa los siguientes pasos:
- En la consola de Google Cloud, ve a la página Configuración de IAM y administración del proyecto que deseas borrar.
- En la página Configuración de IAM y administración, haz clic en Cerrar.
- Ingresa el ID del proyecto y haz clic en Cerrar de todos modos.
8. ¡Felicitaciones!
En este codelab, actualizaste un perímetro de ejecución de prueba de los Controles del servicio de VPC, lo aplicaste y solucionaste sus problemas.
Más información
- Consulta la documentación de los Controles del servicio de VPC.
- Consulta la documentación de Access Context Manager.
- Consulta la documentación del solucionador de problemas de VPC-SC.
- Consulta la documentación sobre las reglas de entrada y salida.
- Consulta la documentación de Dry-Run.
- Consulta la documentación de Cloud Storage.
Licencia
Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.