Ativar as notificações de descoberta do Pub/Sub

Nesta página, explicamos como ativar as notificações da API Security Command Center.

As notificações enviam descobertas e descobertas sobre um tópico do Pub/Sub em minutos. As notificações da API Security Command Center incluem todas as informações de descoberta exibidas pelo Security Command Center no console do Google Cloud.

É possível conectar as notificações do Security Command Center no Pub/Sub diretamente às ações do Cloud Run. Para ver funções de exemplo que podem ajudar com resposta, aprimoramento e remediação, consulte o repositório de código aberto do Security Command Center em código do Cloud Run functions. O repositório contém soluções para ajudar você a tomar ações automatizadas sobre as descobertas de segurança.

Como alternativa, é possível exportar descobertas para o BigQuery ou configurar exportações contínuas para o Pub/Sub no console do Google Cloud.

Antes de começar

  1. Para receber as permissões necessárias a fim de configurar as notificações da API Security Command Center, peça ao administrador para conceder a você os seguintes papéis do IAM:

    Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

    Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.

  2. Enable the Security Command Center API:

    gcloud services enable securitycenter.googleapis.com

Residência de dados e notificações

Se a residência de dados estiver ativada para o Security Command Center, as configurações que definem exportações contínuas para o Pub/Sub, ou seja, recursos notificationConfig, estão sujeitas ao controle de residência de dados e são armazenadas no local do Security Command Center.

Para exportar descobertas em um local do Security Command Center para o Pub/Sub, configure a exportação contínua no mesmo local do Security Command Center.

Como os filtros usados nas exportações contínuas podem conter dados sujeitos a controles de residência, especifique o local correto antes de criá-los. O Security Command Center não restringe o local em que você cria as exportações.

As exportações contínuas são armazenadas apenas no local em que são criadas e não podem ser visualizadas ou editadas em outros locais.

Depois de criar uma exportação contínua, não é possível mudar o local dela. Para mudar o local, exclua a exportação contínua e a recrie no novo local.

Para recuperar uma exportação contínua usando chamadas de API, especifique o local no nome completo do recurso do notificationConfig. Exemplo:

GET https://securitycenter.googleapis.com/v2/organizations/123/locations/eu/notificationConfigs/my-pubsub-export-01

Da mesma forma, para recuperar uma exportação contínua usando a CLI gcloud, é necessário especificar o local usando a flag --location. Exemplo:

gcloud scc notifications describe myContinuousExport --organization=123 \
    --location=us

Configurar um tópico do Pub/Sub

Nesta tarefa, você cria e se inscreve no tópico do Pub/Sub para onde quer enviar notificações.

Etapa 1: configurar o Pub/Sub

Para configurar e se inscrever em um tópico do Pub/Sub, faça o seguinte:

  1. Acesse o console do Google Cloud.

    Acesse o console do Google Cloud

  2. Selecione o projeto em que você ativou a API Security Command Center.

  3. Clique em Ativar o Cloud Shell.

  4. Opcional: para criar um novo tópico do Pub/Sub, execute o seguinte comando:

    gcloud pubsub topics create TOPIC_ID
    

    Substitua TOPIC_ID pelo nome de um tópico.

  5. Crie uma assinatura para o tópico:

    gcloud pubsub subscriptions create SUBSCRIPTION_ID --topic=TOPIC_ID
    

    Substitua:

    • SUBSCRIPTION_ID: O ID da assinatura.
    • TOPIC_ID: o ID do tópico

Para saber mais sobre como configurar o Pub/Sub, consulte Como gerenciar tópicos e assinaturas.

Etapa 2: conceder função no tópico do Pub/Sub

Para criar um NotificationConfig, você precisa ter o papel de administrador do Pub/Sub (roles/pubsub.admin) no tópico do Pub/Sub para o qual você criou uma assinatura.

Para conceder esse papel, faça o seguinte:

  1. Acesse o console do Google Cloud.

    Acessar o console do Google Cloud

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

  3. Clique em Ativar o Cloud Shell.

  4. Conceda o papel necessário à sua Conta do Google no tópico do Pub/Sub:

    gcloud pubsub topics add-iam-policy-binding \
        projects/PUBSUB_PROJECT/topics/TOPIC_ID \
        --member="user:GOOGLE_ACCOUNT" \
        --role="roles/pubsub.admin"
    

    Substitua:

    • PUBSUB_PROJECT: o projeto do Google Cloud que contém seu tópico do Pub/Sub
    • TOPIC_ID: o ID do tópico
    • GOOGLE_ACCOUNT: o endereço de e-mail da sua Conta do Google

