Estadísticas del registro de seguridad en Google Cloud

Last reviewed 2023-02-06 UTC

En esta guía, se muestra a los profesionales de seguridad cómo incorporar los registros de Google Cloud para usarlos en estadísticas de seguridad. Mediante las estadísticas de seguridad, ayudas a tu organización a prevenir, detectar y responder a amenazas, como software malicioso, suplantación de identidad (phishing), ransomware y recursos mal configurados.

Esta guía te muestra cómo hacer lo siguiente:

  • Habilitar los registros que se analizarán
  • Enruta esos registros a un solo destino según la herramienta de estadísticas de seguridad que elijas, como las Log Analytics, BigQuery, Chronicle o una tecnología de información de seguridad y administración de eventos (SIEM) de terceros.
  • Analizar esos registros para auditar tu uso de la nube y detectar amenazas potenciales a tus datos y cargas de trabajo mediante consultas de muestra del proyecto Estadísticas de seguridad de la comunidad (CSA)

La información de esta guía forma parte de las operaciones de seguridad autónomas de Google Cloud, que incluyen la transformación basada en ingeniería de las prácticas de detección y respuesta y las estadísticas de seguridad para mejorar las funciones de detección de amenazas.

En esta guía, los registros proporcionan la fuente de datos que se analizará. Sin embargo, puedes aplicar los conceptos de esta guía para analizar otros datos complementarios relacionados con la seguridad de Google Cloud, como los resultados de seguridad de Security Command Center. En Security Command Center Premium hay una lista de detectores administrados actualizados con regularidad que están diseñados para identificar amenazas, vulnerabilidades y configuraciones incorrectas casi en tiempo real. Mediante el análisis de estos indicadores de Security Command Center y su correlación con los registros transferidos en tu herramienta de estadísticas de seguridad como se describe en esta guía, puedes obtener una visión más amplia sobre las posibles amenazas a la seguridad.

En el siguiente diagrama, se muestra cómo trabajan en conjunto las fuentes de datos de seguridad, las herramientas de estadísticas de seguridad y las consultas de CSA.

Herramientas y contenido de estadísticas de seguridad

En el diagrama, se comienza con las siguientes fuentes de datos de seguridad: los registros de Cloud Logging, los cambios de recursos de Cloud Asset Inventory y los resultados de seguridad de Security Command Center. En el diagrama, se muestran estas fuentes de datos de seguridad que se enrutan a la herramienta de estadísticas de seguridad que elijas: Log Analytics en Cloud Logging, BigQuery, Chronicle o una herramienta SIEM de terceros. Por último, en el diagrama se muestra el uso de consultas de CSA con la herramienta de estadísticas para analizar los datos de seguridad recopilados.

Flujo de trabajo de estadísticas del registro de seguridad

En esta sección, se describen los pasos para configurar las estadísticas de registros de seguridad en Google Cloud. El flujo de trabajo consta de los tres pasos que se muestran en el siguiente diagrama y se describen en los siguientes párrafos:

Los tres pasos para configurar las estadísticas de registros de seguridad son: (1) habilitar los registros, (2) enrutar registros y (3) analizar los registros.

  • Habilita registros: Hay muchos registros de seguridad disponibles en Google Cloud. Cada registro tiene información diferente que puede ser útil para responder preguntas específicas de seguridad. Algunos registros, como los registros de auditoría de actividad del administrador, están habilitados de forma predeterminada. Otras se deben habilitar de forma manual, ya que generan costos de transferencia adicionales en Cloud Logging. Por lo tanto, el primer paso del flujo de trabajo es priorizar los registros de seguridad que sean más relevantes para tus necesidades de análisis de seguridad y habilitar esos registros específicos de forma individual.

    Para ayudarte a evaluar los registros en términos de la visibilidad y la cobertura de detección de amenazas que proporcionan, esta guía incluye una herramienta de alcance de registro. Esta herramienta asigna cada registro a tácticas y técnicas de amenaza relevantes en MITRE ATT&CK® Matrix for Enterprise. La herramienta también asigna reglas de Detección de amenazas a eventos en Security Command Center para los registros en los que se basan. Puedes usar la herramienta de permiso de registro para evaluar los registros sin importar la herramienta de estadísticas que uses.

  • Enrutar registros: Después de identificar y habilitar los registros que se analizarán, el siguiente paso es enrutar y agregar los registros de tu organización, incluidas las carpetas, los proyectos y las cuentas de facturación que están contenidos. La forma de enrutar registros depende de la herramienta de estadísticas que uses.

    En esta guía, se describen destinos de enrutamiento de registros comunes y se muestra cómo usar un receptor agregado de Cloud Logging para enrutar registros de toda la organización en un bucket de registros de Cloud Logging o un conjunto de datos de BigQuery según si eliges usar Log Analytics o BigQuery para las estadísticas.

  • Analizar registros: después de enrutar los registros a una herramienta de estadísticas, el siguiente paso es realizar un análisis de estos registros para identificar posibles amenazas de seguridad. La forma en la que analizas los registros depende de la herramienta de estadísticas que uses. Si usas Log Analytics o BigQuery, puedes analizar los registros mediante consultas de SQL. Si usas Chronicle, analizas los registros mediante las reglas de YARN-L. Si usas una herramienta de SIEM de terceros, usa el lenguaje de consulta que especifica esa herramienta.

    En esta guía, encontrarás consultas de SQL que puedes usar para analizar los registros en Log Analytics o en BigQuery. Las consultas de SQL que se proporcionan en esta guía provienen del proyecto Estadísticas de seguridad de la comunidad (CSA). El CSA es un conjunto de código abierto de estadísticas de seguridad fundamentales diseñado para proporcionarte un modelo de referencia de consultas y reglas compiladas con anterioridad que puedes volver a usar a fin de comenzar a analizar tus registros de Google Cloud.

En las siguientes secciones, se proporciona información detallada sobre cómo configurar y aplicar cada paso del flujo de trabajo de estadísticas de registros de seguridad.

Habilitar registros

El proceso de habilitación de registros implica los siguientes pasos:

  1. Identifica los registros que necesitas mediante la herramienta de permiso de registro de esta guía.
  2. Registra del filtro de registro que genera la herramienta de permisos de registro para usarlo cuando configures el receptor de registros.
  3. Habilita el registro para cada tipo de registro identificado o servicio de Google Cloud. Según el servicio, es posible que también debas habilitar los registros de auditoría de acceso a los datos correspondientes, como se detalla más adelante en esta sección.

Identifica los registros con la herramienta de permiso de registros

Para ayudarte a identificar los registros que satisfacen tus necesidades de seguridad y cumplimiento, puedes usar la herramienta de permisos de registro que se muestra en esta sección. Esta herramienta proporciona una tabla interactiva en la que se enumeran registros valiosos de seguridad que son relevantes en Google Cloud, incluidos los registros de auditoría de Cloud, los registros de Transparencia de acceso, los registros de red y varios registros de plataformas. Esta herramienta asigna cada tipo de registro a las siguientes áreas:

La herramienta de permisos de registro también genera un filtro de registro que aparece de inmediato después de la tabla. A medida que identifiques los registros que necesitas, selecciónalos en la herramienta para actualizar ese filtro de registro de manera automática.

En los siguientes procedimientos breves, se explica cómo usar la herramienta de permiso de registro:

  • Para seleccionar o quitar un registro en la herramienta de permiso de registro, haz clic en el botón de activación junto al nombre del registro.
  • Para seleccionar o quitar todos los registros, haz clic el botón de activación junto al encabezado Tipo de registro.
  • Para ver qué técnicas de MITRE ATT&CK pueden supervisarse por cada tipo de registro, haz clic en junto al encabezado MITRE ATT&CK tactics and techniques.

Herramienta de alcance de registros

Registra el filtro de registro

El filtro de registro que la herramienta de alcance de registros genera de forma automática contiene todos los registros que seleccionaste en la herramienta. Puedes usar el filtro tal como está o puedes definir mejor el filtro de registro según tus requisitos. Por ejemplo, puedes incluir (o excluir) recursos solo en uno o más proyectos específicos. Una vez que tengas un filtro de registro que cumpla con los requisitos de registro, debes guardarlo para usarlo cuando enrutes los registros. Por ejemplo, puedes guardar el filtro en un editor de texto o guardarlo en una variable de entorno de la siguiente manera:

  1. En la sección "Filtro de registro generado automáticamente" que sigue a la herramienta, copia el código del filtro de registro.
  2. Opcional: edita el código copiado para definir mejor el filtro.
  3. En Cloud Shell, crea una variable para guardar el filtro de registro:

    export LOG_FILTER='LOG_FILTER'
    

    Reemplaza LOG_FILTER por el código para el filtro de registro.

Habilita los registros de plataforma específicos del servicio

