Enviar resultados a BigQuery para analizarlos

En esta página se describe cómo transmitir las nuevas detecciones y las actualizadas a un conjunto de datos de BigQuery mediante la función de exportación de Security Command Center para BigQuery. Los resultados que ya existan no se enviarán a BigQuery a menos que se actualicen.

BigQuery es el almacén de datos de analíticas rentable, totalmente gestionado y a escala de petabytes de Google Cloudcon el que puedes ejecutar analíticas de grandes cantidades de datos casi en tiempo real. Puede usar BigQuery para ejecutar consultas en las detecciones nuevas y actualizadas, filtrar datos para encontrar lo que necesita y generar informes personalizados. Para obtener más información sobre BigQuery, consulta la documentación de BigQuery.

Información general

Cuando habilitas esta función, las nuevas detecciones que se escriben en Security Command Center se exportan a una tabla de BigQuery casi en tiempo real. Después, puede integrar los datos en los flujos de trabajo que ya tenga y crear análisis personalizados. Puedes habilitar esta función a nivel de organización, carpeta y proyecto para exportar resultados según tus requisitos.

Esta función es la forma recomendada de exportar resultados de Security Command Center a BigQuery, ya que está totalmente gestionada y no requiere realizar operaciones manuales ni escribir código personalizado.

Estructura del conjunto de datos

Esta función añade cada nuevo resultado y sus actualizaciones posteriores como filas nuevas en la tabla findings, que se agrupa por source_id, finding_id y event_time.

Cuando se actualiza un resultado, esta función crea varios registros de resultados con los mismos valores de source_id y finding_id, pero con valores de event_time diferentes. Esta estructura de conjunto de datos te permite ver cómo cambia el estado de cada resultado a lo largo del tiempo.

Tenga en cuenta que puede haber entradas duplicadas en su conjunto de datos. Para analizarlos, puedes usar la cláusula DISTINCT, como se muestra en la primera consulta de ejemplo.

Cada conjunto de datos contiene una tabla findings con los siguientes campos:

Campo Descripción
source_id

Es un identificador único que Security Command Center asigna a la fuente de un hallazgo. Por ejemplo, todas las detecciones de la fuente Detección de anomalías de Cloud tienen el mismo valor source_id.

Ejemplo: 1234567890

finding_id Identificador único que representa la detección. Es único en una fuente de una organización. Es alfanumérico y tiene 32 caracteres o menos.
event_time

Hora en la que se produjo el evento o la hora en la que se actualizó el resultado. Por ejemplo, si el resultado representa un firewall abierto, event_time captura la hora en la que el detector cree que se abrió el firewall. Si el hallazgo se resuelve después, esta hora refleja el momento en que se resolvió.

Ejemplo: 2019-09-26 12:48:00.985000 UTC

bulk_export_id

En el caso de las exportaciones en bloque (Vista previa), se trata de un UUID.

En el caso de las exportaciones continuas, este campo está vacío.

finding

Un registro de datos de evaluación, como seguridad, riesgos, salud o privacidad, que se ingiere en Security Command Center para su presentación, notificación, análisis, prueba de políticas y aplicación. Por ejemplo, una vulnerabilidad de cross-site scripting (XSS) en una aplicación de App Engine es un resultado.

Para obtener más información sobre los campos anidados, consulta la referencia de la API del objeto Finding.

resource

Información relacionada con el Google Cloud recurso asociado a este resultado.

Para obtener más información sobre los campos anidados, consulta la referencia de la API del objeto Resource.

Coste

Se te aplican cargos de BigQuery relacionados con esta función. Para obtener más información, consulta los precios de BigQuery.

Antes de empezar

Debe completar estos pasos antes de habilitar esta función.

Configurar permisos

Para completar esta guía, debes tener los siguientes roles de Gestión de Identidades y Accesos (IAM):

Crear un conjunto de datos de BigQuery

Crea un conjunto de datos de BigQuery. Para obtener más información, consulta el artículo sobre cómo crear conjuntos de datos.

Planificar la residencia de datos

Si la residencia de datos está habilitada en Security Command Center, las configuraciones que definen las exportaciones de streaming a BigQuery (recursos BigQueryExport) están sujetas al control de residencia de datos y se almacenan en una ubicación de Security Command Center que elijas.

Para exportar resultados de una ubicación de Security Command Center a BigQuery, debe configurar la exportación de BigQuery en la misma ubicación de Security Command Center que los resultados.

Como los filtros que se usan en las exportaciones de BigQuery pueden contener datos sujetos a controles de residencia, asegúrate de especificar la ubicación correcta antes de crearlos. Security Command Center no restringe la ubicación en la que creas las exportaciones.

Las exportaciones de BigQuery solo se almacenan en la ubicación en la que se crean y no se pueden ver ni editar en otras ubicaciones.

Una vez que haya creado una exportación de BigQuery, no podrá cambiar su ubicación. Para cambiar la ubicación, debe eliminar la exportación de BigQuery y volver a crearla en la nueva ubicación.

Para saber cómo usar Security Command Center cuando la residencia de datos está habilitada, consulta Endpoints regionales de Security Command Center.

Exportar resultados de Security Command Center a BigQuery

Para exportar resultados, primero habilita la API de Security Command Center.

Habilitar la API de Security Command Center

Para habilitar la API de Security Command Center, sigue estos pasos:

  1. Ve a la página Biblioteca de APIs de la Google Cloud consola.

    Ir a la biblioteca de APIs

  2. Selecciona el proyecto en el que quieras habilitar la API de Security Command Center.

  3. En el cuadro Buscar, escribe Security Command Center y, a continuación, haz clic en Security Command Center en los resultados de búsqueda.

  4. En la página de la API que aparece, haz clic en Habilitar.

La API de Security Command Center está habilitada en tu proyecto. A continuación, usa la CLI de gcloud para crear una configuración de exportación a BigQuery.

Conceder acceso al perímetro en Controles de Servicio de VPC

