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

Para isso, você precisa ter os seguintes papéis do Identity and Access Management (IAM):

  • Administrador da Central de segurança (roles/securitycenter.Admin): para ativar as notificações da API Security Command Center
  • Leitor administrador da Central de segurança (roles/securitycenter.adminViewer): para acessar o Security Command Center no Console do Google Cloud.
  • Para conceder papéis à conta de serviço de notificações ou à conta da CLI gcloud no nível da organização, da pasta ou do projeto, um dos seguintes papéis:
    • Administrador da organização (roles/resourcemanager.organizationAdmin)
    • Administrador de pastas do IAM (roles/resourcemanager.folderIamAdmin)
    • Administrador de projetos do IAM (roles/resourcemanager.projectIamAdmin)

Os papéis do IAM para o Security Command Center podem ser concedidos no nível da organização, da pasta ou do projeto. A capacidade de ver, editar, criar ou atualizar descobertas, recursos e fontes de segurança depende do nível a que você tem acesso. Para saber mais sobre os papéis do Security Command Center, consulte Controle de acesso.

Como configurar notificações da API Security Command Center

Para configurar notificações, primeiro ative a API Security Command Center.

Como ativar a API Security Command Center

Para ativar a API Security Command Center, faça o seguinte:

  1. Acesse a página "Biblioteca de APIs" no Console do Google Cloud.

    Acessar a Biblioteca de APIs

  2. Selecione o projeto em que você quer ativar a API de notificações.

  3. Na caixa Pesquisa, digite Security Command Center e clique no Security Command Center nos resultados da pesquisa.

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

A API Security Command Center está ativada no seu projeto. Em seguida, use a CLI gcloud ou as bibliotecas de cliente para inscrever-se em um tópico do Pub/Sub e configurar permissões.

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 os recursos do Pub/Sub (notificationConfig) estarão sujeitas ao controle de residência de dados e serão armazenadas no seu local do Security Command Center.

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

Como os filtros usados nas exportações contínuas podem conter dados sujeitos aos 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 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 alterar o local dela. Para alterar o local, você precisa excluir a exportação contínua e recriá-la no novo local.

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

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

Da mesma forma, para recuperar uma exportação contínua usando a CLI gcloud, especifique o local no nome completo do recurso da configuração ou usando a sinalização --locations. Exemplo:

gcloud scc notifications describe myContinuousExport organizations/123 \
    --location=locations/us

Como configurar um tópico do Pub/Sub

Nesta etapa, você cria e se inscreve no tópico do Pub/Sub para onde quer enviar notificações. Se você não precisa chamar a API de maneira programática, recomendamos os comandos da CLI gcloud.

gcloud

Para configurar o recurso de notificações da API Security Command Center usando a CLI gcloud, execute as seguintes etapas:

  1. Configure um tópico e uma assinatura do Pub/Sub.
  2. Configure as permissões da conta da CLI da gcloud.

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 para o qual você ativou a API Security Command Center.

  3. Clique em Ativar o Cloud Shell.

  4. Para criar um novo tópico do Pub/Sub ou usar um tópico atual, execute o seguinte comando:

      gcloud pubsub topics create TOPIC_ID
    

    Substitua TOPIC_ID pelo nome do tópico.

  5. Defina a variável de ambiente de ID do tópico:

      export TOPIC_ID=TOPIC_ID
    
  6. Crie uma assinatura para o tópico:

      gcloud pubsub subscriptions create SUBSCRIPTION_ID --topic TOPIC_ID
    

    Substitua SUBSCRIPTION_ID pelo nome da sua assinatura.

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

Em seguida, configure as permissões da sua conta.

Etapa 2: configurar as permissões da conta da CLI gcloud

Para criar um NotificationConfig, você precisa conceder os seguintes papéis à sua conta da CLI gcloud:

  • Administrador da Central de segurança (roles/securitycenter.admin) ou o Editor de configurações de notificação da Central de segurança (roles/securitycenter.notificationConfigEditor). Esse papel precisa ser concedido no mesmo nível (organização, pasta ou projeto) em que você está criando o NotificationConfig.
  • Administrador do Pub/Sub (roles/pubsub.admin) no tópico do Pub/Sub que está recebendo notificações

