Faça stream das conclusões para o BigQuery para análise

Esta página descreve como fazer stream de novas descobertas e descobertas atualizadas para um conjunto de dados do BigQuery através da função de exportação do Security Command Center para o BigQuery. As conclusões existentes não são enviadas para o BigQuery, a menos que sejam atualizadas.

O BigQuery é o armazém de dados de estatísticas rentável, com capacidade para petabytes de dados e totalmente gerido do Google Cloud que lhe permite executar estatísticas em enormes quantidades de dados quase em tempo real. Google CloudPode usar o BigQuery para executar consultas em conclusões novas e atualizadas, filtrar dados para encontrar o que precisa e gerar relatórios personalizados. Para saber mais acerca do BigQuery, consulte a documentação do BigQuery.

Vista geral

Quando ativa esta funcionalidade, as novas conclusões escritas no Security Command Center são exportadas para uma tabela do BigQuery quase em tempo real. Em seguida, pode integrar os dados nos fluxos de trabalho existentes e criar análises personalizadas. Pode ativar esta funcionalidade ao nível da organização, da pasta e do projeto para exportar as conclusões com base nos seus requisitos.

Esta funcionalidade é a forma recomendada de exportar as conclusões do Security Command Center para o BigQuery, porque é totalmente gerida e não requer a realização de operações manuais nem a escrita de código personalizado.

Estrutura do conjunto de dados

Esta funcionalidade adiciona cada nova descoberta e as respetivas atualizações subsequentes como novas linhas na tabela findings, que está agrupada por source_id, finding_id e event_time.

Quando um resultado é atualizado, esta funcionalidade cria vários registos de resultados com os mesmos valores source_id e finding_id, mas com valores event_time diferentes. Esta estrutura do conjunto de dados permite-lhe ver como o estado de cada descoberta muda ao longo do tempo.

Tenha em atenção que podem existir entradas duplicadas no seu conjunto de dados. Para as analisar, pode usar a cláusula DISTINCT, conforme mostrado na primeira consulta de exemplo.

Cada conjunto de dados contém uma tabela findings, que tem os seguintes campos:

Campo Descrição
source_id

Um identificador exclusivo que o Security Command Center atribui à origem de uma descoberta. Por exemplo, todas as conclusões da origem de Deteção de anomalias na nuvem têm o mesmo valor source_id.

Exemplo: 1234567890

finding_id Identificador exclusivo que representa a descoberta. É exclusivo numa fonte para uma organização. É alfanumérico e tem um máximo de 32 carateres.
event_time

A hora em que o evento ocorreu ou a hora em que ocorreu uma atualização da descoberta. Por exemplo, se a descoberta representar uma firewall aberta, event_time capta a hora em que o detetor considera que a firewall foi aberta. Se a descoberta for resolvida posteriormente, esta hora reflete o momento em que a descoberta foi resolvida.

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

bulk_export_id

Para exportações em massa, este é um UUID.

Para exportações contínuas, este campo está vazio.

finding

Um registo de dados de avaliação, como segurança, risco, saúde ou privacidade, que é carregado no Security Command Center para apresentação, notificação, análise, testes de políticas e aplicação. Por exemplo, uma vulnerabilidade de cross-site scripting (XSS) numa aplicação do App Engine é uma descoberta.

Para mais informações sobre os campos aninhados, consulte a referência da API para o objeto Finding.

resource

Informações relacionadas com o Google Cloud recurso que está associado a esta descoberta.

Para mais informações sobre os campos aninhados, consulte a referência da API para o objeto Resource.

Custo

Incorre em custos do BigQuery relacionados com esta funcionalidade. Para mais informações, consulte os preços do BigQuery.

Antes de começar

Tem de concluir estes passos antes de ativar esta funcionalidade.

Configure as autorizações

Para concluir este guia, tem de ter as seguintes funções de gestão de identidade e de acesso (IAM):

Crie um conjunto de dados do BigQuery

Crie um conjunto de dados do BigQuery. Para mais informações, consulte o artigo Criar conjuntos de dados.

Planeie a residência dos dados

Se a residência de dados estiver ativada para o Security Command Center, as configurações que definem as exportações de streaming para o BigQuery (recursos BigQueryExport) estão sujeitas ao controlo de residência de dados e são armazenadas numa localização do Security Command Center que selecionar.

Para exportar conclusões numa localização do Security Command Center para o BigQuery, tem de configurar a exportação do BigQuery na mesma localização do Security Command Center que as conclusões.