Si usas Controles de Servicio de VPC y tu conjunto de datos de BigQuery forma parte de un proyecto que está dentro de un perímetro de servicio, debes conceder acceso a los proyectos para exportar las detecciones.

Para conceder acceso a los proyectos, crea reglas de entrada y de salida para las entidades de seguridad y los proyectos de los que exportes resultados. Las reglas permiten acceder a los recursos protegidos y dejan que BigQuery verifique que los usuarios tienen el permiso setIamPolicy en el conjunto de datos de BigQuery.

Antes de configurar una nueva exportación a BigQuery

Consola

  1. En la Google Cloud consola, ve a la página Controles de Servicio de VPC.

    Ir a Controles de Servicio de VPC

  2. Selecciona tu organización o proyecto.
  3. Si has seleccionado una organización, haz clic en Seleccionar una política de acceso y, a continuación, selecciona la política de acceso asociada al perímetro que quieras actualizar.
  4. Haz clic en el nombre del perímetro que quieras actualizar.

    Para encontrar el perímetro de servicio que quieres modificar, puedes consultar tus registros para ver las entradas que muestran infracciones de RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER. En esas entradas, comprueba el campo servicePerimeterName:

    accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME
  5. Haz clic en Editar perímetro.
  6. Haz clic en Política de salida.
  7. Haz clic en Añadir una regla de salida.
  8. En la sección DE, define los siguientes detalles:

    1. En Identidad, selecciona Seleccionar identidades y grupos.
    2. Haz clic en Añadir identidades.
    3. Introduce la dirección de correo del principal que se ha usado para llamar a la API de Security Command Center.

    4. Selecciona el principal o pulsa INTRO y, a continuación, haz clic en Añadir identidades.
  9. En la sección PARA, indica los siguientes detalles:

    1. En Proyecto, selecciona Todos los proyectos.
    2. En Roles de operaciones o de gestión de identidades y accesos, selecciona Seleccionar operaciones.
    3. Haz clic en Añadir operaciones y, a continuación, añade las siguientes operaciones:

      • Añade el servicio bigquery.googleapis.com.
        1. Haz clic en Todos los métodos.
        2. Haz clic en Añadir todos los métodos.
  10. Haz clic en Política de entrada.
  11. Haz clic en Añadir una regla de entrada.
  12. En la sección DE, define los siguientes detalles:

    1. En Identidad, selecciona Seleccionar identidades y grupos.
    2. Haz clic en Añadir identidades.
    3. Introduce la dirección de correo del principal que se ha usado para llamar a la API de Security Command Center.

    4. Selecciona el principal o pulsa INTRO y, a continuación, haz clic en Añadir identidades.
    5. En Fuentes, selecciona Todas las fuentes.
  13. En la sección PARA, indica los siguientes detalles:

    1. En Proyecto, selecciona Seleccionar proyectos.
    2. Haga clic en Añadir proyectos y, a continuación, añada el proyecto que contiene el conjunto de datos de BigQuery.
    3. En Roles de operaciones o de gestión de identidades y accesos, selecciona Seleccionar operaciones.
    4. Haz clic en Añadir operaciones y, a continuación, añade las siguientes operaciones:

      • Añade el servicio bigquery.googleapis.com.
        1. Haz clic en Todos los métodos.
        2. Haz clic en Añadir todos los métodos.
  14. Haz clic en Guardar.

gcloud

  1. Si aún no se ha definido un proyecto de cuota, hazlo. Elige un proyecto que tenga habilitada la API Access Context Manager.

    gcloud config set billing/quota_project QUOTA_PROJECT_ID

    Sustituye QUOTA_PROJECT_ID por el ID del proyecto que quieras usar para la facturación y la cuota.

  2. Crea un archivo llamado egress-rule.yaml con el siguiente contenido:

    - egressFrom:
        identities:
        - PRINCIPAL_ADDRESS
      egressTo:
        operations:
        - serviceName: bigquery.googleapis.com
          methodSelectors:
          - method: '*'
        resources:
        - '*'

    Sustituye PRINCIPAL_ADDRESS por la dirección de la cuenta principal que se ha usado para llamar a la API de Security Command Center.

  3. Crea un archivo llamado ingress-rule.yaml con el siguiente contenido:

    - ingressFrom:
        identities:
        - PRINCIPAL_ADDRESS
        sources:
        - accessLevel: '*'
      ingressTo:
        operations:
        - serviceName: bigquery.googleapis.com
          methodSelectors:
          - method: '*'
        resources:
        - '*'

    Sustituye PRINCIPAL_ADDRESS por la dirección de la cuenta principal que se ha usado para llamar a la API de Security Command Center.

  4. Añade la regla de salida al perímetro:

    gcloud access-context-manager perimeters update PERIMETER_NAME \
        --set-egress-policies=egress-rule.yaml

    Haz los cambios siguientes:

    • PERIMETER_NAME: el nombre del perímetro. Por ejemplo, accessPolicies/1234567890/servicePerimeters/example_perimeter.

      Para encontrar el perímetro de servicio que quieres modificar, puedes consultar tus registros para ver las entradas que muestran infracciones de RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER. En esas entradas, comprueba el campo servicePerimeterName:

      accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME
  5. Añade la regla de entrada al perímetro:

    gcloud access-context-manager perimeters update PERIMETER_NAME \
        --set-ingress-policies=ingress-rule.yaml

    Haz los cambios siguientes:

    • PERIMETER_NAME: el nombre del perímetro. Por ejemplo, accessPolicies/1234567890/servicePerimeters/example_perimeter.

      Para encontrar el perímetro de servicio que quieres modificar, puedes consultar tus registros para ver las entradas que muestran infracciones de RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER. En esas entradas, comprueba el campo servicePerimeterName:

      accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME

Consulta más información sobre las reglas de entrada y salida.

Configurar una nueva exportación a BigQuery

En este paso, creará una configuración de exportación para exportar las detecciones a una instancia de BigQuery. Puede crear configuraciones de exportación a nivel de proyecto, carpeta u organización. Por ejemplo, si quiere exportar resultados de un proyecto a un conjunto de datos de BigQuery, cree una configuración de exportación a nivel de proyecto para exportar solo los resultados relacionados con ese proyecto. También puede especificar filtros para exportar solo determinados resultados.