no nível da organização, pasta ou projeto

Para conceder essas permissões, faça o seguinte:

  1. Acesse o console do Google Cloud.

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

    1. Defina o nome da organização:

      export ORGANIZATION_ID=ORGANIZATION_ID
      

      SubstituaORGANIZATION_ID pelo ID da organização.

    2. Defina o ID do projeto ao qual o tópico do Pub/Sub pertence:

      export PUBSUB_PROJECT=PROJECT_ID
      

      Substitua PROJECT_ID pela ID do seu projeto.

    3. Configure a conta da CLI gcloud que você está usando:

      export GCLOUD_ACCOUNT=EMAIL
      

      Substitua EMAIL pelo endereço de e-mail da conta que executa os comandos da CLI gcloud.

    4. Defina o ID do tópico ou use o tópico criado anteriormente.

      export TOPIC_ID=TOPIC_ID
      

      Substitua TOPIC_ID pelo nome do tópico.

    5. Conceda à conta da CLI gcloud um papel do Pub/Sub que tenha a permissão pubsub.topics.setIamPolicy:

      gcloud pubsub topics add-iam-policy-binding \
        projects/$PUBSUB_PROJECT/topics/$TOPIC_ID \
        --member="user:$GCLOUD_ACCOUNT" \
        --role='roles/pubsub.admin'
      
    6. Conceda à conta da CLI gcloud um papel que inclua todas as permissões securitycenter.notification, como roles/securitycenter.notificationConfigEditor ou roles/securitycenter.admin. É possível conceder o papel no nível do projeto, da pasta ou da organização.

      Para conceder o papel em um nível de projeto:

      gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="user:$GCLOUD_ACCOUNT" \
      --role='ROLE_NAME'
      

      Substitua:

      • PROJECT_ID: o ID do projeto em que o Security Command Center está ativado.
      • ROLE_NAME: o papel a ser atribuído.

      Para conceder o papel no nível da organização:

      gcloud organizations add-iam-policy-binding $ORGANIZATION_ID \
        --member="user:$GCLOUD_ACCOUNT" \
        --role='ROLE_NAME'
      

      Substitua ROLE_NAME pelo papel a ser atribuído.

Em seguida, crie um NotificationConfig.

Bibliotecas de cliente

Para configurar o recurso de notificações da API Security Command Center usando as bibliotecas de cliente, execute as seguintes etapas:

  1. Configurar uma conta de serviço
  2. Faça o download das bibliotecas de cliente da API.
  3. Configure um ambiente para desenvolvedores.
  4. Configure um tópico e uma assinatura do Pub/Sub.

Etapa 1: configuração de uma conta de serviço

O recurso de notificações da API Security Command Center usa uma conta de serviço com as permissões apropriadas para configurar notificações. Essa conta de serviço é usada apenas para a definição inicial de uma configuração. É possível reutilizá-la para criar mais configurações de notificação posteriormente. Essa conta de serviço é separada da conta de serviço criada para você ao configurar o Security Command Center.

