Instructivo básico de los Controles del servicio de VPC II: Soluciona problemas de incumplimientos de salida

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 confianza cero a los servicios multiusuario, ya que permiten que los clientes restrinjan el acceso a las IP autorizadas, el contexto del cliente y los parámetros de los dispositivos mientras se conectan a servicios multiusuario desde Internet y otros servicios para reducir tanto las pérdidas intencionales como las accidentales. Como vimos en el instructivo básico I de los Controles del servicio de VPC, puedes usarlos para crear perímetros que protejan los recursos y los datos de los servicios que especifiques de forma explícita.

Los objetivos de este instructivo son los siguientes:

  • Comprende 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 un problema de salida de los Controles del servicio de VPC mientras creas una lista de un objeto de Cloud Storage

2. Configuración y requisitos

Para este instructivo, necesitamos los siguientes requisitos previos:

  • Organización de Google Cloud.
  • Una carpeta dentro de la organización
  • Se colocaron 2 proyectos de GCP dentro de la misma organización en la carpeta.
  • Los permisos necesarios a nivel de la organización.
  • Cuenta de facturación para ambos proyectos.
  • Instructivo básico de los Controles del servicio de VPC I Configuración de los Controles del servicio de VPC y Access Context Manager.

dbec101f41102ca2.png

Configuración de recursos

  1. Configura los recursos como se describe en "Configuración de recursos" Sección del Instructivo básico de Controles del servicio de VPC I
  2. Verifica si tienes los permisos necesarios para administrar Cloud Storage.
  3. Para este instructivo, vamos a comenzar a usar la CLI en lugar de la consola de Cloud. En uno de los entornos de desarrollo, configura gcloud CLI:
  • Cloud Shell: Para usar una terminal en línea con gcloud CLI ya configurada, activa Cloud Shell.

Para activar Cloud Shell, haz clic en el ícono de la esquina superior derecha de la consola de Cloud. La sesión puede tardar unos segundos en inicializarse. Consulta la guía de Cloud Shell para obtener más detalles.

a0ceb29950db4eac.png

  • 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 $300.

Los únicos recursos que generarán costos 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. Puedes encontrar el costo estimado de Cloud Storage en esta lista de precios.

3. Crea un bucket de almacenamiento y un objeto

Como se mencionó antes, vamos a reutilizar los recursos creados en el instructivo anterior. Por lo tanto, seguiremos con la creación del bucket de Cloud Storage. Para este instructivo, vamos a comenzar a usar gcloud CLI en lugar de la consola.

  1. En la consola de Google, selecciona ProjectX. En este proyecto, crearemos el bucket de Storage y el objeto.
  2. Ejecuta el siguiente comando para asegurarte de configurar Cloud Shell para que use ProjectX:
gcloud config set project PROJECT_ID
  1. En tu entorno de desarrollo, ejecuta el siguiente comando:
gcloud storage buckets create gs://BUCKET_NAME --location=us-central1
  1. Cree 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 desees al archivo de texto.

  1. Sube el objeto al bucket.
gcloud storage cp /home/${USER}/hello.txt gs://BUCKET_NAME
  1. Para verificar que el objeto se subió al bucket, enuméralo.
gcloud storage ls gs://BUCKET_NAME

Debes ver el archivo hello.txt en 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 de nuestro 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 muestra las infracciones de los Controles del servicio de VPC en los registros de auditoría, pero los recursos seguirán disponibles hasta que apliquemos el perímetro.

  1. En la consola de Google, selecciona tu organización. Accede a los Controles del servicio de VPC. Asegúrate de estar dentro del permiso de la organización.
  2. Abre Cloud Shell y actualiza el perímetro de ejecución de prueba “SuperProtection”. que creaste en el lab anterior:
gcloud access-context-manager perimeters dry-run update SuperProtection --policy=POLICY --add-restricted-services=storage.googleapis.com
  1. 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 se muestra debajo de los servicios restringidos.

junto con la API de Compute Engine, pero con una etiqueta “-vpcAccessibleServices: {}":

2025ddc01a2e9a81.png

5. Verifica que la API de Cloud Storage esté protegida

En el modo de ejecución de prueba, verifica que el mensaje "SuperProtection" perímetro nos muestra la denegación con una lista del objeto de la instancia de VM creada en ProjectZ en ProjectX, que aloja el bucket de almacenamiento.

  1. En la consola de Cloud, ve al selector de proyectos y selecciona ProjectZ; luego, navega a Compute Engine > Instancias de VM.
  2. Haz clic en el botón SSH para conectarte a la instancia de VM y acceder a su línea de comandos.