Asegúrate de crear las configuraciones de exportación en el nivel adecuado. Por ejemplo, si crea una configuración de exportación en el proyecto B para exportar resultados del proyecto A y define filtros como resource.project_display_name: project-a-id, la configuración no exportará ningún resultado.

Puedes crear un máximo de 500 configuraciones de exportación a BigQuery para tu organización. Puedes usar el mismo conjunto de datos para varias configuraciones de exportación. Si usas el mismo conjunto de datos, todos los cambios se harán en la misma tabla de resultados.

Cuando creas tu primera configuración de exportación, se crea automáticamente una cuenta de servicio. Esta cuenta de servicio es necesaria para crear o actualizar la tabla de resultados de un conjunto de datos y para exportar resultados a la tabla. Tiene el formato service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gservicaccount.com y se le asigna el rol Editor de datos de BigQuery (roles/bigquery.dataEditor) en el nivel del conjunto de datos de BigQuery.

En la consola de Google Cloud , algunos recursos de BigQueryExport pueden tener la etiqueta Antiguo, que indica que se crearon con la API Security Command Center v1. Puedes gestionar estos recursos de BigQueryExport Google Cloud con la consola, la CLI de gcloud, la API de Security Command Center v1 o las bibliotecas de cliente v1 de Security Command Center.

Para gestionar estos recursos de BigQueryExport con gcloud CLI, no debes especificar una ubicación al ejecutar el comando gcloud CLI.

gcloud

  1. Ve a la Google Cloud consola.

    Ir a la Google Cloud consola

  2. Selecciona el proyecto en el que has habilitado la API de Security Command Center.

  3. Haz clic en Activar Cloud Shell.

  4. Para crear una configuración de exportación, ejecuta el siguiente comando:

    gcloud scc bqexports create BIGQUERY_EXPORT \
        --dataset=DATASET_NAME \
        --folder=FOLDER_ID | --organization=ORGANIZATION_ID | --project=PROJECT_ID \
        --location=LOCATION \
        [--description=DESCRIPTION] \
        [--filter=FILTER]
    

    Haz los cambios siguientes:

    • BIGQUERY_EXPORT con un nombre para esta configuración de exportación.
    • DATASET_NAME con el nombre del conjunto de datos de BigQuery. Por ejemplo, projects/PROJECT_ID/datasets/DATASET_ID.
    • FOLDER_ID, ORGANIZATION_ID o PROJECT_ID con el nombre de la carpeta, la organización o el proyecto. Debes definir una de estas opciones. En el caso de las carpetas y las organizaciones, el nombre es el ID de la carpeta o el ID de la organización. En el caso de los proyectos, el nombre es el número o el ID del proyecto.
    • LOCATION: la ubicación de Security Command Center en la que se creará una configuración de exportación. Si la residencia de datos está habilitada, usa eu, sa o us. De lo contrario, usa el valor global.
    • DESCRIPTION con una descripción legible por humanos de la configuración de exportación. Esta variable es opcional.
    • FILTER con una expresión que define qué resultados se incluirán en la exportación. Por ejemplo, si quiere filtrar por la categoría XSS_SCRIPTING, escriba "category=\"XSS_SCRIPTING\". Esta variable es opcional.

Terraform

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform. Para obtener más información, consulta la documentación de referencia del proveedor Terraform.

Para crear una configuración de exportación para una organización, sigue estos pasos:

resource "google_bigquery_dataset" "default" {
  dataset_id                  = "my-dataset"
  friendly_name               = "test"
  description                 = "This is a test description"
  location                    = "US"
  default_table_expiration_ms = 3600000
  default_partition_expiration_ms = null

  labels = {
    env = "default"
  }

  lifecycle {
    ignore_changes = [default_partition_expiration_ms]
  }
}

resource "google_scc_v2_organization_scc_big_query_export" "custom_big_query_export_config" {
  name         = "my-export"
  big_query_export_id    = "my-export"
  organization = "123456789"
  dataset      = google_bigquery_dataset.default.id
  location     = "global"
  description  = "Cloud Security Command Center Findings Big Query Export Config"
  filter       = "state=\"ACTIVE\" AND NOT mute=\"MUTED\""
}

Crea una configuración de exportación para una carpeta:

resource "google_folder" "folder" {
  parent       = "organizations/123456789"
  display_name = "folder-name"

  deletion_protection = false
}

resource "google_bigquery_dataset" "default" {
  dataset_id                  = "my_dataset_id"
  friendly_name               = "test"
  description                 = "This is a test description"
  location                    = "US"
  default_table_expiration_ms = 3600000
  default_partition_expiration_ms = null

  labels = {
    env = "default"
  }

  lifecycle {
    ignore_changes = [default_partition_expiration_ms]
  }
}

resource "google_scc_v2_folder_scc_big_query_export" "custom_big_query_export_config" {
  big_query_export_id    = "my-export"
  folder       = google_folder.folder.folder_id
  dataset      = google_bigquery_dataset.default.id
  location     = "global"
  description  = "Cloud Security Command Center Findings Big Query Export Config"
  filter       = "state=\"ACTIVE\" AND NOT mute=\"MUTED\""
}

Para crear una configuración de exportación de un proyecto, sigue estos pasos:

resource "google_bigquery_dataset" "default" {
  dataset_id                  = "my_dataset_id"
  friendly_name               = "test"
  description                 = "This is a test description"
  location                    = "US"
  default_table_expiration_ms = 3600000
  default_partition_expiration_ms = null

  labels = {
    env = "default"
  }

  lifecycle {
    ignore_changes = [default_partition_expiration_ms]
  }
}

resource "google_scc_v2_project_scc_big_query_export" "custom_big_query_export_config" {
  name         = "my-export"
  big_query_export_id    = "my-export"
  project      = "my-project-name"
  dataset      = google_bigquery_dataset.default.id
  location     = "global"
  description  = "Cloud Security Command Center Findings Big Query Export Config"
  filter       = "state=\"ACTIVE\" AND NOT mute=\"MUTED\""
}