Uma vez que os filtros usados nas exportações do BigQuery podem conter dados sujeitos a controlos de residência, certifique-se de que especifica a localização correta antes de os criar. O Security Command Center não restringe a localização em que cria exportações.

As exportações do BigQuery são armazenadas apenas na localização em que são criadas e não podem ser vistas nem editadas noutras localizações.

Depois de criar uma exportação do BigQuery, não pode alterar a respetiva localização. Para alterar a localização, tem de eliminar o BigQuery Export e recriá-lo na nova localização.

Para saber como usar o Security Command Center quando a residência de dados está ativada, consulte os endpoints regionais do Security Command Center.

Exporte resultados do Security Command Center para o BigQuery

Para exportar resultados, ative primeiro a API Security Command Center.

Ativar a API Security Command Center

Para ativar a API Security Command Center:

  1. Aceda à página da biblioteca de APIs na Google Cloud consola.

    Aceder à biblioteca de APIs

  2. Selecione o projeto para o qual quer ativar a API Security Command Center.

  3. Na caixa Pesquisar, introduza Security Command Center e, de seguida, clique em Security Command Center nos resultados da pesquisa.

  4. Na página da API apresentada, clique em Ativar.

A API Security Command Center está ativada para o seu projeto. Em seguida, usa a CLI gcloud para criar uma nova configuração de exportação para o BigQuery.

Conceder acesso ao perímetro no VPC Service Controls

Se usar os VPC Service Controls e o seu conjunto de dados do BigQuery fizer parte de um projeto dentro de um perímetro de serviço, tem de conceder acesso a projetos para exportar resultados.

Para conceder acesso a projetos, crie regras de entrada e saída para os principais e os projetos a partir dos quais está a exportar resultados. As regras permitem o acesso a recursos protegidos e permitem que o BigQuery verifique se os utilizadores têm a autorização setIamPolicy no conjunto de dados do BigQuery.

Antes de configurar uma nova exportação para o BigQuery

Consola

  1. Na Google Cloud consola, aceda à página VPC Service Controls.

    Aceda aos VPC Service Controls

  2. Selecione a sua organização ou projeto.
  3. Na lista pendente, selecione a política de acesso que contém o perímetro de serviço ao qual quer conceder acesso.

    Os perímetros de serviço associados à política de acesso aparecem na lista.

  4. Clique no nome do perímetro de serviço que quer atualizar.

    Para encontrar o perímetro de serviço que tem de modificar, pode verificar as entradas nos registos que mostram violações de RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER. Nessas entradas, verifique o campo servicePerimeterName:

    accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME
  5. Clique em Editar.
  6. Clique em Política de saída.
  7. Clique em Adicionar regra de saída.
  8. Na secção De, defina os seguintes detalhes:

    1. Em Identidades > Identidade, selecione Selecionar identidades e grupos.
    2. Clique em Adicionar identidades.
    3. Introduza o endereço de email do principal usado para chamar a API Security Command Center.

    4. Selecione o principal ou prima ENTER e, de seguida, clique em Adicionar identidades.
  9. Na secção Para, defina os seguintes detalhes:

    1. Em Recursos > Projetos, selecione Todos os projetos.
    2. Para Funções de operações ou do IAM, selecione Selecionar operações.
    3. Clique em Adicionar operações e, de seguida, adicione as seguintes operações:

      • Adicione o serviço bigquery.googleapis.com.
        1. Clique em Todos os métodos.
        2. Clique em Adicionar todos os métodos.
  10. Clique em Política de entrada.
  11. Clique em Adicionar uma regra de entrada.
  12. Na secção De, defina os seguintes detalhes:

    1. Em Identidades > Identidade, selecione Selecionar identidades e grupos.
    2. Clique em Adicionar identidades.
    3. Introduza o endereço de email do principal usado para chamar a API Security Command Center.

    4. Selecione o principal ou prima ENTER e, de seguida, clique em Adicionar identidades.
    5. Em Fontes, selecione Todas as fontes.
  13. Na secção Para, defina os seguintes detalhes:

    1. Em Recursos > Projetos, selecione Selecionar projetos.
    2. Clique em Adicionar projetos e, de seguida, adicione o projeto que contém o conjunto de dados do BigQuery.
    3. Para Funções de operações ou do IAM, selecione Selecionar operações.
    4. Clique em Adicionar operações e, de seguida, adicione as seguintes operações:

      • Adicione o serviço bigquery.googleapis.com.
        1. Clique em Todos os métodos.
        2. Clique em Adicionar todos os métodos.
  14. Clique em Guardar.