Para criar uma conta de serviço, faça o seguinte:

  1. Acesse o console do Google Cloud.

    Acesse 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. Defina as variáveis de ambiente:

    1. Defina o nome da organização:

        export ORGANIZATION_ID=ORGANIZATION_ID
      

      SubstituaORGANIZATION_ID pelo ID da organização.

    2. Defina o ID do projeto em que você quer ativar a API de notificações:

        export PROJECT_ID=PROJECT_ID
      

      Substitua PROJECT_ID pela ID do seu projeto.

    3. Defina o ID personalizado que você quer usar para a nova conta de serviço, como scc-notifications. O nome da conta de serviço precisa ter entre 6 e 30 caracteres, precisa começar com uma letra e ser todos caracteres alfanuméricos minúsculos e hífens:

        export SERVICE_ACCOUNT=CUSTOM_ID
      

      Substitua CUSTOM_ID pelo nome personalizado da conta de serviço.

    4. Defina o caminho em que a chave da conta de serviço precisa ser armazenada, como export KEY_LOCATION=/home/$USER/mykeys/$SERVICE_ACCOUNT.json:

        export KEY_LOCATION=FULL_KEY_LOCATION_PATH
        # This is used by client libraries to find the key
        export GOOGLE_APPLICATION_CREDENTIALS=$KEY_LOCATION
      

      Substitua FULL_KEY_LOCATION_PATH pelo caminho completo da chave da conta de serviço.

  5. Crie uma conta de serviço associada ao ID do projeto:

       gcloud iam service-accounts create $SERVICE_ACCOUNT  --display-name \
        "Service Account for [USER]"  --project $PROJECT_ID
    
  6. Crie uma chave para associar à conta de serviço. A chave é usada quando você cria um NotificationConfig e é armazenada permanentemente no KEY_LOCATION que você especificou nas etapas anteriores.

       gcloud iam service-accounts keys create $KEY_LOCATION  --iam-account \
        $SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
    
  7. Conceda à conta de serviço um papel que inclua todas as permissões securitycenter.notification, como roles/securitycenter.notificationConfigEditor ou roles/securitycenter.admin. É possível conceder o papel no nível do projeto, da pasta ou da organização.

    Conceda o papel para envolvidos no projeto.

       gcloud projects add-iam-policy-binding $PROJECT_ID \
         --member="serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com" \
         --role='ROLE_NAME'
    

    Substitua ROLE_NAME pelo papel a ser atribuído.

    Para conceder o papel no nível da organização:

       gcloud organizations add-iam-policy-binding $ORGANIZATION_ID \
         --member="serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com" \
         --role='ROLE_NAME'
    

    Substitua ROLE_NAME pelo papel a ser atribuído.

A conta de serviço está configurada para ser usada com notificações e a chave da conta de serviço é armazenada no KEY_LOCATION especificado. Para saber mais sobre contas de serviço, consulte Como criar e gerenciar chaves de contas de serviço.

Etapa 2: configuração de um ambiente de desenvolvimento

Para usar o recurso de notificações da API Security Command Center, use a usar a CLI gcloud ou faça o download das bibliotecas de cliente e configure um ambiente de desenvolvimento para a linguagem que preferir.

Python

  1. Opcional: antes de instalar a biblioteca do Python, recomendamos usar o Virtualenv para criar um ambiente Python isolado.

     virtualenv YOUR_ENV
     source YOUR_ENV/bin/activate
    

    Substitua YOUR_ENV pelo nome do seu ambiente.

  2. Instale o pip para gerenciar a instalação da biblioteca Python.

  3. Execute os seguintes comandos para instalar a biblioteca Python:

     pip install google-cloud-securitycenter
    

Java

Para incluir a biblioteca Java do Security Command Center como uma dependência no seu projeto, selecione um artefato no repositório Maven. As notificações são incluídas na versão 0.119.0 e posteriores da biblioteca.

Se você estiver usando o Intellij, defina a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS como o caminho absoluto da chave da conta de serviço da notificação que você salvou nas etapas anteriores:

  1. No Intelij, clique em Executar. Editar configurações.
  2. Defina a seguinte variável em Aplicativo > Run_Configuration_For_Sample e Variáveis de ambiente:

      GOOGLE_APPLICATION_CREDENTIALS=ABSOLUTE_PATH_TO_SERVICE_ACCOUNT_KEY
    

    Substitua ABSOLUTE_PATH_TO_SERVICE_ACCOUNT_KEY pelo caminho completo da chave da conta de serviço.

Go

Para instalar as dependências do Go na API de notificações, faça o download da biblioteca Go:

  go get cloud.google.com/go/securitycenter/apiv1

Node.js

Na pasta do projeto, use npm para instalar as dependências necessárias da API de notificações:

  npm install --save @google-cloud/security-center/

Etapa 3: configuração do Pub/Sub