Java

Para autenticarte en Security Command Center, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo sobre cómo configurar ADC en un entorno de desarrollo local.


import com.google.cloud.securitycenter.v2.BigQueryExport;
import com.google.cloud.securitycenter.v2.CreateBigQueryExportRequest;
import com.google.cloud.securitycenter.v2.OrganizationLocationName;
import com.google.cloud.securitycenter.v2.SecurityCenterClient;
import java.io.IOException;
import java.util.UUID;

public class CreateBigQueryExport {

  public static void main(String[] args) throws IOException {
    // TODO(Developer): Modify the following variable values.
    // organizationId: Google Cloud Organization id.
    String organizationId = "{google-cloud-organization-id}";

    // projectId: Google Cloud Project id.
    String projectId = "{your-project}";

    // Specify the location.
    String location = "global";

    // filter: Expression that defines the filter to apply across create/update events of findings.
    String filter = "severity=\"LOW\" OR severity=\"MEDIUM\"";

    // bigQueryDatasetId: The BigQuery dataset to write findings' updates to.
    String bigQueryDatasetId = "{bigquery-dataset-id}";

    // bigQueryExportId: Unique identifier provided by the client.
    // For more info, see:
    // https://cloud.google.com/security-command-center/docs/how-to-analyze-findings-in-big-query#export_findings_from_to
    String bigQueryExportId = "default-" + UUID.randomUUID().toString().split("-")[0];

    createBigQueryExport(organizationId, location, projectId, filter, bigQueryDatasetId,
        bigQueryExportId);
  }

  // Create export configuration to export findings from a project to a BigQuery dataset.
  // Optionally specify filter to export certain findings only.
  public static BigQueryExport createBigQueryExport(String organizationId, String location,
      String projectId, String filter, String bigQueryDatasetId, String bigQueryExportId)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (SecurityCenterClient client = SecurityCenterClient.create()) {
      OrganizationLocationName organizationName = OrganizationLocationName.of(organizationId,
          location);
      // Create the BigQuery export configuration.
      BigQueryExport bigQueryExport =
          BigQueryExport.newBuilder()
              .setDescription(
                  "Export low and medium findings if the compute resource "
                      + "has an IAM anomalous grant")
              .setFilter(filter)
              .setDataset(String.format("projects/%s/datasets/%s", projectId, bigQueryDatasetId))
              .build();

      CreateBigQueryExportRequest bigQueryExportRequest =
          CreateBigQueryExportRequest.newBuilder()
              .setParent(organizationName.toString())
              .setBigQueryExport(bigQueryExport)
              .setBigQueryExportId(bigQueryExportId)
              .build();

      // Create the export request.
      BigQueryExport response = client.createBigQueryExport(bigQueryExportRequest);

      System.out.printf("BigQuery export request created successfully: %s\n", response.getName());
      return response;
    }
  }
}

Python

Para autenticarte en Security Command Center, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo sobre cómo configurar ADC en un entorno de desarrollo local.



def create_bigquery_export(
    parent: str, export_filter: str, bigquery_dataset_id: str, bigquery_export_id: str
):
    from google.cloud import securitycenter_v2

    """
    Create export configuration to export findings from a project to a BigQuery dataset.
    Optionally specify filter to export certain findings only.

    Args:
        parent: Use any one of the following resource paths:
             - organizations/{organization_id}/locations/{location_id}
             - folders/{folder_id}/locations/{location_id}
             - projects/{project_id}/locations/{location_id}
        export_filter: Expression that defines the filter to apply across create/update events of findings.
        bigquery_dataset_id: The BigQuery dataset to write findings' updates to.
             - projects/{PROJECT_ID}/datasets/{BIGQUERY_DATASET_ID}
        bigquery_export_id: Unique identifier provided by the client.
             - example id: f"default-{str(uuid.uuid4()).split('-')[0]}"
        For more info, see:
        https://cloud.google.com/security-command-center/docs/how-to-analyze-findings-in-big-query#export_findings_from_to
    """
    client = securitycenter_v2.SecurityCenterClient()

    # Create the BigQuery export configuration.
    bigquery_export = securitycenter_v2.BigQueryExport()
    bigquery_export.description = "Export low and medium findings if the compute resource has an IAM anomalous grant"
    bigquery_export.filter = export_filter
    bigquery_export.dataset = bigquery_dataset_id

    request = securitycenter_v2.CreateBigQueryExportRequest()
    request.parent = parent
    request.big_query_export = bigquery_export
    request.big_query_export_id = bigquery_export_id

    # Create the export request.
    response = client.create_big_query_export(request)

    print(f"BigQuery export request created successfully: {response.name}\n")
    return response

Deberías ver las detecciones en tu conjunto de datos de BigQuery unos 15 minutos después de crear la configuración de exportación. Una vez creada la tabla de BigQuery, las nuevas detecciones y las detecciones actualizadas que coincidan con tu filtro y tu ámbito aparecerán en la tabla prácticamente en tiempo real.

Para revisar los resultados, consulta Revisar resultados.

Crea una regla de entrada para la nueva exportación a BigQuery

Si usas Controles de Servicio de VPC y tu conjunto de datos de BigQuery forma parte de un proyecto que está dentro de un perímetro de servicio, debes crear una regla de entrada para una nueva exportación a BigQuery.