Para cada uno de los registros de la plataforma que seleccionas en la herramienta de permiso de registro, esos registros deben estar habilitados (por lo general, a nivel de recurso), en función de cada servicio. Por ejemplo, los registros de Cloud DNS están habilitados a nivel de la red de VPC. Del mismo modo, los registros de flujo de VPC se habilitan a nivel de subred para todas las VMs y los registros de reglas de firewall se habilitan a nivel de la regla de firewall individual.

Cada registro de la plataforma tiene sus propias instrucciones sobre cómo habilitar el registro. Sin embargo, puedes usar la herramienta de permiso de registro para abrir con rapidez las instrucciones relevantes de cada registro de la plataforma.

Si deseas obtener información sobre cómo habilitar el registro para un registro de plataforma específico, haz lo siguiente:

  1. En la herramienta de alcance de registros, busca el registro de la plataforma que deseas habilitar.
  2. En la columna Habilitado de forma predeterminada, haz clic en el vínculo Habilitar que corresponde a ese registro. El vínculo te lleva a instrucciones detalladas sobre cómo habilitar el registro para ese servicio.

Habilita todos los registros de auditoría de acceso a los datos

Como puedes ver en la herramienta de permisos de registro, los registros de auditoría de acceso a los datos de Registros de auditoría de Cloud proporcionan una amplia cobertura de detección de amenazas. Sin embargo, su volumen puede ser bastante grande. Por lo tanto, habilitar los registros de auditoría de acceso a los datos puede generar cargos adicionales relacionados con la transferencia, el almacenamiento, la exportación y el procesamiento de estos registros. En esta sección, se explica cómo habilitar estos registros y se presentan algunas prácticas recomendadas para ayudarte a realizar la compensación entre valor y costo.

Los registros de auditoría de acceso a los datos se encuentran inhabilitados de forma predeterminada, excepto para BigQuery. A fin de configurar los registros de auditoría de acceso a los datos para servicios de Google Cloud que no sean BigQuery, debes habilitarlos de manera explícita mediante la consola de Google Cloud o Google Cloud CLI para editar objetos de política de Identity and Access Management. Cuando habilitas los registros de auditoría de acceso a los datos, también puedes configurar los tipos de operaciones que se registran. Existen tres tipos de registros de auditoría de acceso a los datos:

  • ADMIN_READ: Registra las operaciones que leen metadatos o información de configuración.
  • DATA_READ: Registra las operaciones que leen datos proporcionados por el usuario.
  • DATA_WRITE: Registra las operaciones que escriben datos que proporcionó el usuario.

Ten en cuenta que no puedes configurar el registro de las operaciones ADMIN_WRITE, que son operaciones que escriben metadatos o información de configuración. Las operaciones ADMIN_WRITE se incluyen en los registros de auditoría de Registros de auditoría de Cloud y, por lo tanto, no se pueden inhabilitar.

Administra el volumen de los registros de auditoría de acceso a los datos

Cuando se habilitan los registros de auditoría de acceso a los datos, el objetivo es maximizar su valor en términos de visibilidad de seguridad y, al mismo tiempo, limitar su sobrecarga de administración y los costos. Para ayudarte a lograr ese objetivo, te recomendamos que hagas lo siguiente para filtrar los registros de bajo valor y de gran volumen:

  • Prioriza los servicios relevantes, como los servicios que alojan cargas de trabajo sensibles, claves y datos. Para ver ejemplos específicos de servicios que deseas priorizar sobre otros, consulta Ejemplo de configuración de registro de auditoría de acceso a los datos.
  • Prioriza los proyectos relevantes, como los proyectos que alojan cargas de trabajo de producción en lugar de los proyectos que alojan entornos de desarrollador y de etapa de pruebas. Para filtrar todos los registros de un proyecto en particular, agrega la siguiente expresión a tu filtro de registros para tu receptor. Reemplaza PROJECT_ID por el ID del proyecto en el que deseas filtrar todos los registros:

    Proyecto Expresión de filtro de registro
    Excluye todos los registros de un proyecto determinado
    
    NOT logName =~ "^projects/PROJECT_ID"
        
  • Prioriza un subconjunto de operaciones de acceso a los datos, como ADMIN_READ, DATA_READ o DATA_WRITE para obtener un conjunto mínimo de operaciones registradas. Por ejemplo, algunos servicios como Cloud DNS escriben los tres tipos de operaciones, pero puedes habilitar el registro solo para operaciones ADMIN_READ. Después de configurar uno de estos tres tipos de operaciones de acceso a los datos, es posible que desees excluir operaciones específicas que tengan un volumen particularmente alto. Puedes excluir estas operaciones de gran volumen si modificas el filtro de registro del receptor. Por ejemplo, decides habilitar el registro de auditoría de acceso a los datos completo, incluidas las operaciones de DATA_READ en algunos servicios de almacenamiento críticos. Para excluir operaciones específicas de lectura de datos de tráfico alto en esta situación, puedes agregar las siguientes expresiones de filtro de registro recomendadas al filtro de registro del receptor:

    Service Expresión de filtro de registro
    Excluye registros de grandes volúmenes de Cloud Storage
    
    NOT (resource.type="gcs_bucket" AND
        (protoPayload.methodName="storage.buckets.get" OR
        protoPayload.methodName="storage.buckets.list")) 
    Excluye registros de grandes volúmenes de Cloud SQL
    
    NOT (resource.type="cloudsql_database" AND
        protoPayload.request.cmd="select") 
  • Prioriza los recursos relevantes, como los recursos que alojan tus cargas de trabajo y datos más sensibles. Puedes clasificar tus recursos en función del valor de los datos que procesan y su riesgo de seguridad, por ejemplo, si son accesibles de forma externa o no. Aunque los registros de auditoría de acceso a los datos están habilitados por servicio, puedes filtrar recursos o tipos de recursos específicos a través del filtro de registro.

  • Excluir principales específicos para que no se registre su acceso a los datos. Por ejemplo, puedes eximir a tus cuentas de pruebas internas para que sus operaciones no se registren. Para obtener más información, consulta Configura exenciones en la documentación de los registros de auditoría de acceso a los datos.

Ejemplo de configuración de registro de auditoría de acceso a los datos

En la siguiente tabla, se proporciona una configuración de registro de auditoría de acceso a los datos de referencia que puedes usar para los proyectos de Google Cloud a fin de limitar los volúmenes de registro y obtener una visibilidad de seguridad valiosa:

Nivel Servicios Tipos de registro de auditoría de acceso a los datos Tácticas de MITRE ATT&CK
Servicios de autenticación y autorización IAM
Identity-Aware Proxy (IAP)1
Cloud KMS
Secret Manager
Resource Manager
ADMIN_READ
DATA_READ
Descubrimiento
Acceso a las credenciales
Elevación del privilegios
Servicios de almacenamiento BigQuery (habilitado de forma predeterminada)
Cloud Storage1, 2
DATA_READ
DATA_WRITE
Conjunto de
robo de datos
Servicios de infraestructura Compute Engine
Política de la organización
ADMIN_READ Detección

1 Habilitar registros de auditoría de acceso a los datos para IAP o Cloud Storage puede generar grandes volúmenes de registros cuando hay un tráfico alto a los recursos web protegidos con IAP o a los objetos de Cloud Storage.

2 Habilitar los registros de auditoría de acceso a los datos para Cloud Storage puede interrumpir el uso de las descargas autenticadas del navegador en objetos no públicos. Para obtener más detalles y soluciones alternativas a este problema, consulta la guía de solución de problemas de Cloud Storage.

En la configuración de ejemplo, observa cómo los servicios se agrupan en niveles de sensibilidad según sus datos subyacentes, metadatos o configuración. Estos niveles demuestran el siguiente nivel de detalle recomendado del registro de auditoría de acceso a los datos:

  • Servicios de autenticación y autorización: para este nivel de servicios, recomendamos auditar todas las operaciones de acceso a los datos. Este nivel de auditoría te ayuda a supervisar el acceso a las claves sensibles, los secretos y las políticas de IAM. La supervisión de este acceso puede ayudarte a detectar tácticas del MITRE ATT&CK como el Descubrimiento, el Acceso a las credenciales y la Elevación de privilegios.
  • Servicios de almacenamiento: para este nivel de servicios, recomendamos auditar las operaciones de acceso a los datos que involucran datos proporcionados por el usuario. Este nivel de auditoría te ayuda a supervisar el acceso a tus datos sensibles y valiosos. La supervisión de este acceso puede ayudarte a detectar tácticas del MITRE ATT&CK como la recopilación y el robo de tus datos.
  • Servicios de infraestructura: para este nivel de servicios, recomendamos auditar las operaciones de acceso a los datos que involucran metadatos o información de configuración. Este nivel de auditoría ayuda a supervisar el análisis de la configuración de la infraestructura. La supervisión de este acceso puede ayudarte a detectar tácticas de MITRE ATT&CK como Discovery en tus cargas de trabajo.

Registros de ruta

Después de identificar y habilitar los registros, el siguiente paso es enrutarlos a un solo destino. El destino de enrutamiento, la ruta y la complejidad varían según las herramientas de estadísticas que uses, como se muestra en el siguiente diagrama.