gcloud

  1. Se ainda não tiver sido definido um projeto de quota, defina-o. Escolha um projeto que tenha a API Access Context Manager ativada.

    gcloud config set billing/quota_project QUOTA_PROJECT_ID

    Substitua QUOTA_PROJECT_ID pelo ID do projeto que quer usar para faturação e quota.

  2. Crie um ficheiro denominado egress-rule.yaml com o seguinte conteúdo:

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

    Substitua PRINCIPAL_ADDRESS pelo endereço do principal usado para chamar a API Security Command Center.

  3. Crie um ficheiro denominado ingress-rule.yaml com o seguinte conteúdo:

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

    Substitua PRINCIPAL_ADDRESS pelo endereço do principal usado para chamar a API Security Command Center.

  4. Adicione a regra de saída ao perímetro:

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

    Substitua o seguinte:

    • PERIMETER_NAME: o nome do perímetro. Por exemplo, accessPolicies/1234567890/servicePerimeters/example_perimeter.

      Para encontrar o perímetro de serviço que tem de modificar, pode verificar as entradas nos registos que mostram violações de RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER. Nessas entradas, verifique o campo servicePerimeterName:

      accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME
  5. Adicione a regra de entrada ao perímetro:

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

    Substitua o seguinte:

    • PERIMETER_NAME: o nome do perímetro. Por exemplo, accessPolicies/1234567890/servicePerimeters/example_perimeter.

      Para encontrar o perímetro de serviço que tem de modificar, pode verificar as entradas nos registos que mostram violações de RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER. Nessas entradas, verifique o campo servicePerimeterName:

      accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME

Consulte as Regras de entrada e saída para mais informações.

Configure uma nova exportação para o BigQuery

Neste passo, cria uma configuração de exportação para exportar as descobertas para uma instância do BigQuery. Pode criar configurações de exportação ao nível do projeto, da pasta ou da organização. Por exemplo, se quiser exportar descobertas de um projeto para um conjunto de dados do BigQuery, cria uma configuração de exportação ao nível do projeto para exportar apenas as descobertas relacionadas com esse projeto. Opcionalmente, pode especificar filtros para exportar apenas determinadas conclusões.

Certifique-se de que cria as configurações de exportação no nível adequado. Por exemplo, se criar uma configuração de exportação no projeto B para exportar resultados do projeto A e definir filtros como resource.project_display_name: project-a-id, a configuração não exporta resultados.

Pode criar um máximo de 500 configurações de exportação para o BigQuery para a sua organização. Pode usar o mesmo conjunto de dados para várias configurações de exportação. Se usar o mesmo conjunto de dados, todas as atualizações são feitas à mesma tabela de resultados.

Quando cria a sua primeira configuração de exportação, é criada automaticamente uma conta de serviço. Esta conta de serviço é necessária para criar ou atualizar a tabela de resultados num conjunto de dados e para exportar resultados para a tabela. Tem o formato service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gservicaccount.com e tem a função de editor de dados do BigQuery (roles/bigquery.dataEditor) concedida ao nível do conjunto de dados do BigQuery.

Na Google Cloud consola, alguns recursos do BigQueryExport podem ter uma etiqueta Antigo que indica que foram criados com a API Security Command Center v1. Pode gerir estes recursos BigQueryExport com a consola Google Cloud ; a CLI gcloud; a API Security Command Center v1; ou as bibliotecas de cliente v1 para o Security Command Center.

Para gerir estes recursos BigQueryExport com a CLI gcloud, não pode especificar uma localização quando executar o comando da CLI gcloud.

gcloud

  1. Aceda à Google Cloud consola.

    Aceda à Google Cloud consola

  2. Selecione o projeto para o qual ativou a API Security Command Center.

  3. Clique em Ativar Cloud Shell.

  4. Para criar uma nova configuração de exportação, execute o seguinte 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]
    

    Substitua o seguinte:

    • BIGQUERY_EXPORT com um nome para esta configuração de exportação.
    • DATASET_NAME com o nome do conjunto de dados do BigQuery, por exemplo, projects/PROJECT_ID/datasets/DATASET_ID.
    • FOLDER_ID, ORGANIZATION_ID ou PROJECT_ID com o nome da sua pasta, organização ou projeto. Tem de definir uma destas opções. Para pastas e organizações, o nome é o ID da pasta ou o ID da organização. Para os projetos, o nome é o número do projeto ou o ID do projeto.
    • LOCATION: a localização do Security Command Center na qual criar uma configuração de exportação; se a residência de dados estiver ativada, use eu, sa ou us; caso contrário, use o valor global.
    • DESCRIPTION com uma descrição legível da configuração de exportação. Esta variável é opcional.
    • FILTER com uma expressão que define as conclusões a incluir na exportação. Por exemplo, se quiser filtrar pela categoria XSS_SCRIPTING, escreva "category=\"XSS_SCRIPTING\". Esta variável é opcional.