Consola

  1. Vuelve a abrir el perímetro de servicio de la sección anterior.

    Ir a Controles de Servicio de VPC

  2. Haz clic en Política de entrada.
  3. Haz clic en Añadir una regla de entrada.
  4. En la sección DE, define los siguientes detalles:

    1. En Identidad, selecciona Seleccionar identidades y grupos.
    2. Haz clic en Añadir identidades.
    3. Escribe la dirección de correo del agente de servicio de la configuración de exportación de BigQuery. La dirección del agente de servicio tiene el siguiente formato:

      service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gserviceaccount.com

      Sustituye ORGANIZATION_ID por el ID de tu organización.

    4. Selecciona el agente de servicio o pulsa INTRO y, a continuación, haz clic en Añadir identidades.
    5. En Fuentes, selecciona Todas las fuentes.
  5. En la sección PARA, indica los siguientes detalles:

    1. En Proyecto, selecciona Seleccionar proyectos.
    2. Haga clic en Añadir proyectos y, a continuación, añada el proyecto que contiene el conjunto de datos de BigQuery.
    3. En Roles de operaciones o de gestión de identidades y accesos, selecciona Seleccionar operaciones.
    4. Haz clic en Añadir operaciones y, a continuación, añade las siguientes operaciones:

      • Añade el servicio bigquery.googleapis.com.
        1. Haz clic en Todos los métodos.
        2. Haz clic en Añadir todos los métodos.
  6. Haz clic en Guardar.

gcloud

  1. Si aún no se ha definido un proyecto de cuota, hazlo. Elige un proyecto que tenga habilitada la API Access Context Manager.

    gcloud config set billing/quota_project QUOTA_PROJECT_ID

    Sustituye QUOTA_PROJECT_ID por el ID del proyecto que quieras usar para la facturación y la cuota.

  2. Crea un archivo llamado ingress-rule.yaml con el siguiente contenido:

    - ingressFrom:
        identities:
        - serviceAccount:service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gserviceaccount.com
        sources:
        - accessLevel: '*'
      ingressTo:
        operations:
        - serviceName: bigquery.googleapis.com
          methodSelectors:
          - method: '*'
        resources:
        - '*'

    Sustituye ORGANIZATION_ID por el ID de tu organización.

  3. Añade la regla de entrada al perímetro:

    gcloud access-context-manager perimeters update PERIMETER_NAME \
        --set-ingress-policies=ingress-rule.yaml

    Haz los cambios siguientes:

    • PERIMETER_NAME: el nombre del perímetro. Por ejemplo, accessPolicies/1234567890/servicePerimeters/example_perimeter.

      Para encontrar el perímetro de servicio que quieres modificar, puedes consultar tus registros para ver las entradas que muestran infracciones de RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER. En esas entradas, comprueba el campo servicePerimeterName:

      accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME

Consulta más información sobre las reglas de entrada y salida.

Los proyectos, usuarios y cuentas de servicio seleccionados ahora pueden acceder a los recursos protegidos y exportar resultados.

Si ha seguido todos los pasos de esta guía y las exportaciones funcionan correctamente, ahora puede eliminar lo siguiente:

  • La regla de entrada de la cuenta principal
  • La regla de salida de la cuenta principal

Esas reglas solo eran necesarias para configurar la exportación. Sin embargo, para que las configuraciones de exportación sigan funcionando, debes mantener la regla de entrada que creaste anteriormente, que permite que Security Command Center exporte las detecciones a tu conjunto de datos de BigQuery situado detrás del perímetro de servicio.

Ver los detalles de una configuración de exportación

gcloud

  1. Ve a la Google Cloud consola.

    Ir a la Google Cloud consola

  2. Selecciona el proyecto en el que has habilitado la API de Security Command Center.

  3. Haz clic en Activar Cloud Shell.

  4. Para verificar los detalles de la configuración de exportación, ejecuta el siguiente comando:

    gcloud scc bqexports get BIGQUERY_EXPORT \
        --folder=FOLDER_ID | --organization=ORGANIZATION_ID | --project=PROJECT_ID \
        --location=LOCATION
    

    Haz los cambios siguientes:

    • BIGQUERY_EXPORT con el nombre de esta configuración de exportación.
    • FOLDER_ID, ORGANIZATION_ID o PROJECT_ID con el nombre de la carpeta, la organización o el proyecto. Debes definir una de estas opciones. En el caso de las carpetas y las organizaciones, el nombre es el ID de la carpeta o el ID de la organización. En el caso de los proyectos, el nombre es el número o el ID del proyecto.
    • LOCATION: la ubicación de Security Command Center en la que se creará una configuración de exportación. Si la residencia de datos está habilitada, usa eu, sa o us. De lo contrario, usa el valor global.

      Por ejemplo, para obtener una configuración de exportación llamada my-bq-export de una organización con el ID 123, ejecuta el siguiente comando:

      gcloud scc bqexports get my-bq-export \
          --organization=123 \
          --location=global
      

Actualizar una configuración de exportación

Si es necesario, puede modificar el filtro, el conjunto de datos y la descripción de una configuración de exportación. No puedes cambiar el nombre de la configuración de exportación.

gcloud

  1. Ve a la Google Cloud consola.

    Ir a la Google Cloud consola

  2. Selecciona el proyecto en el que has habilitado la API de Security Command Center.

  3. Haz clic en Activar Cloud Shell.

  4. Para actualizar una configuración de exportación, ejecuta el siguiente comando:

    gcloud scc bqexports update BIGQUERY_EXPORT \
        --dataset=DATASET_NAME \
        --folder=FOLDER_ID | --organization=ORGANIZATION_ID | --project=PROJECT_ID \
        --location=LOCATION \
        [--description=DESCRIPTION] \
        [--filter=FILTER]
    

    Haz los cambios siguientes:

    • BIGQUERY_EXPORT con el nombre de la configuración de exportación que quieras actualizar.
    • DATASET_NAME con el nombre del conjunto de datos de BigQuery. Por ejemplo, projects/PROJECT_ID/datasets/DATASET_ID.
    • FOLDER_ID, ORGANIZATION_ID o PROJECT_ID con el nombre de la carpeta, la organización o el proyecto. Debes definir una de estas opciones. En el caso de las carpetas y las organizaciones, el nombre es el ID de la carpeta o el ID de la organización. En el caso de los proyectos, el nombre es el número o el ID del proyecto.
    • LOCATION: la ubicación de Security Command Center en la que se va a actualizar la configuración de exportación. Si la residencia de datos está habilitada, usa eu, sa o us. De lo contrario, usa el valor global.
    • DESCRIPTION con una descripción legible por humanos de la configuración de exportación. Esta variable es opcional.
    • FILTER con una expresión que define qué resultados se incluirán en la exportación. Por ejemplo, si quiere filtrar por la categoría XSS_SCRIPTING, escriba "category=\"XSS_SCRIPTING\". Esta variable es opcional.