Las formas de enrutar registros: a BigQuery y a Log Analytics mediante un receptor de registros, a una herramienta SIEM de terceros mediante un receptor de registros, y a Pub/Sub y a Chronicle mediante la transferencia directa.

En el diagrama, se muestran las siguientes opciones de enrutamiento:

  • Si usas Log Analytics, necesitas un receptor agregado para agregar los registros de toda tu organización de Google Cloud a un solo bucket de Cloud Logging.

  • Si usas BigQuery, necesitas un receptor agregado para agregar los registros de toda tu organización de Google Cloud a un solo conjunto de datos de BigQuery.

  • Si usas Chronicle y este subconjunto predefinido de registros satisface tus necesidades de análisis de seguridad, puedes agregar de forma automática estos registros a tu cuenta de Chronicle mediante la transferencia integrada de Chronicle. También puedes ver este conjunto predefinido de registros si consultas la columna Exportable directamente a Chronicle de la herramienta de permiso de registros. Para obtener más información sobre cómo exportar estos registros predefinidos, consulta Transfiere registros de Google Cloud a Chronicle.

  • Si usas BigQuery, una herramienta de SIEM de terceros o deseas exportar un conjunto expandido de registros a Chronicle, el diagrama muestra que se necesita un paso adicional entre la habilitación de los registros y el análisis de estos. Este paso adicional consiste en configurar un receptor agregado que enrute los registros seleccionados de forma adecuada. Si usas BigQuery, este receptor es todo lo que necesitas para enrutar los registros a BigQuery. Si usas una SIEM de terceros, debes hacer que el receptor agregue los registros seleccionados en Pub/Sub o Cloud Storage antes de que los registros se puedan extraer en tu herramienta de estadísticas.

Las opciones de enrutamiento a Chronicle y una herramienta de SIEM de terceros no se tratan en esta guía. Sin embargo, en las siguientes secciones, se proporcionan los pasos detallados para enrutar registros a Log Analytics o BigQuery:

  1. Configura un solo destino
  2. Crear un receptor de registros agregado
  3. Otorga acceso al receptor.
  4. Configura el acceso de lectura al destino.
  5. Verifica que los registros se enruten al destino.

Configura un solo destino

Análisis de registros

  1. Abre la consola de Google Cloud en el proyecto de Google Cloud al que deseas agregar los registros.

    Ir a la consola de Google Cloud

  2. En una terminal de Cloud Shell, ejecuta el siguiente comando de gcloud para crear un bucket de registros:

    gcloud logging buckets create BUCKET_NAME \
      --location=BUCKET_LOCATION \
      --project=PROJECT_ID
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto de Google Cloud en el que se almacenarán los registros agregados.
    • BUCKET_NAME: El nombre del bucket de Logging nuevo.
    • BUCKET_LOCATION: La ubicación geográfica del bucket de Logging nuevo Las ubicaciones compatibles son global, us o eu. Para obtener más información sobre estas regiones de almacenamiento, consulta Regiones admitidas. Si no especificas una ubicación, se usa la región global, lo que significa que los registros pueden estar ubicados físicamente en cualquiera de las regiones.

  3. Verifica si se creó el depósito:

    gcloud logging buckets list --project=PROJECT_ID
    
  4. (Opcional) Configura el período de retención de los registros en el bucket. En el siguiente ejemplo, se amplía la retención de los registros almacenados en el bucket a 365 días:

    gcloud logging buckets update BUCKET_NAME \
      --location=BUCKET_LOCATION \
      --project=PROJECT_ID \
      --retention-days=365
    
  5. Sigue estos pasos para actualizar tu bucket nuevo y usar Log Analytics.

BigQuery

  1. Abre la consola de Google Cloud en el proyecto de Google Cloud al que deseas agregar los registros.

    Ir a la consola de Google Cloud

  2. En una terminal de Cloud Shell, ejecuta el siguiente comando de bq mk para crear un conjunto de datos:

    bq --location=DATASET_LOCATION mk \
        --dataset \
        --default_partition_expiration=PARTITION_EXPIRATION \
        PROJECT_ID:DATASET_ID
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto de Google Cloud en el que se almacenarán los registros agregados.
    • DATASET_ID: El ID del conjunto de datos nuevo de BigQuery.
    • DATASET_LOCATION: La ubicación geográfica del conjunto de datos. Después de crear un conjunto de datos, la ubicación no se puede cambiar.

    • PARTITION_EXPIRATION: la duración predeterminada (en segundos) para las particiones en las tablas particionadas que crea el receptor de registros. Configura el receptor de registros en la siguiente sección. El receptor de registros que configuras usa tablas particionadas que se particionan por día en función de la marca de tiempo de la entrada de registro. Las particiones (incluidas las entradas de registro asociadas) se borran PARTITION_EXPIRATION segundos después de la fecha de la partición.

Crea un receptor de registros agregado

Para enrutar los registros de tu organización a tu destino, crea un receptor agregado a nivel de la organización. Para incluir todos los registros que seleccionaste en la herramienta de permiso de registro, configura el receptor con el filtro de registro que generó la herramienta de permiso de registros.

Análisis de registros

  1. En una terminal de Cloud Shell, ejecuta el siguiente comando de gcloud para crear un receptor agregado a nivel de la organización:

    gcloud logging sinks create SINK_NAME \
      logging.googleapis.com/projects/PROJECT_ID/locations/BUCKET_LOCATION/buckets/BUCKET_NAME \
      --log-filter="LOG_FILTER" \
      --organization=ORGANIZATION_ID \
      --include-children
    

    Reemplaza lo siguiente:

    • SINK_NAME: el nombre del receptor que enruta los registros.
    • PROJECT_ID: El ID del proyecto de Google Cloud en el que se almacenarán los registros agregados.
    • BUCKET_LOCATION: la ubicación del bucket de Logging que creaste para el almacenamiento de registros.
    • BUCKET_NAME: el nombre del bucket de Logging que creaste para el almacenamiento de registros.
    • LOG_FILTER: El filtro de registro que guardaste desde la herramienta de permisos de registro.
    • ORGANIZATION_ID: el ID de recurso de tu organización.

    La marca --include-children es importante para que también se incluyan los registros de todos los proyectos de Google Cloud de tu organización. Para obtener más información, consulta Recopila y enruta registros a nivel de la organización a destinos compatibles.

  2. Verifica si se creó el receptor:

    gcloud logging sinks list --organization=ORGANIZATION_ID
    
  3. Obtén el nombre de la cuenta de servicio asociada con el receptor que acabas de crear:

    gcloud logging sinks describe SINK_NAME --organization=ORGANIZATION_ID
    

    El resultado es similar al siguiente:

    writerIdentity: serviceAccount:p1234567890-12345@logging-o1234567890.iam.gserviceaccount.com`
    
  4. Copia la string completa para writerIdentity a partir de serviceAccount:. Este identificador es la cuenta de servicio del receptor. Hasta que no otorgues el acceso de escritura en el bucket de registros a esta cuenta de servicio, el enrutamiento de registros desde este receptor fallará. En la siguiente sección, otorgas acceso de escritura a la identidad de escritor del receptor.

BigQuery

  1. En una terminal de Cloud Shell, ejecuta el siguiente comando de gcloud para crear un receptor agregado a nivel de la organización:

    gcloud logging sinks create SINK_NAME \
      bigquery.googleapis.com/projects/PROJECT_ID/datasets/DATASET_ID \
      --log-filter="LOG_FILTER" \
      --organization=ORGANIZATION_ID \
      --use-partitioned-tables \
      --include-children
    

    Reemplaza lo siguiente:

    • SINK_NAME: el nombre del receptor que enruta los registros.
    • PROJECT_ID: El ID del proyecto de Google Cloud al que deseas agregar los registros.
    • DATASET_ID: el ID del conjunto de datos de BigQuery que creaste.
    • LOG_FILTER: El filtro de registro que guardaste desde la herramienta de permisos de registro.
    • ORGANIZATION_ID: el ID de recurso de tu organización.

    La marca --include-children es importante para que también se incluyan los registros de todos los proyectos de Google Cloud de tu organización. Para obtener más información, consulta Recopila y enruta registros a nivel de la organización a destinos compatibles.

    La marca --use-partitioned-tables es importante para que los datos se particionan por día en función del campo timestamp de la entrada de registro. Esto simplifica las consultas de los datos y ayuda a reducir los costos de consulta, pues reduce la cantidad de datos que se analizan en las consultas. Otro beneficio de las tablas particionadas es que puedes configurar un plazo de vencimiento de partición predeterminado a nivel del conjunto de datos para cumplir con tus requisitos de retención de registros. Ya configuraste un vencimiento de partición predeterminada cuando creaste el destino del conjunto de datos en la sección anterior. También puedes elegir configurar un vencimiento de la partición a nivel de la tabla individual, lo que te proporciona controles de retención de datos detallados según el tipo de registro.

  2. Verifica si se creó el receptor:

    gcloud logging sinks list --organization=ORGANIZATION_ID
    
  3. Obtén el nombre de la cuenta de servicio asociada con el receptor que acabas de crear:

    gcloud logging sinks describe SINK_NAME --organization=ORGANIZATION_ID
    

    El resultado es similar al siguiente:

    writerIdentity: serviceAccount:p1234567890-12345@logging-o1234567890.iam.gserviceaccount.com`
    
  4. Copia la string completa para writerIdentity a partir de serviceAccount:. Este identificador es la cuenta de servicio del receptor. Hasta que no otorgues el acceso de escritura en el conjunto de datos de BigQuery a esta cuenta de servicio, el enrutamiento de registros desde este receptor fallará. En la siguiente sección, otorgas acceso de escritura a la identidad de escritor del receptor.