5ca02149b78c11f9.png

  1. Muestra el archivo hello.txt que subimos antes.
gcloud storage ls gs://BUCKET_NAME

Como la API de Cloud Storage está protegida en modo de ejecución de prueba, deberías poder enumerar los recursos, pero debes ver un mensaje de error en los registros de auditoría de ProjectZ.

  1. Ve a la API del Explorador de registros 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 estamos buscando:
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 ejecución de prueba que pertenece a Cloud Storage. A continuación, se muestra un ejemplo de cómo se ve el registro y podemos validar que el incumplimiento sea de salida cuando se intenta enumerar el contenido en el 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"
  1. Dado que validamos que la llamada a la API a 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 de prueba:
gcloud access-context-manager perimeters dry-run enforce SuperProtection --policy=POLICY --async
  1. Conéctate a la instancia de VM mediante SSH y vuelve a generar una lista del bucket de almacenamiento para verificar que el perímetro de prueba de validación se haya aplicado correctamente.
gcloud storage ls gs://BUCKET_NAME

En la CLI de VM, obtendremos una infracción del Control del servicio de VPC, 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"

Impedimos correctamente el robo de datos con los Controles del servicio de VPC para impedir que se lean o copien datos en un recurso fuera del perímetro.

6. Solucionar problemas de denegación de la lista.

Solucionaremos el rechazo que obtuvimos de la CLI de la instancia de VM. Revisemos los registros de auditoría y busquemos el ID único de los Controles del servicio de VPC.

  1. Ve al selector de proyectos y selecciona ProjectZ.
  2. 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 “PROJECT_NUMBER-compute@developer.gserviceaccount.com" de Compute Engine”

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"
  1. Haz clic en el encabezado Controles del servicio de VPC y selecciona “Solución de problemas de denegación”. 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 trata de una infracción de entrada o salida, entre otros datos ú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 que sepamos que necesitamos crear una regla de salida para permitir que la cuenta de servicio de Compute Engine acceda al bucket de almacenamiento de ProjectZ a ProjectX. Además, podemos ver que la red no está en el mismo perímetro, por lo que debemos permitir la comunicación de VPC con los servicios y compartir datos entre ellos.

  1. Activar Cloud Shell y crear un archivo .yaml con la regla de salida mediante 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
  1. 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 intentar acceder de nuevo al bucket desde la instancia de VM.

  1. En la consola de Cloud, ve al selector de proyectos y selecciona ProjectZ; luego, navega a Compute Engine > Instancias de VM.
  2. Haz clic en el botón SSH para conectarte a la instancia de VM y acceder a su línea de comandos.
  3. Una vez que estés en la CLI de la VM, intenta enumerar los objetos en el bucket de almacenamiento.
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).
  1. Debemos otorgar un permiso de lector de objetos a la cuenta de servicio de Compute Engine para que pueda enumerar los objetos del bucket de almacenamiento.
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com --role=roles/storage.objectViewer
  1. Una vez más, intentemos obtener una lista del 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 una infracción del permiso de los Controles del servicio de VPC, pero ¿qué pasa 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 aplican cargos adicionales por usar los Controles del servicio de VPC cuando el servicio no se usa, se recomienda limpiar la configuración utilizada en este laboratorio. También puedes borrar la instancia de VM o los proyectos de Cloud para evitar que se generen cargos. Si borras el proyecto de Cloud, se dejan de facturar todos los recursos que usaste en ese proyecto.

  1. Para borrar tu instancia de VM, selecciona la casilla de verificación a la izquierda del nombre de la instancia de VM y, luego, haz clic en Borrar.

da0abf0894fe03cd.png

  1. 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 permiso de la organización.
  • En la página Controles del servicio de VPC, en la fila de la tabla correspondiente al perímetro que quieres borrar, haz clic en “Borrar ícono”.
  1. 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 “Borrar ícono” y, luego, en Borrar.
  1. Para borrar el objeto de Storage y el bucket, 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.
  1. Para cerrar el proyecto, sigue estos pasos:
  • En la consola de Google Cloud, ve a IAM y Página Configuración del administrador del proyecto que quieres borrar.
  • En la página de IAM, Configuración del administrador, haz clic en Apagar.
  • Ingresa el ID del proyecto y haz clic en Cerrar de todas formas.

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 problemas.

Más información

Licencia

Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.