Criar um NotificationConfig

Antes de criar um NotificationConfig, observe que cada organização pode ter um número limitado de arquivos NotificationConfig. Para mais informações, consulte Cotas e limites.

O NotificationConfig inclui um campo filter, que limita as notificações a eventos úteis. Esse campo aceita todos os filtros disponíveis no método findings.list da API Security Command Center.

Ao criar um NotificationConfig, você especifica um pai para o NotificationConfig da hierarquia de recursos do Google Cloud, seja uma organização, uma pasta ou um projeto. Se for necessário recuperar, atualizar ou excluir o NotificationConfig mais tarde, será necessário incluir o ID numérico da organização, pasta ou projeto pai ao fazer referência a ele.

No console do Google Cloud, alguns recursos NotificationConfig podem ter um rótulo Legacy, o que indica que eles foram criados com a API v1 do Security Command Center. É possível gerenciar esses recursos NotificationConfig com o console do Google Cloud, a CLI gcloud, a API Security Command Center v1 ou as bibliotecas de cliente v1 do Security Command Center.

Para gerenciar esses recursos NotificationConfig com a CLI gcloud, não especifique um local ao executar o comando da CLI gcloud.

Para criar o NotificationConfig usando o idioma ou a plataforma de sua escolha:

gcloud

gcloud scc notifications create NOTIFICATION_NAME \
  --PARENT=PARENT_ID \
  --location=LOCATION
  --description="NOTIFICATION_DESCRIPTION" \
  --pubsub-topic=PUBSUB_TOPIC \
  --filter="FILTER"

Substitua:

  • NOTIFICATION_NAME: o nome da notificação. Precisa ter entre 1 e 128 caracteres e conter apenas caracteres alfanuméricos, sublinhados ou hifens.
  • PARENT: o escopo na hierarquia de recursos a que a notificação se aplica, organization, folder ou project.
  • PARENT_ID: o ID da organização, pasta ou projeto pai, especificado no formato organizations/123, folders/456 ou projects/789.
  • LOCATION: se a residência de dados estiver ativada, o local do Security Command Center em que; se a residência de dados não estiver ativada, use o valor global.
  • NOTIFICATION_DESCRIPTION: uma descrição da notificação de no máximo 1.024 caracteres.
  • PUBSUB_TOPIC: o tópico do Pub/Sub que vai receber notificações. O formato é projects/PROJECT_ID/topics/TOPIC.
  • FILTER: a expressão que você define para selecionar quais resultados são enviados ao Pub/Sub. Por exemplo, state=\"ACTIVE\".

Go

import (
	"context"
	"fmt"
	"io"

	securitycenter "cloud.google.com/go/securitycenter/apiv2"
	"cloud.google.com/go/securitycenter/apiv2/securitycenterpb"
)

func createNotificationConfig(w io.Writer, orgID string, pubsubTopic string, notificationConfigID string) error {
	// orgID := "your-org-id"
	// pubsubTopic := "projects/{your-project}/topics/{your-topic}"
	// notificationConfigID := "your-config-id"

	ctx := context.Background()
	client, err := securitycenter.NewClient(ctx)

	if err != nil {
		return fmt.Errorf("securitycenter.NewClient: %w", err)
	}
	defer client.Close()

	req := &securitycenterpb.CreateNotificationConfigRequest{
		// Parent must be in one of the following formats:
		//		"organizations/{orgId}/locations/global"
		//		"projects/{projectId}/locations/global"
		//		"folders/{folderId}/locations/global"
		Parent:   fmt.Sprintf("organizations/%s/locations/global", orgID),
		ConfigId: notificationConfigID,
		NotificationConfig: &securitycenterpb.NotificationConfig{
			Description: "Go sample config",
			PubsubTopic: pubsubTopic,
			NotifyConfig: &securitycenterpb.NotificationConfig_StreamingConfig_{
				StreamingConfig: &securitycenterpb.NotificationConfig_StreamingConfig{
					Filter: `state = "ACTIVE"`,
				},
			},
		},
	}

	notificationConfig, err := client.CreateNotificationConfig(ctx, req)
	if err != nil {
		return fmt.Errorf("Failed to create notification config: %w", err)
	}
	fmt.Fprintln(w, "New NotificationConfig created: ", notificationConfig)

	return nil
}

Java


package vtwo.notifications;

import com.google.cloud.securitycenter.v2.LocationName;
import com.google.cloud.securitycenter.v2.NotificationConfig;
import com.google.cloud.securitycenter.v2.SecurityCenterClient;
import java.io.IOException;