Otorga acceso al receptor

Después de crear el receptor de registros, debes otorgar acceso al receptor para escribir en su destino, ya sea el bucket de Logging o el conjunto de datos de BigQuery.

Log Analytics

Para agregar los permisos a la cuenta de servicio del receptor, sigue estos pasos:

  1. En la consola de Google Cloud, ve a la página IAM.

    Ve a la página IAM

  2. Asegúrate de haber seleccionado el proyecto de Google Cloud de destino que contiene el bucket de Logging que creaste para el almacenamiento de registros central.

  3. Haz clic en Otorgar acceso.

  4. En el campo Principales nuevas, ingresa la cuenta de servicio del receptor sin el prefijo serviceAccount:. Recuerda que esta identidad proviene del campo writerIdentity que recuperaste en la sección anterior después de crear el receptor.

  5. En el menú desplegable Seleccionar un rol, selecciona Escritor de buckets de registros.

  6. Haz clic en Agregar condición de IAM para restringir el acceso de la cuenta de servicio solo al bucket de registros que creaste.

  7. Ingresa un Título y una Descripción para la condición.

  8. En el menú desplegable Tipo de condición, selecciona Recurso > Nombre.

  9. En el menú desplegable Operador, selecciona Finalizar con.

  10. En el campo Valor, ingresa la ubicación y el nombre del bucket de la siguiente manera:

    locations/BUCKET_LOCATION/buckets/BUCKET_NAME
    
  11. Haga clic en Guardar para agregar la condición.

  12. Haz clic en Guardar para configurar los permisos.

BigQuery

Para agregar los permisos a la cuenta de servicio del receptor, sigue estos pasos:

  1. En la consola de Google Cloud, ve a BigQuery:

    Ir a BigQuery

  2. Abre el conjunto de datos de BigQuery que creaste para el almacenamiento de registros central.

  3. En la pestaña Información del conjunto de datos, haz clic en el menú desplegable Compartir y, luego, en Permisos.

  4. En el panel lateral Permisos del conjunto de datos, haz clic en Agregar principal.

  5. En el campo Principales nuevas, ingresa la cuenta de servicio del receptor sin el prefijo serviceAccount:. Recuerda que esta identidad proviene del campo writerIdentity que recuperaste en la sección anterior después de crear el receptor.

  6. En el menú desplegable Rol, selecciona Editor de datos de BigQuery.

  7. Haz clic en Guardar.

Después de otorgar acceso al receptor, las entradas de registro comienzan a propagarse en el destino del receptor: el bucket de Logging o el conjunto de datos de BigQuery.

Configura el acceso de lectura al destino

Ahora que tu receptor de registros enruta los registros de toda tu organización a un solo destino, puedes buscar en todos estos registros. Usa los permisos de IAM para administrar los permisos y otorgar acceso según sea necesario.

Log Analytics

A fin de otorgar acceso para ver y consultar los registros en tu bucket de registros nuevo, sigue estos pasos.

  1. En la consola de Google Cloud, ve a la página IAM.

    Ve a la página IAM

    Asegúrate de seleccionar el proyecto de Google Cloud que usas para agregar los registros.

  2. Haz clic en Agregar.

  3. En el campo Principal nuevo, agrega tu cuenta de correo electrónico.

  4. En el menú desplegable Seleccionar un rol, selecciona descriptor de acceso de vistas de registro.

    Este rol proporciona al principal recién agregado acceso de lectura a todas las vistas de cualquier bucket del proyecto de Google Cloud. Para limitar el acceso de un usuario, agrega una condición que permita que el usuario lea solo desde tu bucket nuevo.

    1. Haz clic en Agregar condición:

    2. Ingresa un Título y una Descripción para la condición.

    3. En el menú desplegable Tipo de condición, selecciona Recurso > Nombre.

    4. En el menú desplegable Operador, selecciona Finalizar con.

    5. En el campo Valor, ingresa la ubicación y el nombre del bucket, y la vista de registro predeterminada _AllLogs, como se muestra a continuación:

      locations/BUCKET_LOCATION/buckets/BUCKET_NAME/views/_AllLogs
      
    6. Haga clic en Guardar para agregar la condición.

  5. Haz clic en Guardar para configurar los permisos.

BigQuery

A fin de otorgar acceso para ver y consultar los registros en tu conjunto de datos de BigQuery, sigue los pasos de la sección Otorga acceso a un conjunto de datos de la documentación de BigQuery.

Verifica que los registros se enruten al destino

Log Analytics

Cuando enrutas registros a un bucket de registros actualizado a Log Analytics, puedes ver y consultar todas las entradas de registro a través de una sola vista de registro con un esquema unificado para todos los tipos de registros. Sigue estos pasos para verificar que los registros se enruten correctamente.

  1. En la consola de Google Cloud, ve a la página Log Analytics.

    Ir a Log Analytics

    Asegúrate de seleccionar el proyecto de Google Cloud que usas para agregar los registros.

  2. Haz clic en la pestaña Vistas de registro.

  3. Expande las vistas de registro en el bucket de registros que creaste (es decir, BUCKET_NAME) si aún no está expandido.

  4. Selecciona la vista de registro predeterminada _AllLogs. Ahora puedes inspeccionar todo el esquema de registro en el panel derecho, como se muestra en la siguiente captura de pantalla:

    Log Analytics con la tabla cloudaudit_googleapis_com_data_access seleccionada.

  5. Junto a _AllLogs, haz clic en Consultar . Esto propaga el editor de Consultas con una consulta de muestra de SQL para recuperar las entradas de registro enrutadas recientemente.

  6. Haz clic en Ejecutar consulta para ver las entradas de registro enrutadas recientemente.

Según el nivel de actividad de los proyectos de Google Cloud en tu organización, es posible que debas esperar unos minutos hasta que se generen algunos registros y, luego, se enruten a tu bucket de registros.

BigQuery

Cuando enrutas registros a un conjunto de datos de BigQuery, Cloud Logging crea tablas de BigQuery para contener las entradas de registro, como se muestra en la siguiente captura de pantalla:

Explorador de BigQuery con la tabla cloudaudit_googleapis_com_data_access seleccionada.

En la captura de pantalla, se muestra cómo Cloud Logging nombra cada tabla de BigQuery según el nombre del registro al que pertenece una entrada de registro. Por ejemplo, la tabla cloudaudit_googleapis_com_data_access que se selecciona en la captura de pantalla contiene registros de auditoría de acceso a los datos cuyo ID de registro es cloudaudit.googleapis.com%2Fdata_access. Además de asignar un nombre en función de la entrada de registro correspondiente, cada tabla también se particiona en función de las marcas de tiempo de cada entrada de registro.

Según el nivel de actividad de los proyectos de Google Cloud en tu organización, es posible que debas esperar unos minutos hasta que se generen algunos registros y, luego, se enruten a tu conjunto de datos de BigQuery.

Analizar los registros

Puedes ejecutar una gran variedad de consultas en los registros de auditorías y de la plataforma. En la siguiente lista, se proporciona un conjunto de preguntas de seguridad de muestra que puedes hacer con tus propios registros. Para cada pregunta de esta lista, hay dos versiones de la consulta de CSA correspondiente: una para usar con Log Analytics y otra para usar con BigQuery. Usa la versión de consulta que coincida con el destino del receptor que configuraste antes.

Análisis de registros

Antes de usar cualquiera de las siguientes consultas de SQL, reemplaza MY_PROJECT_ID por el ID del proyecto de Google Cloud en el que creaste el bucket de registro (es decir, PROJECT_ID)) y MY_DATASET_ID por la región y el nombre de ese bucket de registros (es decir, BUCKET_LOCATION.BUCKET_NAME).

Ir a Log Analytics

BigQuery

Antes de usar cualquiera de las siguientes consultas de SQL, reemplaza MY_PROJECT_ID por el ID del proyecto de Google Cloud en el que creaste el conjunto de datos de BigQuery (es decir, PROJECT_ID) y MY_DATASET_ID) por el nombre de ese conjunto de datos), que es DATASET_ID.