Terraform

Para saber como aplicar ou remover uma configuração do Terraform, consulte os comandos básicos do Terraform. Para mais informações, consulte a Terraform documentação de referência do fornecedor.

Crie uma configuração de exportação para uma organização:

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\""
}

Crie uma configuração de exportação para uma pasta:

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\""
}

Crie uma configuração de exportação para um projeto:

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 se autenticar no Security Command Center, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento 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 se autenticar no Security Command Center, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento 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

Deve ver as conclusões no seu conjunto de dados do BigQuery cerca de 15 minutos após criar a configuração de exportação. Depois de criar a tabela do BigQuery, todas as novas descobertas e descobertas atualizadas que correspondam ao seu filtro e âmbito aparecem na tabela quase em tempo real.

Para rever as suas conclusões, consulte o artigo Reveja as conclusões.

Crie uma regra de entrada para a nova exportação para o BigQuery

Se usar os VPC Service Controls e o seu conjunto de dados do BigQuery fizer parte de um projeto dentro de um perímetro de serviço, tem de criar uma regra de entrada para uma nova exportação para o BigQuery.

Consola

  1. Reabra o perímetro de serviço a partir da secção anterior.

    Aceda aos VPC Service Controls

  2. Clique em Política de entrada.
  3. Clique em Adicionar uma regra de entrada.
  4. Na secção De, defina os seguintes detalhes:

    1. Em Identidades > Identidade, selecione Selecionar identidades e grupos.
    2. Clique em Adicionar identidades.
    3. Introduza o endereço de email do agente do serviço de configuração do BigQuery Export. A morada do agente de serviço tem o seguinte formato:

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

      Substitua ORGANIZATION_ID pelo ID da sua organização.

    4. Selecione o agente de serviços ou prima ENTER e, de seguida, clique em Adicionar identidades.
    5. Em Fontes, selecione Todas as fontes.
  5. Na secção Para, defina os seguintes detalhes:

    1. Em Recursos > Projetos, selecione Selecionar projetos.
    2. Clique em Adicionar projetos e, de seguida, adicione o projeto que contém o conjunto de dados do BigQuery.
    3. Para Funções de operações ou do IAM, selecione Selecionar operações.
    4. Clique em Adicionar operações e, de seguida, adicione as seguintes operações:

      • Adicione o serviço bigquery.googleapis.com.
        1. Clique em Todos os métodos.
        2. Clique em Adicionar todos os métodos.
  6. Clique em Guardar.

gcloud

  1. Se ainda não tiver sido definido um projeto de quota, defina-o. Escolha um projeto que tenha a API Access Context Manager ativada.

    gcloud config set billing/quota_project QUOTA_PROJECT_ID

    Substitua QUOTA_PROJECT_ID pelo ID do projeto que quer usar para faturação e quota.

  2. Crie um ficheiro denominado ingress-rule.yaml com o seguinte conteúdo:

    - 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:
        - '*'

    Substitua ORGANIZATION_ID pelo ID da sua organização.

  3. Adicione a regra de entrada ao perímetro:

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

    Substitua o seguinte:

    • PERIMETER_NAME: o nome do perímetro. Por exemplo, accessPolicies/1234567890/servicePerimeters/example_perimeter.

      Para encontrar o perímetro de serviço que tem de modificar, pode verificar as entradas nos registos que mostram violações de RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER. Nessas entradas, verifique o campo servicePerimeterName:

      accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME

Consulte as Regras de entrada e saída para mais informações.

Os projetos, os utilizadores e as contas de serviço selecionados podem agora aceder aos recursos protegidos e exportar resultados.

Se seguiu todos os passos neste guia e as exportações estão a funcionar corretamente, já pode eliminar o seguinte:

  • A regra de entrada para o principal
  • A regra de saída para o principal

Essas regras só eram necessárias para configurar a configuração de exportação. No entanto, para que as configurações de exportação continuem a funcionar, tem de manter a regra de entrada criada anteriormente, que permite ao Security Command Center exportar resultados para o seu conjunto de dados do BigQuery atrás do perímetro de serviço.