public class CreateNotification {

  public static void main(String[] args) throws IOException {
    // parentId: must be in one of the following formats:
    //    "organizations/{organization_id}"
    //    "projects/{project_id}"
    //    "folders/{folder_id}"
    String parentId = "{parent-id}";
    String topicName = "{your-topic}";
    String notificationConfigId = "{your-notification-id}";
    // Specify the location of the notification config.
    String location = "global";

    createNotificationConfig(parentId, location, topicName, notificationConfigId);
  }

  // Crete a notification config.
  // Ensure the ServiceAccount has the "pubsub.topics.setIamPolicy" permission on the new topic.
  public static NotificationConfig createNotificationConfig(
      String parentId, String location, String topicName, String notificationConfigId)
      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. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (SecurityCenterClient client = SecurityCenterClient.create()) {

      String pubsubTopic = String.format("projects/%s/topics/%s", parentId, topicName);

      NotificationConfig notificationConfig = NotificationConfig.newBuilder()
          .setDescription("Java notification config")
          .setPubsubTopic(pubsubTopic)
          .setStreamingConfig(
              NotificationConfig.StreamingConfig.newBuilder().setFilter("state = \"ACTIVE\"")
                  .build())
          .build();

      NotificationConfig response = client.createNotificationConfig(
          LocationName.of(parentId, location), notificationConfig, notificationConfigId);

      System.out.printf("Notification config was created: %s%n", response);
      return response;
    }
  }
}

Node.js

// npm install '@google-cloud/security-center'
const {SecurityCenterClient} = require('@google-cloud/security-center').v2;
const uuidv1 = require('uuid').v1;

const client = new SecurityCenterClient();
/*
 *  Required. Resource name of the new notification config's parent. Its format
 *  is "organizations/[organization_id]/locations/[location_id]",
 *  "folders/[folder_id]/locations/[location_id]", or
 *  "projects/[project_id]/locations/[location_id]".
 */
const parent = `projects/${projectId}/locations/${location}`;

/**
 *  Required.
 *  Unique identifier provided by the client within the parent scope.
 *  It must be between 1 and 128 characters and contain alphanumeric
 *  characters, underscores, or hyphens only.
 */
const configId = 'notif-config-test-node-create-' + uuidv1();

// pubsubTopic = "projects/{your-project}/topics/{your-topic}";
const pubsubTopic = `projects/${projectId}/topics/${topicName}`;

/**
 *  Required. The notification config being created. The name and the service
 *  account will be ignored as they are both output only fields on this
 *  resource.
 */
const notificationConfig = {
  description: 'Sample config for node v2',
  pubsubTopic: pubsubTopic,
  streamingConfig: {filter: 'state = "ACTIVE"'},
};

// Build the request.
const createNotificationRequest = {
  parent: parent,
  configId: configId,
  notificationConfig: notificationConfig,
};

async function createNotificationConfig() {
  const [response] = await client.createNotificationConfig(
    createNotificationRequest
  );
  console.log('Notification configuration creation successful: %j', response);
}

await createNotificationConfig();

Python

def create_notification_config(
    parent_id, location_id, pubsub_topic, notification_config_id
) -> NotificationConfig:
    """
    This method is used to create the Notification Config.
    Args:
        parent_id: must be in one of the following formats:
            "organizations/{organization_id}"
            "projects/{project_id}"
            "folders/{folder_id}"
        location_id: "global"
        pubsub_topic: "projects/{your-project-id}/topics/{your-topic-id}"
        notification_config_id: "your-config-id"


    Ensure this ServiceAccount has the "pubsub.topics.setIamPolicy" permission on the new topic.
    """
    from google.cloud import securitycenter_v2 as securitycenter_v2

    client = securitycenter_v2.SecurityCenterClient()
    parent_id = parent_id + "/locations/" + location_id
    response = client.create_notification_config(
        request={
            "parent": parent_id,
            "config_id": notification_config_id,
            "notification_config": {
                "description": "Notification for active findings",
                "pubsub_topic": pubsub_topic,
                "streaming_config": {"filter": 'state = "ACTIVE"'},
            },
        }
    )
    print(f"create notification config response:{response}")
    return response

Agora, as notificações são publicadas no tópico Pub/Sub que você especificou.

Para publicar notificações, uma conta de serviço é criada para você na forma de service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gserviceaccount.com. Essa conta de serviço é criada quando você cria seu primeiro NotificationConfig e recebe automaticamente o papel securitycenter.notificationServiceAgent na política do IAM para PUBSUB_TOPIC ao criar a configuração de notificação. Esse papel de conta de serviço é necessário para que as notificações funcionem.