Para entregar notificações no Pub/Sub, inscreva-se em um tópico do Pub/Sub e conceda à conta de serviço de notificações um papel do IAM que inclua a permissão pubsub.topics.setIamPolicy:

  1. Crie um novo tópico do Pub/Sub ou use um tópico atual:

       gcloud pubsub topics create TOPIC_ID
    

    Substitua TOPIC_ID pelo ID do tópico.

  2. Defina as variáveis de ambiente:

    1. Defina o ID do tópico:

        export TOPIC_ID=TOPIC_ID
      
    2. Defina o ID do projeto em que você ativou a API de notificações:

        export CONSUMER_PROJECT=PROJECT_ID
      

      Substitua PROJECT_ID pela ID do seu projeto.

    3. Defina o e-mail da conta de serviço que você criou nas etapas anteriores:

        export SERVICE_ACCOUNT_EMAIL=SERVICE_ACCOUNT_NAME@$CONSUMER_PROJECT.iam.gserviceaccount.com
      

      Substitua SERVICE_ACCOUNT_NAME pelo nome da conta de serviço.

  3. Crie uma assinatura para o tópico:

       gcloud pubsub subscriptions create SUBSCRIPTION_ID --topic TOPIC_ID
    

    Substitua SUBSCRIPTION_ID pelo ID da assinatura.

  4. Conceda à conta do serviço de notificações um papel com a permissão pubsub.topics.setIamPolicy:

    gcloud pubsub topics add-iam-policy-binding \
         projects/$CONSUMER_PROJECT/topics/$TOPIC_ID \
      --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
      --role='roles/pubsub.admin'
    

Para saber mais sobre como configurar o Pub/Sub, consulte Como gerenciar tópicos e assinaturas. Na próxima etapa, conclua a configuração criando um NotificationConfig.

Como 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 Central 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 posteriormente, será necessário incluir o ID numérico da organização, pasta ou projeto pai ao indicá-lo.

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, especifique o local do Security Command Center em que a notificação será criada. O recurso notificationConfig resultante é armazenado apenas nesse local. Somente as descobertas emitidas nesse local são enviadas ao Pub/Sub.

    Se a residência de dados não estiver ativada, especificar a sinalização --location criará a notificação usando a API Security Command Center v2, e o único valor válido para a sinalização será global.

  • NOTIFICATION_DESCRIPTION: uma descrição da notificação com no máximo 1.024 caracteres.

  • PUBSUB_TOPIC: o tópico do Pub/Sub que receberá notificações. O formato é projects/PROJECT_ID/topics/TOPIC.

  • FILTER: a expressão que você define para selecionar quais descobertas são enviadas ao Pub/Sub. Por exemplo, state="ACTIVE".

Python

O exemplo a seguir usa a API v1. Para modificar o exemplo para v2, substitua v1 por v2 e adicione /locations/LOCATION ao nome do recurso.

Para a maioria dos recursos, adicione /locations/LOCATION ao nome do recurso após /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao nome do recurso depois de /sources/SOURCE_ID, em que SOURCE_ID é o ID do serviço do Security Command Center que emitiu a descoberta.