Veja os detalhes de uma configuração de exportação

gcloud

  1. Aceda à Google Cloud consola.

    Aceda à Google Cloud consola

  2. Selecione o projeto para o qual ativou a API Security Command Center.

  3. Clique em Ativar Cloud Shell.

  4. Para validar os detalhes da configuração de exportação, execute o seguinte comando:

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

    Substitua o seguinte:

    • BIGQUERY_EXPORT com o nome desta configuração de exportação.
    • FOLDER_ID, ORGANIZATION_ID ou PROJECT_ID com o nome da sua pasta, organização ou projeto. Tem de definir uma destas opções. Para pastas e organizações, o nome é o ID da pasta ou o ID da organização. Para os projetos, o nome é o número do projeto ou o ID do projeto.
    • LOCATION: a localização do Security Command Center na qual criar uma configuração de exportação; se a residência de dados estiver ativada, use eu, sa ou us; caso contrário, use o valor global.

      Por exemplo, para obter uma configuração de exportação denominada my-bq-export de uma organização com um ID de organização definido como 123, execute o seguinte comando:

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

Atualize uma configuração de exportação

Quando necessário, pode modificar o filtro, o conjunto de dados e a descrição de uma configuração de exportação existente. Não pode alterar o nome da configuração de exportação.

gcloud

  1. Aceda à Google Cloud consola.

    Aceda à Google Cloud consola

  2. Selecione o projeto para o qual ativou a API Security Command Center.

  3. Clique em Ativar Cloud Shell.

  4. Para atualizar uma configuração de exportação, execute o seguinte 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]
    

    Substitua o seguinte:

    • BIGQUERY_EXPORT com o nome da configuração de exportação que quer atualizar.
    • DATASET_NAME com o nome do conjunto de dados do BigQuery, por exemplo, projects/PROJECT_ID/datasets/DATASET_ID.
    • FOLDER_ID, ORGANIZATION_ID ou PROJECT_ID com o nome da sua pasta, organização ou projeto. Tem de definir uma destas opções. Para pastas e organizações, o nome é o ID da pasta ou o ID da organização. Para os projetos, o nome é o número do projeto ou o ID do projeto.
    • LOCATION: a localização do Security Command Center na qual atualizar a configuração de exportação; se a residência de dados estiver ativada, use eu, sa ou us; caso contrário, use o valor global.
    • DESCRIPTION com uma descrição legível da configuração de exportação. Esta variável é opcional.
    • FILTER com uma expressão que define as conclusões a incluir na exportação. Por exemplo, se quiser filtrar pela categoria XSS_SCRIPTING, escreva "category=\"XSS_SCRIPTING\". Esta variável é opcional.

Veja todas as configurações de exportação

Pode ver todas as configurações de exportação na sua organização, pasta ou projeto.

gcloud

  1. Aceda à Google Cloud consola.

    Aceda à Google Cloud consola

  2. Selecione o projeto para o qual ativou a API Security Command Center.

  3. Clique em Ativar Cloud Shell.

  4. Para apresentar uma lista das configurações de exportação, execute o seguinte comando:

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

    Substitua o seguinte:

    • FOLDER_ID, ORGANIZATION_ID ou PROJECT_ID com o nome da sua pasta, organização ou projeto. Tem de definir uma destas opções. Para pastas e organizações, o nome é o ID da pasta ou o ID da organização. Para os projetos, o nome é o número do projeto ou o ID do projeto.

      Se especificar um ID da organização, a lista inclui todas as configurações de exportação definidas nessa organização, incluindo as dos níveis de pasta e projeto. Se especificar um ID de pasta, a lista inclui todas as configurações de exportação definidas ao nível da pasta e nos projetos nessa pasta. Se especificar um número ou um ID do projeto, a lista inclui apenas todas as configurações de exportação desse projeto.

    • LOCATION: a localização do Security Command Center na qual listar as configurações de exportação; se a residência de dados estiver ativada, use eu, sa ou us; caso contrário, use o valor global.

    • LIMIT com o número de configurações de exportação que quer ver. Esta variável é opcional.

    • PAGE_SIZE com um valor de tamanho da página. Esta variável é opcional.

Java

Para se autenticar no Security Command Center, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento 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 se autenticar no Security Command Center, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento 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

Elimine uma configuração de exportação

Se já não precisar de uma configuração de exportação, pode eliminá-la.