Ir a BigQuery

  1. Acceso y peguntas sobre el acceso
  2. Preguntas sobre los cambios de permisos
  3. Preguntas sobre la actividad de aprovisionamiento
  4. Preguntas sobre el uso de la carga de trabajo
  5. Preguntas sobre el acceso a los datos
  6. Preguntas sobre seguridad de red

Acceso y peguntas sobre el acceso

Estas consultas de muestra llevan a cabo análisis para detectar intentos de registro o acceso inicial sospechosos a tu entorno de Google Cloud.

¿Hay algún intento de acceso sospechoso marcado por Google Workspace?

Mediante la búsqueda de registros de Cloud Identity que forman parte de la Auditoría de acceso de Google Workspace, la siguiente consulta detecta intentos de acceso sospechosos marcados por Google Workspace. Estos intentos de acceso pueden ser desde la consola de Google Cloud, la consola del administrador o la CLI de gcloud.

Análisis de registros


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.method_name, parameter
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS parameter
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND proto_payload.audit_log IS NOT NULL
  AND proto_payload.audit_log.service_name = "login.googleapis.com"
  AND proto_payload.audit_log.method_name = "google.login.LoginService.loginSuccess"
  AND JSON_VALUE(parameter.name) = "is_suspicious"
  AND JSON_VALUE(parameter.boolValue) = "true"

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`,
  UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS parameter
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND protopayload_auditlog.metadataJson IS NOT NULL
  AND protopayload_auditlog.serviceName = "login.googleapis.com"
  AND protopayload_auditlog.methodName = "google.login.LoginService.loginSuccess"
  AND JSON_VALUE(parameter, '$.name') = "is_suspicious"
  AND JSON_VALUE(parameter, '$.boolValue') = "true"

¿Hay errores de acceso excesivos de cualquier identidad de usuario?

Mediante la búsqueda de registros de Cloud Identity que forman parte de la Auditoría de acceso de Google Workspace, la siguiente consulta detecta usuarios que tuvieron tres o más errores de acceso sucesivos en las últimas 24 horas.

Análisis de registros


SELECT
  proto_payload.audit_log.authentication_info.principal_email,
  MIN(timestamp) AS earliest,
  MAX(timestamp) AS latest,
  count(*) AS attempts
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
  AND proto_payload.audit_log.service_name = "login.googleapis.com"
  AND proto_payload.audit_log.method_name = "google.login.LoginService.loginFailure"
GROUP BY
  1
HAVING
  attempts >= 3

BigQuery


SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  MIN(timestamp) AS earliest,
  MAX(timestamp) AS latest,
  count(*) AS attempts
FROM
 `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
  AND protopayload_auditlog.serviceName="login.googleapis.com"
  AND protopayload_auditlog.methodName="google.login.LoginService.loginFailure"
GROUP BY
  1
HAVING
  attempts >= 3

¿Hay intentos de acceso que infrinjan los Controles del servicio de VPC?

En el análisis de los registros de auditoría de política denegada de Registros de auditoría de Cloud, la siguiente consulta detecta intentos de acceso bloqueados por los Controles del servicio de VPC. Cualquier resultado de consulta puede indicar una posible actividad maliciosa, como intentos de acceso de redes no autorizadas con credenciales robadas.

Análisis de registros


SELECT
  timestamp,
  log_name,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  JSON_VALUE(proto_payload.audit_log.metadata.violationReason) as violationReason,
  IF(JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations) IS NULL, 'ingress', 'egress') AS violationType,
  COALESCE(
    JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations[0].targetResource),
    JSON_VALUE(proto_payload.audit_log.metadata.egressViolations[0].targetResource)
  ) AS  targetResource,
  COALESCE(
    JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations[0].servicePerimeter),
    JSON_VALUE(proto_payload.audit_log.metadata.egressViolations[0].servicePerimeter)
  ) AS  servicePerimeter
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND proto_payload.audit_log IS NOT NULL
  AND JSON_VALUE(proto_payload.audit_log.metadata, '$."@type"') = 'type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata'
ORDER BY
  timestamp DESC
LIMIT 1000

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  JSON_VALUE(protopayload_auditlog.metadataJson, '$.violationReason') as violationReason,
  IF(JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations') IS NULL, 'ingress', 'egress') AS violationType,
  COALESCE(
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations[0].targetResource'),
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.egressViolations[0].targetResource')
  ) AS  targetResource,
  COALESCE(
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations[0].servicePerimeter'),
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.egressViolations[0].servicePerimeter')
  ) AS  servicePerimeter
FROM
 `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_policy`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 400 DAY)
  AND JSON_VALUE(protopayload_auditlog.metadataJson, '$."@type"') = 'type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata'
ORDER BY
  timestamp DESC
LIMIT 1000

¿Hay algún intento de acceso que infrinja los controles de acceso de IAP?

Mediante el análisis de los registros del balanceador de cargas de aplicaciones externo, la siguiente consulta detecta los intentos de acceso que bloquea IAP. Cualquier resultado de consulta puede indicar un intento de acceso inicial o un intento de explotación de vulnerabilidades.

Análisis de registros


SELECT
  timestamp,
  http_request.remote_ip,
  http_request.request_method,
  http_request.status,
  JSON_VALUE(resource.labels.backend_service_name) AS backend_service_name,
  http_request.request_url
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND JSON_VALUE(json_payload.statusDetails) = "handled_by_identity_aware_proxy"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  httpRequest.remoteIp,
  httpRequest.requestMethod,
  httpRequest.status,
  resource.labels.backend_service_name,
  httpRequest.requestUrl,
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].requests`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND jsonpayload_type_loadbalancerlogentry.statusdetails = "handled_by_identity_aware_proxy"
ORDER BY
  timestamp DESC

Preguntas sobre los cambios de permisos

Estas consultas de muestra realizan un análisis sobre la actividad de los administradores que cambia los permisos, como los cambios en las políticas de IAM, grupos y membresías de grupos, cuentas de servicio y cualquier clave asociada. Estos cambios en los permisos pueden proporcionar un alto nivel de acceso a entornos o datos sensibles.

¿Se agregó algún usuario a grupos altamente privilegiados?

Mediante el análisis de los registros de auditoría de la Auditoría del administrador de Google Workspace, la siguiente consulta detecta usuarios que se agregaron a cualquiera de los grupos altamente privilegiados que se enumeran en la consulta. Usa la expresión regular en la consulta para definir qué grupos supervisar (como admin@example.com o prod@example.com). Cualquier resultado de consulta puede indicar una elevación de privilegios maliciosa o accidental.

Análisis de registros


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.resource_name,
  (SELECT JSON_VALUE(x.value)
   FROM UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS x
   WHERE JSON_VALUE(x.name) = "USER_EMAIL") AS user_email,
  (SELECT JSON_VALUE(x.value)
   FROM UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS x
   WHERE JSON_VALUE(x.name) = "GROUP_EMAIL") AS group_email,
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 120 DAY)
  AND proto_payload.audit_log.service_name = "admin.googleapis.com"
  AND proto_payload.audit_log.method_name = "google.admin.AdminService.addGroupMember"
  AND EXISTS(
    SELECT * FROM UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS x
    WHERE
      JSON_VALUE(x.name) = "GROUP_EMAIL"
      AND REGEXP_CONTAINS(JSON_VALUE(x.value), r'(admin|prod).*') -- Update regexp with other sensitive groups if applicable
  )

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.methodName,
  protopayload_auditlog.resourceName,
  (SELECT JSON_VALUE(x, '$.value')
   FROM UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS x
   WHERE JSON_VALUE(x, '$.name') = "USER_EMAIL") AS userEmail,
  (SELECT JSON_VALUE(x, '$.value')
   FROM UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS x
   WHERE JSON_VALUE(x, '$.name') = "GROUP_EMAIL") AS groupEmail,
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 120 DAY)
  AND protopayload_auditlog.serviceName = "admin.googleapis.com"
  AND protopayload_auditlog.methodName = "google.admin.AdminService.addGroupMember"
  AND EXISTS(
    SELECT * FROM UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS x
    WHERE
      JSON_VALUE(x, '$.name') = 'GROUP_EMAIL'
      AND REGEXP_CONTAINS(JSON_VALUE(x, '$.value'), r'(admin|prod).*') -- Update regexp with other sensitive groups if applicable
  )

¿Se otorgaron permisos en una cuenta de servicio?

Mediante el análisis de los registros de auditoría de la actividad del administrador de Registros de auditoría de Cloud, la siguiente consulta detecta cualquier permiso que se otorgaron a cualquier principal en una cuenta de servicio. Algunos ejemplos de permisos que se podrían otorgar son la capacidad de suplantar esa cuenta de servicio o crear claves de cuentas de servicio. Cualquier resultado de consulta puede indicar una instancia de elevación de privilegios o un riesgo de filtración de credenciales.

Análisis de registros


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email as grantor,
  JSON_VALUE(bindingDelta.member) as grantee,
  JSON_VALUE(bindingDelta.role) as role,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.service_data.policyDelta.bindingDeltas)) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 400 DAY)
  -- AND log_id = "cloudaudit.googleapis.com/activity"
  AND (
    (resource.type = "service_account"
    AND proto_payload.audit_log.method_name LIKE "google.iam.admin.%.SetIAMPolicy")
    OR
    (resource.type IN ("project", "folder", "organization")
    AND proto_payload.audit_log.method_name = "SetIamPolicy"
    AND JSON_VALUE(bindingDelta.role) LIKE "roles/iam.serviceAccount%")
  )
  AND JSON_VALUE(bindingDelta.action) = "ADD"
  -- Principal (grantee) exclusions
  AND JSON_VALUE(bindingDelta.member) NOT LIKE "%@example.com"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail as grantor,
  bindingDelta.member as grantee,
  bindingDelta.role,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName,
FROM
  `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`,
  UNNEST(protopayload_auditlog.servicedata_v1_iam.policyDelta.bindingDeltas) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY)
  AND (
    (resource.type = "service_account"
    AND protopayload_auditlog.methodName LIKE "google.iam.admin.%.SetIAMPolicy")
    OR
    (resource.type IN ("project", "folder", "organization")
    AND protopayload_auditlog.methodName = "SetIamPolicy"
    AND bindingDelta.role LIKE "roles/iam.serviceAccount%")
  )
  AND bindingDelta.action = 'ADD'
  -- Principal (grantee) exclusions
  AND bindingDelta.member NOT LIKE "%@example.com"
ORDER BY
  timestamp DESC

¿Hay claves o cuentas de servicio creadas por una identidad no aprobada?

Mediante el análisis de los registros de auditoría de la actividad del administrador, la siguiente consulta detecta cualquier cuenta de servicio o clave que los usuarios crean de forma manual. Por ejemplo, puedes seguir una práctica recomendada para permitir que una cuenta de servicio aprobada cree cuentas de servicio como parte de un flujo de trabajo automatizado. Por lo tanto, cualquier creación de cuenta de servicio fuera de ese flujo de trabajo se considera incompatible y puede ser maliciosa.

Análisis de registros


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.resource_name,
  JSON_VALUE(proto_payload.audit_log.response.email) as service_account_email
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="service_account"
  AND proto_payload.audit_log.method_name LIKE "%CreateServiceAccount%"
  AND proto_payload.audit_log.authentication_info.principal_email NOT LIKE "%.gserviceaccount.com"

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.methodName,
  protopayload_auditlog.resourceName,
  JSON_VALUE(protopayload_auditlog.responseJson, "$.email") as serviceAccountEmail
FROM
  `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY)
  AND resource.type="service_account"
  AND protopayload_auditlog.methodName LIKE "%CreateServiceAccount%"
  AND protopayload_auditlog.authenticationInfo.principalEmail NOT LIKE "%.gserviceaccount.com"