def create_notification_config(parent_id, notification_config_id, pubsub_topic):
    """
    Args:
        parent_id: must be in one of the following formats:
            "organizations/{organization_id}"
            "projects/{project_id}"
            "folders/{folder_id}"
        notification_config_id: "your-config-id"
        pubsub_topic: "projects/{your-project-id}/topics/{your-topic-ic}"

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

    client = securitycenter.SecurityCenterClient()

    created_notification_config = 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(created_notification_config)

Java

O exemplo a seguir usa a API v1. Para modificar o exemplo para v2, substitua v1 por v2 e adicione /locations/LOCATION ao nome do recurso.

Para a maioria dos recursos, adicione /locations/LOCATION ao nome do recurso após /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao nome do recurso depois de /sources/SOURCE_ID, em que SOURCE_ID é o ID do serviço do Security Command Center que emitiu a descoberta.


import com.google.cloud.securitycenter.v1.CreateNotificationConfigRequest;
import com.google.cloud.securitycenter.v1.NotificationConfig;
import com.google.cloud.securitycenter.v1.NotificationConfig.StreamingConfig;
import com.google.cloud.securitycenter.v1.SecurityCenterClient;
import java.io.IOException;

public class CreateNotificationConfigSnippets {

  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 = String.format("organizations/%s", "ORG_ID");
    String notificationConfigId = "{config-id}";
    String projectId = "{your-project}";
    String topicName = "{your-topic}";

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

  // Crete a notification config.
  // Ensure the ServiceAccount has the "pubsub.topics.setIamPolicy" permission on the new topic.
  public static NotificationConfig createNotificationConfig(
      String parentId, String notificationConfigId, String projectId, String topicName)
      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()) {

      // Ensure this ServiceAccount has the "pubsub.topics.setIamPolicy" permission on the topic.
      String pubsubTopic = String.format("projects/%s/topics/%s", projectId, topicName);

      CreateNotificationConfigRequest request =
          CreateNotificationConfigRequest.newBuilder()
              .setParent(parentId)
              .setConfigId(notificationConfigId)
              .setNotificationConfig(
                  NotificationConfig.newBuilder()
                      .setDescription("Java notification config")
                      .setPubsubTopic(pubsubTopic)
                      .setStreamingConfig(
                          StreamingConfig.newBuilder().setFilter("state = \"ACTIVE\"").build())
                      .build())
              .build();

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

Go

O exemplo a seguir usa a API v1. Para modificar o exemplo para v2, substitua v1 por v2 e adicione /locations/LOCATION ao nome do recurso.

Para a maioria dos recursos, adicione /locations/LOCATION ao nome do recurso após /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao nome do recurso depois de /sources/SOURCE_ID, em que SOURCE_ID é o ID do serviço do Security Command Center que emitiu a descoberta.

import (
	"context"
	"fmt"
	"io"

	securitycenter "cloud.google.com/go/securitycenter/apiv1"
	"cloud.google.com/go/securitycenter/apiv1/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}"
		//		"projects/{projectId}"
		//		"folders/{folderId}"
		Parent:   fmt.Sprintf("organizations/%s", 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
}

Node.js

O exemplo a seguir usa a API v1. Para modificar o exemplo para v2, substitua v1 por v2 e adicione /locations/LOCATION ao nome do recurso.

Para a maioria dos recursos, adicione /locations/LOCATION ao nome do recurso após /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao nome do recurso depois de /sources/SOURCE_ID, em que SOURCE_ID é o ID do serviço do Security Command Center que emitiu a descoberta.

// npm install '@google-cloud/security-center'
const {SecurityCenterClient} = require('@google-cloud/security-center');

const client = new SecurityCenterClient();

// parent: must be in one of the following formats:
//    `organizations/${organization_id}`
//    `projects/${project_id}`
//    `folders/${folder_id}`
// configId = "your-config-name";
// pubsubTopic = "projects/{your-project}/topics/{your-topic}";
// Ensure this Service Account has the "pubsub.topics.setIamPolicy" permission on this topic.
const parent = `organizations/${organizationId}`;

async function createNotificationConfig() {
  const [response] = await client.createNotificationConfig({
    parent: parent,
    configId: configId,
    notificationConfig: {
      description: 'Sample config for node.js',
      pubsubTopic: pubsubTopic,
      streamingConfig: {filter: 'state = "ACTIVE"'},
    },
  });
  console.log('Notification config creation succeeded: ', response);
}

createNotificationConfig();

PHP

O exemplo a seguir usa a API v1. Para modificar o exemplo para v2, substitua v1 por v2 e adicione /locations/LOCATION ao nome do recurso.

Para a maioria dos recursos, adicione /locations/LOCATION ao nome do recurso após /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao nome do recurso depois de /sources/SOURCE_ID, em que SOURCE_ID é o ID do serviço do Security Command Center que emitiu a descoberta.

use Google\Cloud\SecurityCenter\V1\Client\SecurityCenterClient;
use Google\Cloud\SecurityCenter\V1\CreateNotificationConfigRequest;
use Google\Cloud\SecurityCenter\V1\NotificationConfig;
use Google\Cloud\SecurityCenter\V1\NotificationConfig\StreamingConfig;

/**
 * @param string $organizationId        Your org ID
 * @param string $notificationConfigId  A unique identifier
 * @param string $projectId             Your Cloud Project ID
 * @param string $topicName             Your topic name
 */
function create_notification(
    string $organizationId,
    string $notificationConfigId,
    string $projectId,
    string $topicName
): void {
    $securityCenterClient = new SecurityCenterClient();
    // 'parent' must be in one of the following formats:
    //		"organizations/{orgId}"
    //		"projects/{projectId}"
    //		"folders/{folderId}"
    $parent = $securityCenterClient::organizationName($organizationId);
    $pubsubTopic = $securityCenterClient::topicName($projectId, $topicName);

    $streamingConfig = (new StreamingConfig())->setFilter('state = "ACTIVE"');
    $notificationConfig = (new NotificationConfig())
        ->setDescription('A sample notification config')
        ->setPubsubTopic($pubsubTopic)
        ->setStreamingConfig($streamingConfig);
    $createNotificationConfigRequest = (new CreateNotificationConfigRequest())
        ->setParent($parent)
        ->setConfigId($notificationConfigId)
        ->setNotificationConfig($notificationConfig);

    $response = $securityCenterClient->createNotificationConfig($createNotificationConfigRequest);
    printf('Notification config was created: %s' . PHP_EOL, $response->getName());
}

Ruby

O exemplo a seguir usa a API v1. Para modificar o exemplo para v2, substitua v1 por v2 e adicione /locations/LOCATION ao nome do recurso.

Para a maioria dos recursos, adicione /locations/LOCATION ao nome do recurso após /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao nome do recurso depois de /sources/SOURCE_ID, em que SOURCE_ID é o ID do serviço do Security Command Center que emitiu a descoberta.

require "google/cloud/security_center"

# Your organization id. e.g. for "organizations/123", this would be "123".
# org_id = "YOUR_ORGANZATION_ID"

# Your notification config id. e.g. for
# "organizations/123/notificationConfigs/my-config" this would be "my-config".
# config_id = "YOUR_CONFIG_ID"

# The PubSub topic where notifications will be published.
# pubsub_topic = "YOUR_TOPIC"

client = Google::Cloud::SecurityCenter.security_center

# You can also use 'project_id' or 'folder_id' as a parent.
# client.project_path project: project_id
# client.folder_path folder: folder_id
parent = client.organization_path organization: org_id

notification_config = {
  description:      "Sample config for Ruby",
  pubsub_topic:     pubsub_topic,
  streaming_config: { filter: 'state = "ACTIVE"' }
}

response = client.create_notification_config(
  parent:              parent,
  config_id:           config_id,
  notification_config: notification_config
)
puts "Created notification config #{config_id}: #{response}."

C#

O exemplo a seguir usa a API v1. Para modificar o exemplo para v2, substitua v1 por v2 e adicione /locations/LOCATION ao nome do recurso.

Para a maioria dos recursos, adicione /locations/LOCATION ao nome do recurso após /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao nome do recurso depois de /sources/SOURCE_ID, em que SOURCE_ID é o ID do serviço do Security Command Center que emitiu a descoberta.


using Google.Api.Gax.ResourceNames;
using Google.Cloud.SecurityCenter.V1;
using System;

///<summary> Create NotificationConfig Snippet. </summary>
public class CreateNotificationConfigSnippets
{
    public static NotificationConfig CreateNotificationConfig(
        string organizationId, string notificationConfigId, string projectId, string topicName)
    {
        // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
        //      ProjectName projectName = new ProjectName(projectId);
        //      FolderName folderName = new FolderName(folderId);
        OrganizationName orgName = new OrganizationName(organizationId);
        TopicName pubsubTopic = new TopicName(projectId, topicName);

        SecurityCenterClient client = SecurityCenterClient.Create();
        CreateNotificationConfigRequest request = new CreateNotificationConfigRequest
        {
            ParentAsOrganizationName = orgName,
            ConfigId = notificationConfigId,
            NotificationConfig = new NotificationConfig
            {
                Description = ".Net notification config",
                PubsubTopicAsTopicName = pubsubTopic,
                StreamingConfig = new NotificationConfig.Types.StreamingConfig { Filter = "state = \"ACTIVE\"" }
            }
        };

        NotificationConfig response = client.CreateNotificationConfig(request);
        Console.WriteLine($"Notification config was created: {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.

Como conceder acesso de 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 Salvar.

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

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