gcloud

  1. Aceda à Google Cloud consola.

    Aceda à Google Cloud consola

  2. Selecione o projeto para o qual ativou a API Security Command Center.

  3. Clique em Ativar Cloud Shell.

  4. Para eliminar uma configuração de exportação, execute o seguinte comando:

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

    Substitua o seguinte:

Java

Para se autenticar no Security Command Center, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento 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 se autenticar no Security Command Center, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento 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}")

Depois de eliminar a configuração de exportação, pode remover os dados do Looker Studio. Para mais informações, consulte o artigo Remova, elimine e restaure uma origem de dados.

Reveja as conclusões no BigQuery

Depois de criar uma configuração de exportação, as novas conclusões são exportadas para o conjunto de dados do BigQuery no projeto que especificou.

Para rever as conclusões no BigQuery, faça o seguinte:

  1. Aceda ao projeto no BigQuery.

    Aceda ao BigQuery

  2. Selecione um projeto.

  3. No painel Explorador, expanda o nó do seu projeto.

  4. Expanda o conjunto de dados.

  5. Clique na tabela resultados.

  6. No separador apresentado, clique em Pré-visualizar. É apresentado um conjunto de dados de exemplo.

Consultas úteis

Esta secção fornece consultas de exemplo para analisar dados de resultados. Nos exemplos seguintes, substitua DATASET pelo nome atribuído ao seu conjunto de dados e PROJECT_ID pelo nome do projeto do seu conjunto de dados.

Para resolver problemas de erros que encontrar, consulte o artigo Mensagens de erro.

O número de novos resultados criados e atualizados todos os dias

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

O registo de deteção mais recente para cada deteção

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 atuais que estão ativos, ordenados por tempo

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

Resultados atuais que estão num projeto

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'

Substitua PROJECT pelo nome do projeto.

Resultados atuais que estão numa pasta

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'

Substitua FOLDER pelo nome da pasta.

Resultados atuais do scanner 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 ativos atuais do 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"

Correlacione as descobertas ativas de um determinado tipo com os registos de auditoria do Cloud

Esta consulta de exemplo ajuda a investigar resultados anómalos de concessão de IAM da Deteção de ameaças de eventos através dos registos de auditoria do Google Cloud, apresentando a sequência de ações de atividade de administrador durante o período que antecede e sucede a ação anómala de concessão de IAM. A consulta seguinte correlaciona os registos de atividade do administrador entre 1 hora antes e 1 hora depois da data/hora da descoberta.

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

O resultado é semelhante ao seguinte:

Captura de ecrã dos resultados da consulta a mostrar as conclusões com registos de auditoria correlacionados

Crie gráficos no Looker Studio

O Looker Studio permite-lhe criar relatórios e painéis de controlo interativos.

Em geral, incorre em custos de utilização do BigQuery quando acede ao BigQuery através do Looker Studio. Para mais informações, consulte o artigo Visualizar dados do BigQuery com o Looker Studio.

Para criar um gráfico que visualize os dados de conclusões por gravidade e categoria, faça o seguinte:

  1. Abra o Looker Studio e inicie sessão.
  2. Se lhe for pedido, faculte informações adicionais e configure outras preferências. Leia os Termos de Utilização e, se estiver satisfeito, continue.
  3. Clique em Relatório em branco.
  4. No separador Associar a dados, clique no cartão BigQuery.
  5. Se lhe for pedido, autorize o Looker Studio a aceder aos projetos do BigQuery.
  6. Associe aos dados de conclusões:

    1. Para Projeto, selecione esse projeto para o seu conjunto de dados. Em alternativa, no separador Os meus projetos, introduza o ID do projeto para o pesquisar.
    2. Em Conjunto de dados, clique no nome do conjunto de dados.
    3. Para Tabela, clique em resultados.
    4. Clique em Adicionar.
    5. Na caixa de diálogo, clique em Adicionar ao relatório.
  7. Depois de adicionar o relatório, clique em Adicionar um gráfico.

  8. Clique em Gráfico de colunas empilhadas e, de seguida, clique na área onde quer colocá-lo.

    Captura de ecrã da seleção de gráficos
  9. No painel Gráfico > Barra, no separador Dados, defina os seguintes campos:

    1. No campo Dimensão, selecione finding.severity.
    2. No campo Dimensão de discriminação, selecione finding.category.
    Captura de ecrã de um gráfico de conclusões categorizadas por gravidade e
            subcategorizadas por categoria

O relatório é atualizado para mostrar várias colunas com conclusões divididas por gravidade e categoria.

O que se segue?