Ver todas las configuraciones de exportación

Puede ver todas las configuraciones de exportación de su organización, carpeta o proyecto.

gcloud

  1. Ve a la Google Cloud consola.

    Ir a la Google Cloud consola

  2. Selecciona el proyecto en el que has habilitado la API de Security Command Center.

  3. Haz clic en Activar Cloud Shell.

  4. Para enumerar las configuraciones de exportación, ejecuta el siguiente comando:

    gcloud scc bqexports list \
        --folder=FOLDER_ID | --organization=ORGANIZATION_ID | --project=PROJECT_ID \
        --location=LOCATION \
        [--limit=LIMIT] \
        [--page-size=PAGE_SIZE]
    

    Haz los cambios siguientes:

    • FOLDER_ID, ORGANIZATION_ID o PROJECT_ID con el nombre de la carpeta, la organización o el proyecto. Debes definir una de estas opciones. En el caso de las carpetas y las organizaciones, el nombre es el ID de la carpeta o el ID de la organización. En el caso de los proyectos, el nombre es el número o el ID del proyecto.

      Si especifica un ID de organización, la lista incluirá todas las configuraciones de exportación definidas en esa organización, incluidas las de nivel de carpeta y de proyecto. Si especifica un ID de carpeta, la lista incluirá todas las configuraciones de exportación definidas a nivel de carpeta y en los proyectos de esa carpeta. Si especifica un número o un ID de proyecto, la lista incluirá solo las configuraciones de exportación de ese proyecto.

    • LOCATION: la ubicación de Security Command Centeren la que se deben enumerar las configuraciones de exportación. Si la residencia de datos está habilitada, usa eu, sa o us. De lo contrario, usa el valor global.

    • LIMIT con el número de configuraciones de exportación que quieras ver. Esta variable es opcional.

    • PAGE_SIZE con un valor de tamaño de página. Esta variable es opcional.

Java

Para autenticarte en Security Command Center, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo sobre cómo configurar ADC en un entorno de desarrollo local.


import com.google.cloud.securitycenter.v2.BigQueryExport;
import com.google.cloud.securitycenter.v2.ListBigQueryExportsRequest;
import com.google.cloud.securitycenter.v2.OrganizationLocationName;
import com.google.cloud.securitycenter.v2.SecurityCenterClient;
import com.google.cloud.securitycenter.v2.SecurityCenterClient.ListBigQueryExportsPagedResponse;
import java.io.IOException;

public class ListBigQueryExports {

  public static void main(String[] args) throws IOException {
    // TODO(Developer): Modify the following variable values.
    // organizationId: Google Cloud Organization id.
    String organizationId = "{google-cloud-organization-id}";

    // Specify the location to list the findings.
    String location = "global";

    listBigQueryExports(organizationId, location);
  }

  // List BigQuery exports in the given parent.
  public static ListBigQueryExportsPagedResponse listBigQueryExports(String organizationId,
      String location) throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (SecurityCenterClient client = SecurityCenterClient.create()) {
      OrganizationLocationName organizationName = OrganizationLocationName.of(organizationId,
          location);

      ListBigQueryExportsRequest request = ListBigQueryExportsRequest.newBuilder()
          .setParent(organizationName.toString())
          .build();

      ListBigQueryExportsPagedResponse response = client.listBigQueryExports(request);

      System.out.println("Listing BigQuery exports:");
      for (BigQueryExport bigQueryExport : response.iterateAll()) {
        System.out.println(bigQueryExport.getName());
      }
      return response;
    }
  }
}

Python

Para autenticarte en Security Command Center, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo sobre cómo configurar ADC en un entorno de desarrollo local.

def list_bigquery_exports(parent: str):
    from google.cloud import securitycenter_v2

    """
    List BigQuery exports in the given parent.
    Args:
         parent: The parent which owns the collection of BigQuery exports.
             Use any one of the following resource paths:
                 - organizations/{organization_id}/locations/{location_id}
                 - folders/{folder_id}/locations/{location_id}
                 - projects/{project_id}/locations/{location_id}
    """

    client = securitycenter_v2.SecurityCenterClient()

    request = securitycenter_v2.ListBigQueryExportsRequest()
    request.parent = parent

    response = client.list_big_query_exports(request)

    print("Listing BigQuery exports:")
    for bigquery_export in response:
        print(bigquery_export.name)
    return response

Eliminar una configuración de exportación

Si ya no necesita una configuración de exportación, puede eliminarla.

gcloud

  1. Ve a la Google Cloud consola.

    Ir a la Google Cloud consola

  2. Selecciona el proyecto en el que has habilitado la API de Security Command Center.

  3. Haz clic en Activar Cloud Shell.

  4. Para eliminar una configuración de exportación, ejecuta el siguiente comando:

    gcloud scc bqexports delete BIGQUERY_EXPORT \
        --folder=FOLDER_ID | --organization=ORGANIZATION_ID | --project=PROJECT_ID \
        --location=LOCATION
    

    Haz los cambios siguientes:

    • BIGQUERY_EXPORT con el nombre de la configuración de exportación que quieras eliminar.
    • FOLDER_ID, ORGANIZATION_ID o PROJECT_ID con el nombre de la carpeta, la organización o el proyecto. Debes definir una de estas opciones. En el caso de las carpetas y las organizaciones, el nombre es el ID de la carpeta o el ID de la organización. En el caso de los proyectos, el nombre es el número o el ID del proyecto.
    • LOCATION: la ubicación de Security Command Center en la que se va a eliminar la configuración de exportación. Si la residencia de datos está habilitada, usa eu, sa o us. De lo contrario, usa el valor global.

      Por ejemplo, para eliminar una configuración de exportación llamada my-bq-export de una organización cuyo ID es 123, ejecuta el siguiente comando:

      gcloud scc bqexports delete my-bq-export \
          --organization=123 \
          --location=global
      