Conceder acesso ao perímetro no VPC Service Controls

Se você usar o VPC Service Controls e o tópico do Pub/Sub fizer parte de um projeto dentro de um perímetro de serviço, será necessário conceder acesso a projetos para criar notificações.

Para conceder acesso a projetos, crie regras de entrada e saída para os principais e projetos usados para criar notificações. As regras permitem o acesso a recursos protegidos e permitem que o Pub/Sub verifique se os usuários têm a permissão setIamPolicy no tópico do Pub/Sub.

Antes de criar uma NotificationConfig

Antes de concluir as etapas em Como criar uma NotificationConfig, faça o seguinte:

  1. Acesse a página VPC Service Controls no console do Cloud.

    Acessar o VPC Service Controls

  2. Se necessário, selecione a organização.

  3. Clique no nome do perímetro de serviço que você quer alterar.

    Para encontrar o perímetro de serviço que você precisa modificar, verifique nos registros as entradas que mostram violações RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER. Nessas entradas, verifique o campo servicePerimeterName: accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME.

  4. Clique em Editar perímetro.

  5. No menu de navegação, clique em Política de entrada.

  6. Para configurar regras de entrada para usuários ou contas de serviço, use os seguintes parâmetros:

    • Atributos FROM do cliente da API:
      • No menu suspenso Origem, selecione Todas as origens.
      • No menu suspenso Identidades, escolha Identidades selecionadas.
      • Clique em Selecionar e insira o principal usado para chamar a API Security Command Center.
    • Atributos "Para" dos serviços/recursos do Google Cloud:
      • No menu suspenso Projeto, escolha Projetos selecionados.
      • Clique em Selecionar e insira o projeto que contém o tópico do Pub/Sub.
      • No menu suspenso Serviços, escolha Serviços selecionados e, em seguida, selecione API Cloud Pub/Sub.
      • No menu suspenso Métodos, escolha Todas as ações.
  7. Clique em Save.

  8. No menu de navegação, clique em Política de saída.

  9. Clique em Add Rule.

  10. Para configurar regras de saída para contas de usuário ou serviço, insira os seguintes parâmetros:

    • Atributos FROM do cliente da API:
      • No menu suspenso Identidades, escolha Identidades selecionadas.
      • Clique em Selecionar e insira o principal usado para chamar a API Security Command Center.
    • Atributos "Para" dos serviços/recursos do Google Cloud:
      • No menu suspenso Projeto, escolha Todos os projetos.
      • No menu suspenso Serviços, escolha Serviços selecionados e, em seguida, selecione API Cloud Pub/Sub.
      • No menu suspenso Métodos, escolha Todas as ações.
  11. Clique em Save.

Criar uma regra de entrada para a NotificationConfig

Para criar uma regra de entrada para um NotificationConfig, faça o seguinte:

  1. Conclua as instruções de Como criar uma NotificationConfig.
  2. Abra novamente o perímetro de serviço da seção anterior.
  3. Clique em Política de entrada.
  4. Clique em Add Rule.
  5. Para configurar a regra de entrada para a conta de serviço NotificationConfig criada, insira os seguintes parâmetros:
    • Atributos FROM do cliente da API:
      • No menu suspenso Origem, selecione Todas as origens.
      • No menu suspenso Identidades, escolha Identidades selecionadas.
      • Clique em Selecionar e insira o nome da conta de serviço NotificationConfig: service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gserviceaccount.com
    • Atributos TO de serviços/recursos do GCP:
      • No menu suspenso Projeto, escolha Projetos selecionados.
      • Clique em Selecionar e selecione o projeto que contém o tópico do Pub/Sub.
      • No menu suspenso Serviços, escolha Serviços selecionados e, em seguida, selecione API Cloud Pub/Sub.
      • No menu suspenso Métodos, escolha Todas as ações.
  6. No menu de navegação, clique em Salvar.

As contas de serviço, usuários e projetos selecionados agora podem acessar os recursos protegidos e criar notificações.

Se você seguiu todas as etapas deste guia e as notificações estão funcionando corretamente, agora é possível excluir o seguinte:

  • A regra de entrada do principal
  • A regra de saída para a principal

Essas regras só eram necessárias para configurar o NotificationConfig. No entanto, para que as notificações continuem funcionando, mantenha a regra de entrada da NotificationConfig, que permite publicar notificações no seu tópico do Pub/Sub atrás do perímetro de serviço.

A seguir