¿Se agregó cualquier usuario a la política de IAM sensible (o se lo quitó de ella)?

Mediante la búsqueda de registros de auditoría de actividad del administrador, la siguiente consulta detecta cualquier cambio en el acceso de grupo o usuario para un recurso protegido con IAP, como un servicio de backend de Compute Engine. La siguiente consulta busca todas las actualizaciones de políticas de IAM para los recursos de IAP que involucran el rol de IAM roles/iap.httpsResourceAccessor. Este rol proporciona permisos para acceder al recurso HTTPS o al servicio de backend. Cualquier resultado de consulta puede indicar intentos de omitir las defensas de un servicio de backend que podría exponerse a Internet.

Análisis de registros


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  resource.type,
  proto_payload.audit_log.resource_name,
  JSON_VALUE(binding, '$.role') as role,
  JSON_VALUE_ARRAY(binding, '$.members') as members
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.response, '$.bindings')) AS binding
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  -- AND log_id = "cloudaudit.googleapis.com/activity"
  AND proto_payload.audit_log.service_name = "iap.googleapis.com"
  AND proto_payload.audit_log.method_name LIKE "%.IdentityAwareProxyAdminService.SetIamPolicy"
  AND JSON_VALUE(binding, '$.role') = "roles/iap.httpsResourceAccessor"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  resource.type,
  protopayload_auditlog.resourceName,
  JSON_VALUE(binding, '$.role') as role,
  JSON_VALUE_ARRAY(binding, '$.members') as members
FROM
  `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`,
  UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.responseJson, '$.bindings')) AS binding
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 400 DAY)
  AND protopayload_auditlog.serviceName = "iap.googleapis.com"
  AND protopayload_auditlog.methodName LIKE "%.IdentityAwareProxyAdminService.SetIamPolicy"
  AND JSON_VALUE(binding, '$.role') = "roles/iap.httpsResourceAccessor"
ORDER BY
  timestamp DESC

Preguntas sobre la actividad de aprovisionamiento

Estas consultas de muestra realizan análisis para detectar la actividad sospechosa o anómala del administrador, como el aprovisionamiento y la configuración de recursos.

¿Se realizaron cambios en la configuración de registro?

Mediante la búsqueda de registros de auditoría de actividad del administrador, la siguiente consulta detecta cualquier cambio que se realice en la configuración de registro. La supervisión de la configuración de registro te ayuda a detectar la inhabilitación accidental o maliciosa de los registros de auditoría y técnicas de evasión similares.

Análisis de registros


SELECT
  receive_timestamp, timestamp AS eventTimestamp,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  proto_payload.audit_log.service_name = "logging.googleapis.com"
  AND log_id = "cloudaudit.googleapis.com/activity"

BigQuery


SELECT
  receiveTimestamp, timestamp AS eventTimestamp,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  protopayload_auditlog.serviceName = "logging.googleapis.com"

¿Los registros de flujo de VPC están inhabilitados de forma activa?

Mediante la búsqueda de registros de auditoría de actividad del administrador, la siguiente consulta detecta cualquier subred cuyos registros de flujo de VPC se hayan inhabilitado de forma activa. La supervisión de la configuración de los registros de flujo de VPC te ayuda a detectar la inhabilitación accidental o maliciosa de los registros de flujo de VPC y técnicas de evasión similares.

Análisis de registros


SELECT
  receive_timestamp, timestamp AS eventTimestamp,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  proto_payload.audit_log.method_name = "v1.compute.subnetworks.patch"
  AND (
    JSON_VALUE(proto_payload.audit_log.request, "$.logConfig.enable") = "false"
    OR JSON_VALUE(proto_payload.audit_log.request, "$.enableFlowLogs") = "false"
  )

BigQuery


SELECT
  receiveTimestamp, timestamp AS eventTimestamp,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
protopayload_auditlog.methodName = "v1.compute.subnetworks.patch"
AND JSON_VALUE(protopayload_auditlog.requestJson, "$.logConfig.enable") = "false"

¿Hay una cantidad inusualmente alta de reglas de firewall modificadas en la última semana?

Mediante la búsqueda de los registros de auditoría de actividad del administrador, la siguiente consulta detecta una cantidad inusualmente alta de cambios en las reglas de firewall en un día determinado en la última semana. Para determinar si hay un valor atípico, la consulta realiza un análisis estadístico sobre los recuentos diarios de los cambios de las reglas de firewall. Los promedios y las desviaciones estándar se calculan para cada día si se observan los recuentos diarios anteriores con una ventana de visualización de 90 días. Se considera un valor atípico cuando el recuento diario supera las dos desviaciones estándar por encima de la media. La consulta, incluidos el factor de desviación estándar y los períodos de visualización, se pueden configurar para que se ajusten al perfil de actividad de aprovisionamiento en la nube y a minimizar los falsos positivos.

Análisis de registros

SELECT
  *