Java

Para autenticarte en Security Command Center, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo sobre cómo configurar ADC en un entorno de desarrollo local.


import com.google.cloud.securitycenter.v2.BigQueryExportName;
import com.google.cloud.securitycenter.v2.DeleteBigQueryExportRequest;
import com.google.cloud.securitycenter.v2.SecurityCenterClient;
import java.io.IOException;

public class DeleteBigQueryExport {

  public static void main(String[] args) throws IOException {
    // TODO(Developer): Modify the following variable values.
    // organizationId: Google Cloud Organization id.
    String organizationId = "{google-cloud-organization-id}";

    // Specify the location to list the findings.
    String location = "global";

    // bigQueryExportId: Unique identifier that is used to identify the export.
    String bigQueryExportId = "{bigquery-export-id}";

    deleteBigQueryExport(organizationId, location, bigQueryExportId);
  }

  // Delete an existing BigQuery export.
  public static void deleteBigQueryExport(String organizationId, String location,
      String bigQueryExportId)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (SecurityCenterClient client = SecurityCenterClient.create()) {
      // Optionally BigQueryExportName or String can be used
      // String bigQueryExportName = String.format("organizations/%s/locations/%s
      // /bigQueryExports/%s",organizationId,location, bigQueryExportId);
      BigQueryExportName bigQueryExportName = BigQueryExportName.of(organizationId, location,
          bigQueryExportId);

      DeleteBigQueryExportRequest bigQueryExportRequest =
          DeleteBigQueryExportRequest.newBuilder()
              .setName(bigQueryExportName.toString())
              .build();

      client.deleteBigQueryExport(bigQueryExportRequest);
      System.out.printf("BigQuery export request deleted successfully: %s", bigQueryExportId);
    }
  }
}

Python

Para autenticarte en Security Command Center, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo sobre cómo configurar ADC en un entorno de desarrollo local.

def delete_bigquery_export(parent: str, bigquery_export_id: str):
    """
    Delete an existing BigQuery export.
    Args:
        parent: Use any one of the following resource paths:
                 - organizations/{organization_id}/locations/{location_id}
                 - folders/{folder_id}/locations/{location_id}
                 - projects/{project_id}/locations/{location_id}
        bigquery_export_id: Unique identifier that is used to identify the export.
    """
    from google.cloud import securitycenter_v2

    client = securitycenter_v2.SecurityCenterClient()

    request = securitycenter_v2.DeleteBigQueryExportRequest()
    request.name = f"{parent}/bigQueryExports/{bigquery_export_id}"

    client.delete_big_query_export(request)
    print(f"BigQuery export request deleted successfully: {bigquery_export_id}")

Después de eliminar la configuración de exportación, puedes quitar los datos de Looker Studio. Para obtener más información, consulta Quitar, eliminar y restaurar fuentes de datos.

Revisar resultados en BigQuery

Una vez que hayas creado una configuración de exportación, los nuevos resultados se exportarán al conjunto de datos de BigQuery del proyecto que hayas especificado.

Para revisar los resultados en BigQuery, haz lo siguiente:

  1. Ve al proyecto en BigQuery.

    Ir a BigQuery

  2. Selecciona un proyecto.

  3. En el panel Explorador, despliega el nodo de tu proyecto.

  4. Despliega el conjunto de datos.

  5. Haz clic en la tabla Resultados.

  6. En la pestaña que se abre, haz clic en Vista previa. Se muestra un conjunto de datos de muestra.

Consultas útiles

En esta sección se proporcionan consultas de ejemplo para analizar los datos de las detecciones. En los ejemplos siguientes, sustituye DATASET por el nombre asignado a tu conjunto de datos y PROJECT_ID por el nombre del proyecto de tu conjunto de datos.

Para solucionar los errores que encuentres, consulta Mensajes de error.

El número de hallazgos nuevos creados y actualizados cada día

SELECT
    FORMAT_DATETIME("%Y-%m-%d", event_time) AS date,
    count(DISTINCT finding_id)
FROM `PROJECT_ID.DATASET.findings`
GROUP BY date
ORDER BY date DESC

El registro de resultados más reciente de cada resultado

SELECT
    * EXCEPT(row)
FROM (
    SELECT *, ROW_NUMBER() OVER(
        PARTITION BY finding_id
        ORDER BY event_time DESC, finding.mute_update_time DESC
    ) AS row
    FROM `PROJECT_ID.DATASET.findings`
)
WHERE row = 1

Resultados activos actuales, ordenados por hora

WITH latestFindings AS (
    SELECT * EXCEPT(row)
    FROM (
        SELECT *, ROW_NUMBER() OVER(
            PARTITION BY finding_id
            ORDER BY event_time DESC, finding.mute_update_time DESC
        ) AS row
        FROM `PROJECT_ID.DATASET.findings`
    ) WHERE row = 1
)
SELECT finding_id, event_time, finding
FROM latestFindings
WHERE finding.state = "ACTIVE"
ORDER BY event_time DESC

Hallazgos actuales de un proyecto

WITH latestFindings AS (
    SELECT * EXCEPT(row)
    FROM (
        SELECT *, ROW_NUMBER() OVER(
            PARTITION BY finding_id
            ORDER BY event_time DESC, finding.mute_update_time DESC
        ) AS row
        FROM `PROJECT_ID.DATASET.findings`
    ) WHERE row = 1
)
SELECT finding_id, event_time, finding, resource
FROM latestFindings
WHERE resource.project_display_name = 'PROJECT'

Sustituye PROJECT por el nombre del proyecto.

Hallazgos actuales que están en una carpeta

