Como criar e gerenciar configurações de notificação

Nesta página, você verá como usar o recurso de notificações da API Security Command Center, incluindo os exemplos a seguir:

  • Criar um NotificationConfig
  • Receber um NotificationConfig
  • Atualizar um NotificationConfig
  • Excluir um NotificationConfig
  • Listar NotificationConfig
  • Receber notificações do Pub/Sub

Como alternativa, os clientes do Security Command Center Premium podem configurar exportações contínuas para Pub/Sub no Security Command Center.

Antes de começar

Para usar os exemplos nesta página, você precisa completar o guia para configurar notificações de descoberta.

Para executar os exemplos a seguir, você precisa de um papel de Gerenciamento de identidade e acesso (IAM, na sigla em inglês) com as permissões apropriadas:

  • Criar NotificationConfig: configurações de notificação da Central de segurança Editor (roles/securitycenter.notificationConfigEditor)
  • Receber e listar NotificationConfig: visualizador de configurações de notificação da Central de segurança (roles/securitycenter.notificationConfigViewer) ou editor de configurações de notificação da Central de segurança (roles/securitycenter.notificationConfigEditor)
  • Atualizar e excluir NotificationConfig: Editor de notificações da Central de segurança (roles/securitycenter.notificationConfigEditor)

Para conceder os papéis apropriados a um principal que acesse um notificationConfig, é preciso ter um dos seguintes papéis do IAM:

  • Administrador da organização (roles/resourcemanager.organizationAdmin)
  • Administrador de pastas do IAM (roles/resourcemanager.folderIamAdmin)
  • Administrador de IAM do projeto (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 Para papéis do Security Command Center, consulte Controle de acesso.

Residência de dados e notificações

Se a residência dos dados ativado para o Security Command Center, as configurações que definem exportações contínuas para Os recursos do Pub/Sub (notificationConfig) estão sujeitos controle de residência de dados e são armazenados Local do Security Command Center.

Para exportar as descobertas em um local do Security Command Center para no Pub/Sub, é preciso configurar o fluxo contínuo e exportar no mesmo local do Security Command Center que as descobertas.

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, você precisa 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, você precisa especificar o local no nome do recurso completo da configuração ou usando a flag --locations. Exemplo:

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

Como criar um NotificationConfig

Para criar um NotificationConfig, você precisa ter:

  • um tópico do Pub/Sub para onde você quer enviar notificações;
  • Papéis do IAM necessários para o principal que cria o notificationConfig.

Para mais informações, consulte a etapa para configurar um tópico do Pub/Sub no guia para configurar notificações de localização.

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 na API Security Command Center findings.list .

Ao criar um NotificationConfig, você especifica um pai para o NotificationConfig da hierarquia de recursos do Google Cloud, seja um organização, pasta ou 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.

Para criar o NotificationConfig usando o idioma ou a plataforma do 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 caracteres alfanuméricos. apenas 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, especificado no formato de 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 neste local. Somente as descobertas emitidas nesse local são enviadas ao Pub/Sub.

Se a residência de dados não estiver ativada, a especificação da flag --location vai criar a notificação usando a API Security Command Center v2, e o único valor válido para a flag é 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 será 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\".

Python

O exemplo a seguir usa a API v1. Para modificar o exemplo para a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders, ou projects.

Para descobertas, adicione /locations/LOCATION ao 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 a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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 a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders, ou projects.

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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 exemplo da v2, substitua v1 por v2 e adicione /locations/LOCATION, que é o nome do recurso.

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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 exemplo da v2, substitua v1 por v2 e adicione /locations/LOCATION, que é o nome do recurso.

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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 exemplo da v2, substitua v1 por v2 e adicione /locations/LOCATION, que é o nome do recurso.

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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 exemplo da v2, substitua v1 por v2 e adicione /locations/LOCATION, que é o nome do recurso.

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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. Isso o papel da conta de serviço é necessário para que as notificações funcionem.

Como receber uma NotificationConfig

Para acessar um NotificationConfig, você precisa ter um papel do IAM que inclua a permissão securitycenter.notification.get.

gcloud

gcloud scc notifications describe PARENT_TYPE/PARENT_ID/locations/LOCATION/notificationConfigs/NOTIFICATION_NAME

Substitua:

  • PARENT_TYPE com organizations, folders, ou projects, dependendo do nível da hierarquia de recursos especificado na configuração de notificação.
  • PARENT_ID pelo ID numérico do recurso pai.
  • LOCATION: obrigatório se os nomes de residência dos dados está ativado ou notificationConfig recursos foram criados usando o API v2.

    Se a residência de dados estiver ativada, especifique Local do Security Command Center no qual as notificações são armazenadas.

    Se a residência de dados não estiver ativada, inclua /locations/LOCATION somente se o notificationConfig recurso foi criado usando o a API Security Command Center v2. Nesse caso, o único local válido é global.

  • NOTIFICATION_NAME: o nome da notificação.

Python

O exemplo a seguir usa a API v1. Para modificar o exemplo para a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

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

def get_notification_config(parent_id, notification_config_id):
    """
    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"
    """
    from google.cloud import securitycenter as securitycenter

    client = securitycenter.SecurityCenterClient()

    notification_config_name = (
        f"{parent_id}/notificationConfigs/{notification_config_id}"
    )

    notification_config = client.get_notification_config(
        request={"name": notification_config_name}
    )
    print(f"Got notification config: {notification_config}")

Java

O exemplo a seguir usa a API v1. Para modificar o exemplo para a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao 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.NotificationConfig;
import com.google.cloud.securitycenter.v1.SecurityCenterClient;
import java.io.IOException;

public class GetNotificationConfigSnippets {

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

    getNotificationConfig(parentId, notificationConfigId);
  }

  // Retrieve an existing notification config.
  public static NotificationConfig getNotificationConfig(
      String parentId, 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()) {
      NotificationConfig response =
          client.getNotificationConfig(String.format("%s/notificationConfigs/%s",
              parentId, notificationConfigId));

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

Go

O exemplo a seguir usa a API v1. Para modificar o exemplo para a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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 getNotificationConfig(w io.Writer, orgID string, notificationConfigID string) error {
	// orgID := "your-org-id"
	// 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()

	// Parent must be in one of the following formats:
	//		"organizations/{orgId}"
	//		"projects/{projectId}"
	//		"folders/{folderId}"
	parent := fmt.Sprintf("organizations/%s", orgID)
	req := &securitycenterpb.GetNotificationConfigRequest{
		Name: fmt.Sprintf("%s/notificationConfigs/%s", parent, notificationConfigID),
	}

	notificationConfig, err := client.GetNotificationConfig(ctx, req)
	if err != nil {
		return fmt.Errorf("Failed to retrieve notification config: %w", err)
	}
	fmt.Fprintln(w, "Received config: ", notificationConfig)

	return nil
}

Node.js

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

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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();

// formattedConfigName: You can also use
//    `client.projectNotificationConfigPath(projectId, configId)` or
//    `client.folderNotificationConfigPath(folderId, configId)`.
// configId = "your-config-id";
const formattedConfigName = client.organizationNotificationConfigPath(
  organizationId,
  configId
);

async function getNotificationConfg() {
  const [response] = await client.getNotificationConfig({
    name: formattedConfigName,
  });
  console.log('Notification config: ', response);
}

getNotificationConfg();

PHP

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

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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\GetNotificationConfigRequest;

/**
 * @param string $organizationId        Your org ID
 * @param string $notificationConfigId  A unique identifier
 */
function get_notification(string $organizationId, string $notificationConfigId): void
{
    $securityCenterClient = new SecurityCenterClient();
    $notificationConfigName = $securityCenterClient::notificationConfigName(
        // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
        $organizationId,
        $notificationConfigId
    );
    $getNotificationConfigRequest = (new GetNotificationConfigRequest())
        ->setName($notificationConfigName);

    $response = $securityCenterClient->getNotificationConfig($getNotificationConfigRequest);
    printf('Notification config was retrieved: %s' . PHP_EOL, $response->getName());
}

Ruby

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

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

Para descobertas, adicione /locations/LOCATION ao 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"

client = Google::Cloud::SecurityCenter.security_center

# You can also use 'project_id' or 'folder_id' as a parent.
config_path = client.notification_config_path organization:        org_id,
                                              notification_config: config_id

response = client.get_notification_config name: config_path
puts "Notification config fetched: #{response}"

C#

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

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

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


using Google.Cloud.SecurityCenter.V1;
using System;

/// <summary>Snippet for GetNotificationConfig</summary>
public class GetNotificationConfigSnippets
{
    public static NotificationConfig GetNotificationConfig(string organizationId, string configId)
    {
        SecurityCenterClient client = SecurityCenterClient.Create();
        // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
        NotificationConfigName notificationConfigName = new NotificationConfigName(organizationId, configId);

        NotificationConfig response = client.GetNotificationConfig(notificationConfigName);
        Console.WriteLine($"Notification config: {response}");
        return response;
    }
}

Como atualizar um NotificationConfig

Para atualizar um NotificationConfig, você precisa ter um papel de IAM que inclua a permissão securitycenter.notification.update.

Quando você faz a atualização usando uma máscara de campo, somente os campos especificados são atualizados. Se você não usar uma máscara de campo, todos os campos mutáveis no NotificationConfig serão substituídos pelos novos valores. Você pode usar uma máscara de campo para atualizar o tópico e a descrição do Pub/Sub.

Para concluir este exemplo, você precisa estar inscrito no novo tópico e sua conta de serviço de notificações precisa ter a permissão pubsub.topics.setIamPolicy no tópico.

Depois de conceder as permissões necessárias, atualize a descrição de NotificationConfig, o tópico do Pub/Sub e filtre usando a linguagem de sua escolha:

gcloud

gcloud scc notifications update PARENT_TYPE/PARENT_ID/locations/LOCATION/notificationConfigs/NOTIFICATION_NAME
--description="NOTIFICATION_DESCRIPTION" \
--pubsub-topic=PUBSUB_TOPIC \
--filter="FILTER"

Substitua:

  • PARENT_TYPE com organizations, folders, ou projects, dependendo do nível da hierarquia de recursos especificado na configuração de notificação.
  • PARENT_ID pelo ID numérico do recurso pai.
  • LOCATION: obrigatório se a residência de dados estiver ativada ou se o notificationConfig foi criado usando a API v2.

    Se a residência de dados estiver ativada, especifique Local do Security Command Center no qual a notificação é armazenada.

    Se a residência de dados não estiver ativada, inclua /locations/LOCATION no nome completo ou especifique a flag --location somente se notificationConfig ele foi criado com a API Security Command Center v2. Nesse caso, o único local válido é global.

  • NOTIFICATION_NAME: o nome da notificação.

  • 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 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 a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders, ou projects.

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

def update_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: "config-id-to-update"
        pubsub_topic: "projects/{new-project}/topics/{new-topic}"

    If updating a pubsub_topic, ensure this ServiceAccount has the
    "pubsub.topics.setIamPolicy" permission on the new topic.
    """
    from google.cloud import securitycenter as securitycenter
    from google.protobuf import field_mask_pb2

    client = securitycenter.SecurityCenterClient()

    notification_config_name = (
        f"{parent_id}/notificationConfigs/{notification_config_id}"
    )

    updated_description = "New updated description"
    updated_filter = 'state = "INACTIVE"'

    # Only description and pubsub_topic can be updated.
    field_mask = field_mask_pb2.FieldMask(
        paths=["description", "pubsub_topic", "streaming_config.filter"]
    )

    updated_notification_config = client.update_notification_config(
        request={
            "notification_config": {
                "name": notification_config_name,
                "description": updated_description,
                "pubsub_topic": pubsub_topic,
                "streaming_config": {"filter": updated_filter},
            },
            "update_mask": field_mask,
        }
    )

    print(updated_notification_config)

Java

O exemplo a seguir usa a API v1. Para modificar o exemplo para a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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.NotificationConfig;
import com.google.cloud.securitycenter.v1.NotificationConfig.StreamingConfig;
import com.google.cloud.securitycenter.v1.SecurityCenterClient;
import com.google.protobuf.FieldMask;
import java.io.IOException;

public class UpdateNotificationConfigSnippets {

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

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

  // Update an existing notification config.
  // If updating a Pubsub Topic, ensure the ServiceAccount has the
  // "pubsub.topics.setIamPolicy" permission on the new topic.
  public static NotificationConfig updateNotificationConfig(
      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()) {

      String notificationConfigName =
          String.format(
              "%s/notificationConfigs/%s", parentId, notificationConfigId);

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

      NotificationConfig configToUpdate =
          NotificationConfig.newBuilder()
              .setName(notificationConfigName)
              .setDescription("updated description")
              .setPubsubTopic(pubsubTopic)
              .setStreamingConfig(StreamingConfig.newBuilder().setFilter("state = \"ACTIVE\""))
              .build();

      FieldMask fieldMask =
          FieldMask.newBuilder()
              .addPaths("description")
              .addPaths("pubsub_topic")
              .addPaths("streaming_config.filter")
              .build();

      NotificationConfig updatedConfig = client.updateNotificationConfig(configToUpdate, fieldMask);

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

Go

O exemplo a seguir usa a API v1. Para modificar o exemplo para a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders, ou projects.

Para descobertas, adicione /locations/LOCATION ao 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"
	"google.golang.org/genproto/protobuf/field_mask"
)

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

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

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

	updatedDescription := "Updated sample config"
	updatedFilter := `state = "INACTIVE"`
	// Parent must be in one of the following formats:
	//		"organizations/{orgId}"
	//		"projects/{projectId}"
	//		"folders/{folderId}"
	parent := fmt.Sprintf("organizations/%s", orgID)
	req := &securitycenterpb.UpdateNotificationConfigRequest{
		NotificationConfig: &securitycenterpb.NotificationConfig{
			Name:        fmt.Sprintf("%s/notificationConfigs/%s", parent, notificationConfigID),
			Description: updatedDescription,
			PubsubTopic: updatedPubsubTopic,
			NotifyConfig: &securitycenterpb.NotificationConfig_StreamingConfig_{
				StreamingConfig: &securitycenterpb.NotificationConfig_StreamingConfig{
					Filter: updatedFilter,
				},
			},
		},
		UpdateMask: &field_mask.FieldMask{
			Paths: []string{"description", "pubsub_topic", "streaming_config.filter"},
		},
	}

	notificationConfig, err := client.UpdateNotificationConfig(ctx, req)
	if err != nil {
		return fmt.Errorf("Failed to update notification config: %w", err)
	}

	fmt.Fprintln(w, "Updated NotificationConfig: ", notificationConfig)

	return nil
}

Node.js

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

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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();

// formattedConfigName: You can also use
//    `client.projectNotificationConfigPath(projectId, configId)` or
//    `client.folderNotificationConfigPath(folderId, configId)`.
// configId = "your-config-id";
const formattedConfigName = client.organizationNotificationConfigPath(
  organizationId,
  configId
);

// pubsubTopic = "projects/{your-project}/topics/{your-topic}";
// Ensure this Service Account has the "pubsub.topics.setIamPolicy" permission on this topic.

async function updateNotificationConfig() {
  const [response] = await client.updateNotificationConfig({
    updateMask: {
      paths: ['description', 'pubsub_topic', 'streaming_config.filter'],
    },
    notificationConfig: {
      name: formattedConfigName,
      description: 'Updated config description',
      pubsubTopic: pubsubTopic,
      streamingConfig: {filter: 'state = "INACTIVE"'},
    },
  });
  console.log('notification config update succeeded: ', response);
}

updateNotificationConfig();

PHP

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

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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\NotificationConfig;
use Google\Cloud\SecurityCenter\V1\NotificationConfig\StreamingConfig;
use Google\Cloud\SecurityCenter\V1\UpdateNotificationConfigRequest;
use Google\Protobuf\FieldMask;

/**
 * @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 update_notification(
    string $organizationId,
    string $notificationConfigId,
    string $projectId,
    string $topicName
): void {
    $securityCenterClient = new SecurityCenterClient();

    // Ensure this ServiceAccount has the 'pubsub.topics.setIamPolicy' permission on the topic.
    // https://cloud.google.com/pubsub/docs/reference/rest/v1/projects.topics/setIamPolicy
    $pubsubTopic = $securityCenterClient::topicName($projectId, $topicName);
    // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
    $notificationConfigName = $securityCenterClient::notificationConfigName($organizationId, $notificationConfigId);

    $streamingConfig = (new StreamingConfig())->setFilter('state = "ACTIVE"');
    $fieldMask = (new FieldMask())->setPaths(['description', 'pubsub_topic', 'streaming_config.filter']);
    $notificationConfig = (new NotificationConfig())
        ->setName($notificationConfigName)
        ->setDescription('Updated description.')
        ->setPubsubTopic($pubsubTopic)
        ->setStreamingConfig($streamingConfig);
    $updateNotificationConfigRequest = (new UpdateNotificationConfigRequest())
        ->setNotificationConfig($notificationConfig);

    $response = $securityCenterClient->updateNotificationConfig($updateNotificationConfigRequest);
    printf('Notification config was updated: %s' . PHP_EOL, $response->getName());
}

Ruby

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

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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"

# Updated description of the notification config.
# description = "YOUR_DESCRIPTION"

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

# Updated filter string for Notification config.
# filter = "UPDATED_FILTER"

client = Google::Cloud::SecurityCenter.security_center

# You can also use 'project_id' or 'folder_id' as a parent.
config_path = client.notification_config_path organization:        org_id,
                                              notification_config: config_id
notification_config = { name: config_path }
notification_config[:description] = description unless description.nil?
notification_config[:pubsub_topic] = pubsub_topic unless pubsub_topic.nil?
notification_config[:streaming_config][:filter] = filter unless filter.nil?

paths = []
paths.push "description" unless description.nil?
paths.push "pubsub_topic" unless pubsub_topic.nil?
paths.push "streaming_config.filter" unless filter.nil?
update_mask = { paths: paths }

response = client.update_notification_config(
  notification_config: notification_config,
  update_mask:         update_mask
)
puts response

C#

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

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

Para descobertas, adicione /locations/LOCATION ao 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.Cloud.SecurityCenter.V1;
using static Google.Cloud.SecurityCenter.V1.NotificationConfig.Types;
using Google.Protobuf.WellKnownTypes;
using System;

/// <summary>Snippet for UpdateNotificationConfig</summary>
public class UpdateNotificationConfigSnippets
{
    public static NotificationConfig UpdateNotificationConfig(
        string organizationId, string notificationConfigId, string projectId, string topicName)
    {
        // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
        NotificationConfigName notificationConfigName = new NotificationConfigName(organizationId, notificationConfigId);
        TopicName pubsubTopic = new TopicName(projectId, topicName);

        NotificationConfig configToUpdate = new NotificationConfig
        {
            NotificationConfigName = notificationConfigName,
            Description = "updated description",
            PubsubTopicAsTopicName = pubsubTopic,
            StreamingConfig = new StreamingConfig { Filter = "state = \"INACTIVE\"" }
        };

        FieldMask fieldMask = new FieldMask { Paths = { "description", "pubsub_topic", "streaming_config.filter" } };
        SecurityCenterClient client = SecurityCenterClient.Create();
        NotificationConfig updatedConfig = client.UpdateNotificationConfig(configToUpdate, fieldMask);

        Console.WriteLine($"Notification config updated: {updatedConfig}");
        return updatedConfig;
    }
}

Como excluir uma NotificationConfig

Para excluir um NotificationConfig, você precisa ter um papel do IAM que inclua a permissão securitycenter.notification.delete.

Quando você exclui um NotificationConfig, o papel securitycenter.notificationServiceAgent permanece no tópico do Pub/Sub. Se você não estiver usando o tópico Pub/Sub em qualquer outro NotificationConfig, remova o papel do tópico. Para mais informações, consulte controle de acesso.

Exclua um NotificationConfig usando o idioma de sua escolha:

gcloud

gcloud scc notifications delete PARENT_TYPE/PARENT_ID/locations/LOCATION/notificationConfigs/NOTIFICATION_NAME

Substitua:

  • PARENT_TYPE com organizations, folders, ou projects, dependendo do nível da hierarquia de recursos especificado na configuração de notificação.
  • PARENT_ID pelo ID numérico do recurso pai.
  • LOCATION: obrigatório se a residência de dados estiver ativada ou se o notificationConfig foi criado usando a API v2.

    Se a residência de dados estiver ativada, especifique Local do Security Command Center no qual a notificação é armazenada.

    Se a residência de dados não estiver ativada, inclua /locations/LOCATION no nome completo ou especifique a flag --location somente se o notificationConfig tiver sido criado usando a API Security Command Center v2. Nesse caso, o único local válido é global.

  • NOTIFICATION_NAME: o nome da notificação.

Python

O exemplo a seguir usa a API v1. Para modificar o exemplo para a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

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

def delete_notification_config(parent_id, notification_config_id):
    """
    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"
    """
    from google.cloud import securitycenter as securitycenter

    client = securitycenter.SecurityCenterClient()

    notification_config_name = (
        f"{parent_id}/notificationConfigs/{notification_config_id}"
    )

    client.delete_notification_config(request={"name": notification_config_name})
    print(f"Deleted notification config: {notification_config_name}")

Java

O exemplo a seguir usa a API v1. Para modificar o exemplo para a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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.SecurityCenterClient;
import java.io.IOException;

public class DeleteNotificationConfigSnippets {

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

    deleteNotificationConfig(parentId, notificationConfigId);
  }

  // Delete a notification config.
  public static boolean deleteNotificationConfig(String parentId, 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()) {

      client.deleteNotificationConfig(String.format("%s/notificationConfigs/%s",
          parentId, notificationConfigId));

      System.out.printf("Deleted Notification config: %s%n", notificationConfigId);
    }
    return true;
  }
}

Go

O exemplo a seguir usa a API v1. Para modificar o exemplo para a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

Para descobertas, adicione /locations/LOCATION ao 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 deleteNotificationConfig(w io.Writer, orgID string, notificationConfigID string) error {
	// orgID := "your-org-id"
	// notificationConfigID := "config-to-delete"

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

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

	// Parent must be in one of the following formats:
	//		"organizations/{orgId}"
	//		"projects/{projectId}"
	//		"folders/{folderId}"
	parent := fmt.Sprintf("organizations/%s", orgID)
	name := fmt.Sprintf("%s/notificationConfigs/%s", parent, notificationConfigID)
	req := &securitycenterpb.DeleteNotificationConfigRequest{
		Name: name,
	}

	if err = client.DeleteNotificationConfig(ctx, req); err != nil {
		return fmt.Errorf("Failed to retrieve notification config: %w", err)
	}
	fmt.Fprintln(w, "Deleted config: ", name)

	return nil
}

Node.js

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

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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();

// formattedConfigName: You can also use
//    `client.projectNotificationConfigPath(projectId, configId)` or
//    `client.folderNotificationConfigPath(folderId, configId)`.
// configId = "your-config-id";
const formattedConfigName = client.organizationNotificationConfigPath(
  organizationId,
  configId
);

async function deleteNotificationConfg() {
  await client.deleteNotificationConfig({name: formattedConfigName});
  console.log('Notification config deleted: ', formattedConfigName);
}

deleteNotificationConfg();

PHP

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

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

Para descobertas, adicione /locations/LOCATION ao 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\DeleteNotificationConfigRequest;

/**
 * @param string $organizationId        Your org ID
 * @param string $notificationConfigId  A unique identifier
 */
function delete_notification(string $organizationId, string $notificationConfigId): void
{
    $securityCenterClient = new SecurityCenterClient();
    $notificationConfigName = $securityCenterClient::notificationConfigName(
        // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
        $organizationId,
        $notificationConfigId
    );
    $deleteNotificationConfigRequest = (new DeleteNotificationConfigRequest())
        ->setName($notificationConfigName);

    $securityCenterClient->deleteNotificationConfig($deleteNotificationConfigRequest);
    print('Notification config was deleted' . PHP_EOL);
}

Ruby

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

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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"

client = Google::Cloud::SecurityCenter.security_center

# You can also use 'project_id' or 'folder_id' as a parent.
config_path = client.notification_config_path organization:        org_id,
                                              notification_config: config_id

response = client.delete_notification_config name: config_path
puts "Deleted notification config #{config_id} with response: #{response}"

C#

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

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

Para descobertas, adicione /locations/LOCATION ao 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.Cloud.SecurityCenter.V1;
using System;

/// <summary>Snippet for DeleteNotificationConfig</summary>
public class DeleteNotificationConfigSnippets
{
    public static bool DeleteNotificationConfig(string organizationId, string notificationConfigId)
    {
        // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
        NotificationConfigName notificationConfigName = new NotificationConfigName(organizationId, notificationConfigId);
        SecurityCenterClient client = SecurityCenterClient.Create();

        client.DeleteNotificationConfig(notificationConfigName);
        Console.WriteLine($"Deleted Notification config: {notificationConfigName}");
        return true;
    }
}

Como listar NotificationConfigs

Para listar NotificationConfigs, você precisa ter um papel do IAM que inclua a permissão securitycenter.notification.list.

Todas as listas da API Security Command Center são paginadas. Cada resposta retorna uma página de resultados e um token para retornar a próxima página. O padrão pageSize é 10. Você pode configurar o tamanho da página para um mínimo de 1 e um máximo de 1.000.

Liste NotificationConfigs usando o idioma de sua escolha:

gcloud

gcloud scc notifications list PARENT_TYPE/PARENT_ID/locations/LOCATION

Substitua:

  • PARENT_TYPE com organizations, folders ou projects, dependendo do escopo em que você precisa listar notificações.
  • PARENT_ID pelo ID numérico do pai recurso.
  • LOCATION: obrigatório se os nomes de residência dos dados está ativado ou notificationConfig recursos foram criados usando o API v2.

    Se a residência de dados estiver ativada, especifique o local do Security Command Center em que as notificações são armazenadas.

    Se a residência de dados não estiver ativada, a inclusão de /locations/LOCATION no nome ou a flag --location no comando vai listar apenas os recursos notificationConfig criados usando a API Security Command Center v2, e o único local válido será global.

Python

O exemplo a seguir usa a API v1. Para modificar o exemplo para a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders ou projects.

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

def list_notification_configs(parent_id):
    """
    Args:
        parent_id: must be in one of the following formats:
            "organizations/{organization_id}"
            "projects/{project_id}"
            "folders/{folder_id}"
    """
    from google.cloud import securitycenter as securitycenter

    client = securitycenter.SecurityCenterClient()

    notification_configs_iterator = client.list_notification_configs(
        request={"parent": parent_id}
    )
    for i, config in enumerate(notification_configs_iterator):
        print(f"{i}: notification_config: {config}")

Java

O exemplo a seguir usa a API v1. Para modificar o exemplo para a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders, ou projects.

Para descobertas, adicione /locations/LOCATION ao 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.NotificationConfig;
import com.google.cloud.securitycenter.v1.SecurityCenterClient;
import com.google.cloud.securitycenter.v1.SecurityCenterClient.ListNotificationConfigsPagedResponse;
import com.google.common.collect.ImmutableList;
import java.io.IOException;

public class ListNotificationConfigSnippets {

  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");

    listNotificationConfigs(parentId);
  }

  // List notification configs present in the given parent.
  public static ImmutableList<NotificationConfig> listNotificationConfigs(String parentId)
      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()) {

      ListNotificationConfigsPagedResponse response = client.listNotificationConfigs(parentId);

      ImmutableList<NotificationConfig> notificationConfigs =
          ImmutableList.copyOf(response.iterateAll());

      System.out.printf("List notifications response: %s%n", response.getPage().getValues());
      return notificationConfigs;
    }
  }
}

Go

O exemplo a seguir usa a API v1. Para modificar o exemplo para a 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 depois de /PARENT/PARENT_ID, em que PARENT é organizations, folders, ou projects.

Para descobertas, adicione /locations/LOCATION ao 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"
	"google.golang.org/api/iterator"
)

func listNotificationConfigs(w io.Writer, orgID string) error {
	// orgId := "your-org-id"

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

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

	req := &securitycenterpb.ListNotificationConfigsRequest{
		// Parent must be in one of the following formats:
		//		"organizations/{orgId}"
		//		"projects/{projectId}"
		//		"folders/{folderId}"
		Parent: fmt.Sprintf("organizations/%s", orgID),
	}
	it := client.ListNotificationConfigs(ctx, req)
	for {
		result, err := it.Next()
		if err == iterator.Done {
			break
		}

		if err != nil {
			return fmt.Errorf("it.Next: %w", err)
		}

		fmt.Fprintln(w, "NotificationConfig: ", result)
	}

	return nil
}

Node.js

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

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

Para descobertas, adicione /locations/LOCATION ao 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}`
const parent = `organizations/${organizationId}`;

async function listNotificationConfigs() {
  const [resources] = await client.listNotificationConfigs({parent: parent});
  console.log('Received Notification configs: ');
  for (const resource of resources) {
    console.log(resource);
  }
}

listNotificationConfigs();

PHP

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

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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\ListNotificationConfigsRequest;

/**
 * @param string $organizationId        Your org ID
 */
function list_notification(string $organizationId): void
{
    $securityCenterClient = new SecurityCenterClient();
    // 'parent' must be in one of the following formats:
    //		"organizations/{orgId}"
    //		"projects/{projectId}"
    //		"folders/{folderId}"
    $parent = $securityCenterClient::organizationName($organizationId);
    $listNotificationConfigsRequest = (new ListNotificationConfigsRequest())
        ->setParent($parent);

    foreach ($securityCenterClient->listNotificationConfigs($listNotificationConfigsRequest) as $element) {
        printf('Found notification config %s' . PHP_EOL, $element->getName());
    }

    print('Notification configs were listed' . PHP_EOL);
}

Ruby

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

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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"

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

client.list_notification_configs(parent: parent).each_page do |page|
  page.each do |element|
    puts element
  end
end

C#

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

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

Para descobertas, adicione /locations/LOCATION ao nome do recurso após /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.Api.Gax;
using Google.Cloud.SecurityCenter.V1;
using System;

/// <summary>Snippet for ListNotificationConfig</summary>
public class ListNotificationConfigSnippets
{
    public static PagedEnumerable<ListNotificationConfigsResponse, NotificationConfig> ListNotificationConfigs(string organizationId)
    {
        // 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);
        SecurityCenterClient client = SecurityCenterClient.Create();
        PagedEnumerable<ListNotificationConfigsResponse, NotificationConfig> notificationConfigs = client.ListNotificationConfigs(orgName);

        // Print Notification Configuration names.
        foreach (var config in notificationConfigs)
        {
            Console.WriteLine(config.NotificationConfigName);
        }
        return notificationConfigs;
    }
}

Como receber notificações do Pub/Sub

Nesta seção, apresentamos um exemplo de mensagem de notificação e exemplos que mostram como converter uma mensagem do Pub/Sub em um NotificationMessage que contém uma descoberta.

As notificações são publicadas no Pub/Sub no formato JSON. Veja abaixo um exemplo de mensagem de notificação:

{
   "notificationConfigName": "organizations/ORGANIZATION_ID/notificationConfigs/CONFIG_ID",
   "finding": {
     "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
     "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
     "state": "ACTIVE",
     "category": "TEST-CATEGORY",
     "securityMarks": {
       "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID/securityMarks"
     },
     "eventTime": "2019-07-26T07:32:37Z",
     "createTime": "2019-07-29T18:45:27.243Z"
   }
 }

Converta uma mensagem do Pub/Sub em um NotificationMessage usando a linguagem de sua escolha:

gcloud

A CCLI gcloud não é compatível com a conversão de uma mensagem do Pub/Sub em NotificationMessage. É possível usar a CLI gcloud para receber um NotificationMessage e imprimir o JSON diretamente no terminal:

  # The subscription used to receive published messages from a topic
  PUBSUB_SUBSCRIPTION="projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID"

  gcloud pubsub subscriptions pull $PUBSUB_SUBSCRIPTION

Substitua:

  • PROJECT_ID pelo código do projeto;
  • SUBSCRIPTION_ID pelo ID da sua assinatura.

Python

# Requires https://cloud.google.com/pubsub/docs/quickstart-client-libraries#pubsub-client-libraries-python
import concurrent

from google.cloud import pubsub_v1
from google.cloud.securitycenter_v1 import NotificationMessage

# TODO: project_id = "your-project-id"
# TODO: subscription_name = "your-subscription-name"

def callback(message):
    # Print the data received for debugging purpose if needed
    print(f"Received message: {message.data}")

    notification_msg = NotificationMessage.from_json(message.data)

    print(
        "Notification config name: {}".format(
            notification_msg.notification_config_name
        )
    )
    print(f"Finding: {notification_msg.finding}")

    # Ack the message to prevent it from being pulled again
    message.ack()

subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(project_id, subscription_name)

streaming_pull_future = subscriber.subscribe(subscription_path, callback=callback)

print(f"Listening for messages on {subscription_path}...\n")
try:
    streaming_pull_future.result(timeout=1)  # Block for 1 second
except concurrent.futures.TimeoutError:
    streaming_pull_future.cancel()

Java


import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.cloud.securitycenter.v1.NotificationMessage;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class NotificationReceiver {

  private NotificationReceiver() {
  }

  public static void receiveNotificationMessages(String projectId, String subscriptionId) {
    // String projectId = "{your-project}";
    // String subscriptionId = "{your-subscription}";
    ProjectSubscriptionName subscriptionName =
        ProjectSubscriptionName.of(projectId, subscriptionId);

    try {
      Subscriber subscriber =
          Subscriber.newBuilder(subscriptionName, new NotificationMessageReceiver()).build();
      subscriber.startAsync().awaitRunning();

      // This sets the timeout value of the subscriber to 10s.
      subscriber.awaitTerminated(10_000, TimeUnit.MILLISECONDS);
    } catch (IllegalStateException | TimeoutException e) {
      System.out.println("Subscriber stopped: " + e);
    }
  }

  static class NotificationMessageReceiver implements MessageReceiver {

    @Override
    public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
      NotificationMessage.Builder notificationMessageBuilder = NotificationMessage.newBuilder();

      try {
        String jsonString = message.getData().toStringUtf8();
        JsonFormat.parser().merge(jsonString, notificationMessageBuilder);

        NotificationMessage notificationMessage = notificationMessageBuilder.build();
        System.out.println(
            String.format("Config id: %s", notificationMessage.getNotificationConfigName()));
        System.out.println(String.format("Finding: %s", notificationMessage.getFinding()));
      } catch (InvalidProtocolBufferException e) {
        System.out.println("Could not parse message: " + e);
      } finally {
        consumer.ack();
      }
    }
  }
}

Go

import (
	"bytes"
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsub"
	"cloud.google.com/go/securitycenter/apiv1/securitycenterpb"
	"github.com/golang/protobuf/jsonpb"
)

func receiveMessages(w io.Writer, projectID string, subscriptionName string) error {
	// projectID := "your-project-id"
	// subsriptionName := "your-subscription-name"

	ctx := context.Background()

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

	sub := client.Subscription(subscriptionName)
	cctx, cancel := context.WithCancel(ctx)
	err = sub.Receive(cctx, func(ctx context.Context, msg *pubsub.Message) {
		var notificationMessage = new(securitycenterpb.NotificationMessage)
		jsonpb.Unmarshal(bytes.NewReader(msg.Data), notificationMessage)

		fmt.Fprintln(w, "Got finding: ", notificationMessage.GetFinding())
		msg.Ack()
		cancel()
	})
	if err != nil {
		return fmt.Errorf("Receive: %w", err)
	}

	return nil
}

Node.js

const {PubSub} = require('@google-cloud/pubsub');
const {StringDecoder} = require('string_decoder');

// projectId = 'your-project-id'
// subscriptionId = 'your-subscription-id'

const subscriptionName =
  'projects/' + projectId + '/subscriptions/' + subscriptionId;
const pubSubClient = new PubSub();

function listenForMessages() {
  const subscription = pubSubClient.subscription(subscriptionName);

  // message.data is a buffer array of json
  // 1. Convert buffer to normal string
  // 2. Convert json to NotificationMessage object
  const messageHandler = message => {
    const jsonString = new StringDecoder('utf-8').write(message.data);
    const parsedNotificationMessage = JSON.parse(jsonString);

    console.log(parsedNotificationMessage);
    console.log(parsedNotificationMessage.finding);

    // ACK when done with message
    message.ack();
  };

  subscription.on('message', messageHandler);

  // Set timeout to 10 seconds
  setTimeout(() => {
    subscription.removeListener('message', messageHandler);
  }, 10000);
}

listenForMessages();

PHP

use Google\Cloud\PubSub\PubSubClient;

/**
 * @param string $projectId             Your Cloud Project ID
 * @param string $subscriptionId        Your subscription ID
 */
function receive_notification(string $projectId, string $subscriptionId): void
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionId);

    foreach ($subscription->pull() as $message) {
        printf('Message: %s' . PHP_EOL, $message->data());
        // Acknowledge the Pub/Sub message has been received, so it will not be pulled multiple times.
        $subscription->acknowledge($message);
    }
}

A seguir