FROM (
  SELECT
    *,
    AVG(counter) OVER (
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
    STDDEV(counter) OVER (
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
    COUNT(*) OVER (
      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
  FROM (
    SELECT
      EXTRACT(DATE FROM timestamp) AS day,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.method_name IGNORE NULLS) AS actions,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.authentication_info.principal_email IGNORE NULLS) AS actors,
      COUNT(*) AS counter
    FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
    WHERE
      timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
      AND proto_payload.audit_log.method_name LIKE "v1.compute.firewalls.%"
      AND proto_payload.audit_log.method_name NOT IN ("v1.compute.firewalls.list", "v1.compute.firewalls.get")
    GROUP BY
      day
  )
)
WHERE
  counter > avg + 2 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
ORDER BY
  counter DESC

BigQuery


SELECT
  *,
  AVG(counter) OVER (
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
  STDDEV(counter) OVER (
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
  COUNT(*) OVER (
    RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
FROM (
  SELECT
    EXTRACT(DATE FROM timestamp) AS day,
    ARRAY_AGG(DISTINCT protopayload_auditlog.methodName IGNORE NULLS) AS actions,
    ARRAY_AGG(DISTINCT protopayload_auditlog.authenticationInfo.principalEmail IGNORE NULLS) AS actors,
    COUNT(*) AS counter
  FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
  WHERE
    timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
    AND protopayload_auditlog.methodName LIKE "v1.compute.firewalls.%"
    AND protopayload_auditlog.methodName NOT IN ("v1.compute.firewalls.list", "v1.compute.firewalls.get")
  GROUP BY
    day
)
WHERE TRUE
QUALIFY
  counter > avg + 2 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
ORDER BY
  counter DESC

¿Se borró alguna de las VMs durante la última semana?

Mediante la búsqueda de registros de auditoría de actividad del administrador, en la siguiente consulta se muestra una lista de todas las instancias de Compute Engine borradas en la última semana. Esta consulta puede ayudarte a auditar las eliminaciones de recursos y detectar una posible actividad maliciosa.

Análisis de registros

SELECT
  timestamp,
  JSON_VALUE(resource.labels.instance_id) AS instance_id,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  resource.type = "gce_instance"
  AND proto_payload.audit_log.method_name = "v1.compute.instances.delete"
  AND operation.first IS TRUE
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY
  timestamp desc,
  instance_id
LIMIT
  1000

BigQuery


SELECT
  timestamp,
  resource.labels.instance_id,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance"
  AND protopayload_auditlog.methodName = "v1.compute.instances.delete"
  AND operation.first IS TRUE
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY
  timestamp desc,
  resource.labels.instance_id
LIMIT
  1000

Preguntas sobre el uso de la carga de trabajo

Estas consultas de muestra llevan a cabo un análisis para comprender quién y qué consumen tus cargas de trabajo y APIs en la nube, y te ayudan a detectar posibles comportamientos maliciosos de forma interna o externa.

¿Hay un uso de la API inusualmente alto por parte de cualquier identidad de usuario en la última semana?

Mediante el análisis de todos los registros de auditoría de Cloud, la siguiente consulta detecta un uso de la API inusualmente alto por parte de la identidad del usuario en un día determinado de la última semana. Este uso inusualmente alto puede ser un indicador de un posible abuso de la API, una amenaza de usuarios con información privilegiada o credenciales filtradas. Para determinar si hay un valor atípico, esta consulta realiza un análisis estadístico sobre el recuento diario de acciones por principal. Los promedios y las desviaciones estándar se calculan para cada día y principal si se observan los recuentos diarios anteriores con una ventana de visualización de 60 días. Se considera un valor atípico cuando el recuento diario de un usuario supera las tres desviaciones estándar por encima de su media. La consulta, en la que se incluyen el factor de desviación estándar y las ventanas de visualización, se puede configurar para que se ajuste al perfil de actividad de aprovisionamiento en la nube y minimice los falsos positivos.

Análisis de registros


SELECT
  *
FROM (
  SELECT
    *,
    AVG(counter) OVER (
      PARTITION BY principal_email
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
    STDDEV(counter) OVER (
      PARTITION BY principal_email
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
    COUNT(*) OVER (
      PARTITION BY principal_email
      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
  FROM (
    SELECT
      proto_payload.audit_log.authentication_info.principal_email,
      EXTRACT(DATE FROM timestamp) AS day,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.method_name IGNORE NULLS) AS actions,
      COUNT(*) AS counter
    FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
    WHERE
      timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
      AND proto_payload.audit_log.authentication_info.principal_email IS NOT NULL
      AND proto_payload.audit_log.method_name NOT LIKE "storage.%.get"
      AND proto_payload.audit_log.method_name NOT LIKE "v1.compute.%.list"
      AND proto_payload.audit_log.method_name NOT LIKE "beta.compute.%.list"
    GROUP BY
      proto_payload.audit_log.authentication_info.principal_email,
      day
  )
)
WHERE
  counter > avg + 3 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
ORDER BY
  counter DESC

BigQuery


SELECT
  *,
  AVG(counter) OVER (
    PARTITION BY principalEmail
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
  STDDEV(counter) OVER (
    PARTITION BY principalEmail
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
  COUNT(*) OVER (
    PARTITION BY principalEmail
    RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
FROM (
  SELECT
    protopayload_auditlog.authenticationInfo.principalEmail,
    EXTRACT(DATE FROM timestamp) AS day,
    ARRAY_AGG(DISTINCT protopayload_auditlog.methodName IGNORE NULLS) AS actions,
    COUNT(*) AS counter
  FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_*`
  WHERE
    timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
    AND protopayload_auditlog.authenticationInfo.principalEmail IS NOT NULL
    AND protopayload_auditlog.methodName NOT LIKE "storage.%.get"
    AND protopayload_auditlog.methodName NOT LIKE "v1.compute.%.list"
    AND protopayload_auditlog.methodName NOT LIKE "beta.compute.%.list"
  GROUP BY
    protopayload_auditlog.authenticationInfo.principalEmail,
    day
)
WHERE TRUE
QUALIFY
  counter > avg + 3 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
ORDER BY
  counter DESC

¿Cuál es el uso de ajuste de escala automático por día en el último mes?

Mediante el análisis de los registros de auditoría de la actividad del administrador, la siguiente consulta informa el uso del ajuste de escala automático por día durante el último mes. Esta consulta se puede usar para identificar patrones o anomalías que justifiquen una investigación de seguridad adicional.

Análisis de registros


SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  proto_payload.audit_log.method_name,
  COUNT(*) AS counter
FROM
   `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  resource.type = "gce_instance_group_manager"
  AND log_id = "cloudaudit.googleapis.com/activity"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  1, 2

BigQuery


SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  protopayload_auditlog.methodName AS methodName,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance_group_manager"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  1, 2

Preguntas sobre el acceso a los datos

Estas consultas de ejemplo realizan análisis para comprender quién accede a los datos o los modifica en Google Cloud.

¿Qué usuarios accedieron a los datos con mayor frecuencia en la última semana?

En la siguiente consulta, se usan los registros de auditoría de acceso a los datos para encontrar las identidades de los usuarios que accedieron con más frecuencia a los datos de tablas de BigQuery en la última semana.

Análisis de registros


SELECT
  proto_payload.audit_log.authentication_info.principal_email,
  COUNT(*) AS COUNTER
FROM
   `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  (proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.Query")
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
  AND log_id = "cloudaudit.googleapis.com/data_access"
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

BigQuery


SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.Query")
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

¿Qué usuarios accedieron a los datos de la tabla “accounts” en el último mes?

En la siguiente consulta, se usan los registros de auditoría de acceso a los datos para encontrar las identidades de los usuarios que más consultaron una tabla accounts en el último mes. Además de los marcadores de posición MY_DATASET_ID y MY_PROJECT_ID para tu destino de exportación de BigQuery, la siguiente consulta usa los marcadores de posición DATASET_ID y PROJECT_ID. Debes reemplazar los marcadores de posición DATASET_ID y PROJECT_ID para especificar la tabla de destino cuyo acceso se analiza, como la tabla accounts en este ejemplo.

Análisis de registros


SELECT
  proto_payload.audit_log.authentication_info.principal_email,
  COUNT(*) AS COUNTER
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(proto_payload.audit_log.authorization_info) authorization_info
WHERE
  (proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.Query")
  AND authorization_info.permission = "bigquery.tables.getData"
  AND authorization_info.resource = "projects/[PROJECT_ID]/datasets/[DATASET_ID]/tables/accounts"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

BigQuery


SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`,
  UNNEST(protopayload_auditlog.authorizationInfo) authorizationInfo
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.Query")
  AND authorizationInfo.permission = "bigquery.tables.getData"
  AND authorizationInfo.resource = "projects/[PROJECT_ID]/datasets/[DATASET_ID]/tables/accounts"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

¿A qué tablas se accede con más frecuencia y quién accede a ellas?

En la siguiente consulta, se usan los registros de auditoría de acceso a los datos para encontrar las tablas de BigQuery que tienen los datos leídos y modificados con mayor frecuencia en el último mes. Muestra la identidad del usuario asociada junto con el desglose de la cantidad total de veces que se leyeron los datos, en comparación con los modificados.

Análisis de registros


SELECT
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.authentication_info.principal_email,
  COUNTIF(JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataRead") IS NOT NULL) AS dataReadEvents,
  COUNTIF(JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataChange") IS NOT NULL) AS dataChangeEvents,
  COUNT(*) AS totalEvents
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  STARTS_WITH(resource.type, 'bigquery') IS TRUE
  AND (JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataRead") IS NOT NULL
    OR JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataChange") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  5 DESC, 1, 2
LIMIT 1000

BigQuery


SELECT
  protopayload_auditlog.resourceName,
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL) AS dataReadEvents,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL) AS dataChangeEvents,
  COUNT(*) AS totalEvents
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  STARTS_WITH(resource.type, 'bigquery') IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  5 DESC, 1, 2
LIMIT 1000

¿Cuáles fueron las 10 consultas más realizadas en BigQuery en la última semana?

En la siguiente consulta, se usan los registros de auditoría de acceso a los datos para encontrar las consultas más comunes de la última semana. También se enumeran los usuarios correspondientes y las tablas referenciadas.

Análisis de registros


SELECT
  COALESCE(
   JSON_VALUE(proto_payload.audit_log.metadata, "$.jobChange.job.jobConfig.queryConfig.query"),
   JSON_VALUE(proto_payload.audit_log.metadata, "$.jobInsertion.job.jobConfig.queryConfig.query")) as query,
  STRING_AGG(DISTINCT proto_payload.audit_log.authentication_info.principal_email, ',') as users,
  ANY_VALUE(COALESCE(
   JSON_EXTRACT_ARRAY(proto_payload.audit_log.metadata, "$.jobChange.job.jobStats.queryStats.referencedTables"),
   JSON_EXTRACT_ARRAY(proto_payload.audit_log.metadata, "$.jobInsertion.job.jobStats.queryStats.referencedTables"))) as tables,
  COUNT(*) AS counter
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  (resource.type = 'bigquery_project' OR resource.type = 'bigquery_dataset')
  AND operation.last IS TRUE
  AND (JSON_VALUE(proto_payload.audit_log.metadata, "$.jobChange") IS NOT NULL
    OR JSON_VALUE(proto_payload.audit_log.metadata, "$.jobInsertion") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  query
ORDER BY
  counter DESC
LIMIT 10

BigQuery


SELECT
  COALESCE(
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobChange.job.jobConfig.queryConfig.query"),
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobConfig.queryConfig.query")) as query,
  STRING_AGG(DISTINCT protopayload_auditlog.authenticationInfo.principalEmail, ',') as users,
  ANY_VALUE(COALESCE(
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobChange.job.jobStats.queryStats.referencedTables"),
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobStats.queryStats.referencedTables"))) as tables,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  (resource.type = 'bigquery_project' OR resource.type = 'bigquery_dataset')
  AND operation.last IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobChange") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobInsertion") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  query
ORDER BY
  counter DESC
LIMIT 10

¿Cuáles son las acciones más comunes documentadas en los registros de acceso a los datos en el último mes?

En la siguiente consulta, se usan todos los registros de Registros de auditoría de Cloud para encontrar las 100 acciones más frecuentes registradas en el último mes.

Análisis de registros


SELECT
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND log_id="cloudaudit.googleapis.com/data_access"
GROUP BY
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

BigQuery


SELECT
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

Preguntas sobre seguridad de red

Estas consultas de muestra realizan análisis sobre la actividad de tu red en Google Cloud.

¿Hay alguna conexión desde una IP nueva a una subred específica?

La siguiente consulta detecta conexiones desde cualquier dirección IP de origen nueva a una subred determinada mediante el análisis de los registros de flujo de VPC. En este ejemplo, una dirección IP de origen se considera nueva si se vio por primera vez en las últimas 24 horas durante un período de visualización de 60 días. Es recomendable usar y ajustar esta consulta en una subred que esté dentro del alcance de un requisito de cumplimiento en particular, como PCI.

Análisis de registros


SELECT
  JSON_VALUE(json_payload.connection.src_ip) as src_ip,
  -- TIMESTAMP supports up to 6 digits of fractional precision, so drop any more digits to avoid parse errors
  MIN(TIMESTAMP(REGEXP_REPLACE(JSON_VALUE(json_payload.start_time), r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS firstInstance,
  MAX(TIMESTAMP(REGEXP_REPLACE(JSON_VALUE(json_payload.start_time), r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS lastInstance,
  ARRAY_AGG(DISTINCT JSON_VALUE(resource.labels.subnetwork_name)) as subnetNames,
  ARRAY_AGG(DISTINCT JSON_VALUE(json_payload.dest_instance.vm_name)) as vmNames,
  COUNT(*) numSamples
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND JSON_VALUE(json_payload.reporter) = 'DEST'
  AND JSON_VALUE(resource.labels.subnetwork_name) IN ('prod-customer-data')
GROUP BY
  src_ip
HAVING firstInstance >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
ORDER BY
  lastInstance DESC,
  numSamples DESC

BigQuery


SELECT
  jsonPayload.connection.src_ip as src_ip,
  -- TIMESTAMP supports up to 6 digits of fractional precision, so drop any more digits to avoid parse errors
  MIN(TIMESTAMP(REGEXP_REPLACE(jsonPayload.start_time, r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS firstInstance,
  MAX(TIMESTAMP(REGEXP_REPLACE(jsonPayload.start_time, r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS lastInstance,
  ARRAY_AGG(DISTINCT resource.labels.subnetwork_name) as subnetNames,
  ARRAY_AGG(DISTINCT jsonPayload.dest_instance.vm_name) as vmNames,
  COUNT(*) numSamples
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].compute_googleapis_com_vpc_flows`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND jsonPayload.reporter = 'DEST'
  AND resource.labels.subnetwork_name IN ('prod-customer-data')
GROUP BY
  src_ip
HAVING firstInstance >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
ORDER BY
  lastInstance DESC,
  numSamples DESC

¿Hay alguna conexión bloqueada por Google Cloud Armor?

La siguiente consulta ayuda a detectar posibles intentos de exploits mediante el análisis de los registros del balanceador de cargas de aplicaciones externo para encontrar cualquier conexión bloqueada por la política de seguridad configurada en Google Cloud Armor. En esta consulta, se supone que tienes una política de seguridad de Google Cloud Armor configurada en el balanceador de cargas de aplicaciones externo. También se supone que habilitaste el registro del balanceador de cargas de aplicaciones externo como se describe en las instrucciones que proporciona el vínculo Habilitar en la herramienta de permisos de registros.

Análisis de registros


SELECT
  timestamp,
  http_request.remote_ip,
  http_request.request_method,
  http_request.status,
  JSON_VALUE(json_payload.enforcedSecurityPolicy.name) AS security_policy_name,
  JSON_VALUE(resource.labels.backend_service_name) AS backend_service_name,
  http_request.request_url,
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND JSON_VALUE(json_payload.statusDetails) = "denied_by_security_policy"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  httpRequest.remoteIp,
  httpRequest.requestMethod,
  httpRequest.status,
  jsonpayload_type_loadbalancerlogentry.enforcedsecuritypolicy.name,
  resource.labels.backend_service_name,
  httpRequest.requestUrl,
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].requests`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND jsonpayload_type_loadbalancerlogentry.statusdetails = "denied_by_security_policy"
ORDER BY
  timestamp DESC

¿El IDS de Cloud detectó virus o software malicioso de alta gravedad?

En la siguiente consulta, se muestra cualquier virus o software malicioso de alta gravedad que detecta IDS de Cloud mediante la búsqueda de los registros de amenazas de IDS de Cloud. En esta consulta, se supone que tienes un extremo de IDS de Cloud configurado.

Análisis de registros


SELECT
  JSON_VALUE(json_payload.alert_time) AS alert_time,
  JSON_VALUE(json_payload.name) AS name,
  JSON_VALUE(json_payload.details) AS details,
  JSON_VALUE(json_payload.application) AS application,
  JSON_VALUE(json_payload.uri_or_filename) AS uri_or_filename,
  JSON_VALUE(json_payload.ip_protocol) AS ip_protocol,
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="ids.googleapis.com/Endpoint"
  AND JSON_VALUE(json_payload.alert_severity) IN ("HIGH", "CRITICAL")
  AND JSON_VALUE(json_payload.type) = "virus"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  jsonPayload.alert_time,
  jsonPayload.name,
  jsonPayload.details,
  jsonPayload.application,
  jsonPayload.uri_or_filename,
  jsonPayload.ip_protocol
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].ids_googleapis_com_threat`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="ids.googleapis.com/Endpoint"
  AND jsonPayload.alert_severity IN ("HIGH", "CRITICAL")
  AND jsonPayload.type = "virus"
ORDER BY
  timestamp DESC

¿Cuáles son los dominios principales consultados de Cloud DNS desde tu red de VPC?

La siguiente consulta enumera los 10 dominios consultados de Cloud DNS principales de tus redes de VPC en los últimos 60 días. En esta consulta, se supone que habilitaste el registro de Cloud DNS para tus redes de VPC, como se describe en las instrucciones que proporciona el vínculo Habilitar en la herramienta de permisos de registro..

Análisis de registros


SELECT
  JSON_VALUE(json_payload.queryName) AS query_name,
  COUNT(*) AS total_queries
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND log_id="dns.googleapis.com/dns_queries"
GROUP BY
  query_name
ORDER BY
  total_queries DESC
LIMIT
  10

BigQuery


SELECT
 jsonPayload.queryname AS query_name,
 COUNT(*) AS total_queries
FROM
 `[MY_PROJECT_ID].[MY_DATASET_ID].dns_googleapis_com_dns_queries`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
GROUP BY
 query_name
ORDER BY
 total_queries DESC
LIMIT
 10

¿Qué sigue?