WITH latestFindings AS(
    SELECT * EXCEPT(row)
    FROM (
        SELECT *, ROW_NUMBER() OVER(
            PARTITION BY finding_id
            ORDER BY event_time DESC, finding.mute_update_time DESC
        ) AS row
        FROM `PROJECT_ID.DATASET.findings`
    ) WHERE row = 1
)
SELECT finding_id, event_time, finding, resource
FROM latestFindings
CROSS JOIN UNNEST(resource.folders) AS folder
WHERE folder.resource_folder_display_name = 'FOLDER'

Sustituye FOLDER por el nombre de la carpeta.

Resultados actuales del escáner Logging Scanner

WITH latestFindings AS (
    SELECT * EXCEPT(row)
    FROM (
        SELECT *, ROW_NUMBER() OVER(
            PARTITION BY finding_id
            ORDER BY event_time DESC, finding.mute_update_time DESC
        ) AS row
        FROM `PROJECT_ID.DATASET.findings`
    ) WHERE row = 1
)
SELECT finding_id, event_time, finding
FROM latestFindings
CROSS JOIN UNNEST(finding.source_properties) AS source_property
WHERE source_property.key = "ScannerName"
  AND source_property.value = "LOGGING_SCANNER"

Resultados activos actuales de tipo Persistence: IAM Anomalous Grant

WITH latestFindings AS(
    SELECT * EXCEPT(row)
    FROM (
        SELECT *, ROW_NUMBER() OVER(
            PARTITION BY finding_id
            ORDER BY event_time DESC, finding.mute_update_time DESC
        ) AS row
        FROM `PROJECT_ID.DATASET.findings`
    ) WHERE row = 1
)
SELECT finding_id, event_time, finding
FROM latestFindings
WHERE finding.state = "ACTIVE"
  AND finding.category = "Persistence: IAM Anomalous Grant"

Correlacionar las detecciones activas de un tipo concreto con los registros de auditoría de Cloud

Esta consulta de ejemplo ayuda a investigar las detecciones anómalas de concesiones de gestión de identidades y accesos de Detección de amenazas de eventos mediante Registros de auditoría de Cloud. Para ello, muestra la secuencia de acciones de actividad de administrador del otorgante durante el periodo anterior y posterior a la acción anómala de concesión de gestión de identidades y accesos. La siguiente consulta relaciona los registros de actividad de administrador entre 1 hora antes y 1 hora después de la marca de tiempo del resultado.

WITH latestFindings AS(
    SELECT * EXCEPT(row)
    FROM (
        SELECT *, ROW_NUMBER() OVER(
            PARTITION BY finding_id
            ORDER BY event_time DESC, finding.mute_update_time DESC
        ) AS row
        FROM `PROJECT_ID.DATASET.findings`
    ) WHERE row = 1
)
SELECT
  finding_id,
  ANY_VALUE(event_time) as event_time,
  ANY_VALUE(finding.access.principal_email) as grantor,
  JSON_VALUE_ARRAY(ANY_VALUE(finding.source_properties_json), '$.properties.sensitiveRoleGrant.members') as grantees,
  ARRAY_AGG(
    STRUCT(
      timestamp,
      IF(timestamp < event_time, 'before', 'after') as timeline,
      protopayload_auditlog.methodName,
      protopayload_auditlog.resourceName,
      protopayload_auditlog.serviceName
    )
    ORDER BY timestamp ASC
  ) AS recent_activity
FROM (
  SELECT
    f.*,
    a.*,
  FROM latestFindings AS f
  LEFT JOIN `PROJECT_ID.DATASET.cloudaudit_googleapis_com_activity` AS a
  ON a.protopayload_auditlog.authenticationInfo.principalEmail = f.finding.access.principal_email
  WHERE f.finding.state = "ACTIVE"
    AND f.finding.category = "Persistence: IAM Anomalous Grant"
    AND a.timestamp >= TIMESTAMP_SUB(f.event_time, INTERVAL 1 HOUR)
    AND a.timestamp <= TIMESTAMP_ADD(f.event_time, INTERVAL 1 HOUR)
  )
GROUP BY
  finding_id
ORDER BY
  event_time DESC

El resultado debería ser similar al siguiente:

Captura de pantalla de los resultados de una consulta que muestra resultados con registros de auditoría correlacionados

Crear gráficos en Looker Studio

Looker Studio te permite crear informes y paneles de control interactivos.

Por lo general, se aplican costes por el uso de BigQuery si accedes a BigQuery a través de Looker Studio. Para obtener más información, consulta el artículo sobre cómo visualizar datos de BigQuery con Looker Studio.

Para crear un gráfico que visualice los datos de los resultados por gravedad y categoría, haz lo siguiente:

  1. Abre Looker Studio e inicia sesión.
  2. Si se te pide, proporciona información adicional y configura otras preferencias. Lee los términos del servicio y, si estás de acuerdo, continúa.
  3. Haz clic en Informe en blanco.
  4. En la pestaña Conectarse a datos, haga clic en la tarjeta BigQuery.
  5. Si se te solicita, autoriza a Looker Studio a acceder a los proyectos de BigQuery.
  6. Conéctate a los datos de resultados:

    1. En Proyecto, selecciona el proyecto de tu conjunto de datos. También puedes ir a la pestaña Mis proyectos e introducir el ID del proyecto que quieras buscar.
    2. En Conjunto de datos, haz clic en el nombre del conjunto de datos.
    3. En Tabla, haz clic en resultados.
    4. Haz clic en Añadir.
    5. En el cuadro de diálogo, haz clic en Añadir al informe.
  7. Una vez que se haya añadido el informe, haz clic en Añadir un gráfico.

  8. Haz clic en Gráfico de columnas apiladas y, a continuación, en el área donde quieras colocarlo.

    Captura de pantalla de la selección del gráfico
  9. En el panel Gráfico > Barras, en la pestaña Datos, defina los siguientes campos:

    1. En el campo Dimensión, seleccione finding.severity.
    2. En el campo Dimensión de desglose, seleccione finding.category.
    Captura de pantalla de un gráfico de resultados clasificados por gravedad y subclasificados por categoría

El informe se actualiza para mostrar varias columnas con los resultados divididos por gravedad y categoría.

Siguientes pasos