Créer et gérer des configurations de notification

Cette page explique comment utiliser la fonctionnalité de notification de l'API Security Command Center. Consultez les exemples suivants:

  • Créer un objet NotificationConfig
  • Obtenir un objet NotificationConfig
  • Mettre à jour un objet NotificationConfig
  • Supprimer un objet NotificationConfig
  • Répertorier NotificationConfig
  • Recevoir des notifications Pub/Sub

Les clients Security Command Center Premium peuvent également configurer des exportations continues pour Pub/Sub dans le tableau de bord Security Command Center.

Avant de commencer

Pour utiliser les exemples de cette page, vous devez suivre le guide Configurer les notifications de résultats.

Pour exécuter les exemples suivants, vous avez besoin d'un rôle de gestion de l'authentification et des accès (IAM) avec les autorisations appropriées :

  • Créer NotificationConfig: éditeur de configurations de notification du centre de sécurité (roles/securitycenter.notificationConfigEditor)
  • Obtenir et répertorier NotificationConfig: lecteur de configurations de notifications du centre de sécurité (roles/securitycenter.notificationConfigViewer) ou éditeur des configurations de notifications du centre de sécurité (roles/securitycenter.notificationConfigEditor)
  • Mettre à jour et supprimer NotificationConfig: éditeur de configurations de notifications du centre de sécurité (roles/securitycenter.notificationConfigEditor)

Pour attribuer des rôles appropriés à un compte principal qui accède à un notificationConfig, vous devez disposer de l'un des rôles IAM suivants:

  • Administrateur de l'organisation (roles/resourcemanager.organizationAdmin)
  • Administrateur IAM de dossier (roles/resourcemanager.folderIamAdmin)
  • Administrateur de projet IAM (roles/resourcemanager.projectIamAdmin)

Les rôles IAM pour Security Command Center peuvent être attribués au niveau de l'organisation, d'un dossier ou d'un projet. Votre capacité à afficher, modifier, créer ou mettre à jour des résultats, des éléments et des sources de sécurité dépend du niveau d'accès qui vous est accordé. Pour en savoir plus sur les rôles Security Command Center, consultez la page Contrôle des accès.

Résidence des données et notifications

Si la résidence des données est activée pour Security Command Center, les configurations qui définissent les exportations continues vers les ressources Pub/Sub (notificationConfig) sont soumises au contrôle de la résidence des données et sont stockées dans votre emplacement Security Command Center.

Pour exporter des résultats depuis un emplacement Security Command Center vers Pub/Sub, vous devez configurer l'exportation continue dans le même emplacement que Security Command Center.

Étant donné que les filtres utilisés dans les exportations continues peuvent contenir des données soumises à des contrôles de résidence, veillez à spécifier l'emplacement approprié avant de les créer. Security Command Center ne limite pas l'emplacement dans lequel vous créez des exportations.

Les exportations continues ne sont stockées que à l'emplacement de création. Elles ne peuvent pas être affichées ni modifiées ailleurs.

Une fois que vous avez créé une exportation continue, vous ne pouvez plus modifier son emplacement. Pour modifier l'emplacement, vous devez supprimer l'exportation continue et la recréer dans le nouvel emplacement.

Pour récupérer une exportation continue à l'aide d'appels d'API, vous devez spécifier l'emplacement dans le nom complet de la ressource notificationConfig. Exemple :

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

De même, pour récupérer une exportation continue à l'aide de la gcloud CLI, vous devez spécifier l'emplacement dans le nom complet de la ressource de la configuration ou à l'aide de l'option --locations. Exemple :

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

Créer un objet NotificationConfig

Pour créer un objet NotificationConfig, vous devez avoir :

  • Un sujet Pub/Sub existant auquel vous souhaitez envoyer des notifications
  • Rôles IAM requis pour le compte principal qui crée le notificationConfig.

Pour en savoir plus, consultez l'étape Configurer un sujet Pub/Sub dans le guide Configurer les notifications de résultats.

Avant de créer une NotificationConfig, notez que chaque organisation peut avoir un nombre limité de fichiers NotificationConfig. Pour en savoir plus, consultez la page Quotas et limites.

L'objet NotificationConfig inclut un champ filter qui limite les notifications aux événements utiles. Ce champ accepte tous les filtres disponibles dans la méthode findings.list de l'API Security Command Center.

Lorsque vous créez un NotificationConfig, vous spécifiez un parent pour l'NotificationConfig à partir de la hiérarchie des ressources Google Cloud (une organisation, un dossier ou un projet). Si vous devez récupérer, mettre à jour ou supprimer le NotificationConfig ultérieurement, vous devez inclure l'ID numérique de l'organisation, du dossier ou du projet parent lorsque vous le référencez.

Pour créer la NotificationConfig à l'aide du langage ou de la plate-forme de votre choix:

gcloud

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

Remplacez les éléments suivants :

  • NOTIFICATION_NAME: nom de la notification. Doit comporter entre 1 et 128 caractères et ne contenir que des caractères alphanumériques, des traits de soulignement ou des traits d'union.
  • PARENT: champ d'application de la hiérarchie des ressources auquel la notification s'applique (organization, folder ou project).
  • PARENT_ID: ID de l'organisation, du dossier ou du projet parent, spécifié au format organizations/123, folders/456 ou projects/789.
  • LOCATION: si la résidence des données est activée, spécifiez l'emplacement Security Command Center dans lequel créer la notification. La ressource notificationConfig obtenue n'est stockée que dans cet emplacement. Seuls les résultats émis à cet emplacement sont envoyés à Pub/Sub.

    Si la résidence des données n'est pas activée, spécifier l'option --location crée la notification à l'aide de la version 2 de l'API Security Command Center. La seule valeur valide pour cette option est global.

  • NOTIFICATION_DESCRIPTION: description de la notification comportant 1 024 caractères au maximum.

  • PUBSUB_TOPIC: sujet Pub/Sub qui recevra les notifications. Son format est projects/PROJECT_ID/topics/TOPIC.

  • FILTER: l'expression que vous définissez pour sélectionner les résultats à envoyer à Pub/Sub. Exemple : state="ACTIVE".

Python

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.


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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

// 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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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#

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.


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

Les notifications sont maintenant publiées sur le thème Pub/Sub que vous avez spécifié.

Pour publier des notifications, un compte de service de la forme service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gserviceaccount.com est créé pour vous. Ce compte de service est créé lorsque vous créez votre premier NotificationConfig. Il se voit automatiquement attribuer le rôle securitycenter.notificationServiceAgent sur la stratégie IAM pour PUBSUB_TOPIC lors de la création de la configuration de notification. Ce rôle de compte de service est requis pour que les notifications fonctionnent.

Obtenir un objet NotificationConfig

Pour obtenir un objet NotificationConfig, vous devez disposer d'un rôle IAM qui inclut l'autorisation securitycenter.notification.get.

gcloud

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

Remplacez les éléments suivants :

  • PARENT_TYPE par organizations, folders ou projects, selon le niveau de la hiérarchie des ressources spécifié dans la configuration de la notification ;
  • PARENT_ID par l'ID numérique de la ressource parente.
  • LOCATION: obligatoire si la résidence des données est activée ou si les ressources notificationConfig ont été créées à l'aide de l'API v2.

    Si la résidence des données est activée, spécifiez l'emplacement Security Command Center dans lequel les notifications sont stockées.

    Si la résidence des données n'est pas activée, n'incluez /locations/LOCATION que si la ressource notificationConfig a été créée à l'aide de l'API Security Command Center v2. Dans ce cas, le seul emplacement valide est global.

  • NOTIFICATION_NAME: nom de la notification.

Python

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.


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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

// 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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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#

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.


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

Mettre à jour un objet

Pour mettre à jour un objet NotificationConfig, vous devez disposer d'un rôle IAM qui inclut l'autorisation securitycenter.notification.update.

Lorsque vous effectuez une mise à jour à l'aide d'un masque de champ, seuls les champs que vous spécifiez sont mis à jour. Si vous n'utilisez pas de masque de champ, tous les champs modifiables de l'objet NotificationConfig sont remplacés par les nouvelles valeurs. Vous pouvez mettre à jour le sujet et la description Pub/Sub à l'aide d'un masque de champ.

Pour suivre cet exemple, vous devez être abonné au nouveau sujet et votre compte de service de notifications doit disposer de l'autorisation pubsub.topics.setIamPolicy sur le sujet.

Après avoir accordé les autorisations nécessaires, mettez à jour la description NotificationConfig, le sujet Pub/Sub et le filtre dans le langage de votre choix:

gcloud

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

Remplacez les éléments suivants :

  • PARENT_TYPE par organizations, folders ou projects, selon le niveau de la hiérarchie des ressources spécifié dans la configuration de la notification ;
  • PARENT_ID par l'ID numérique de la ressource parente.
  • LOCATION: obligatoire si la résidence des données est activée ou si le notificationConfig a été créé à l'aide de l'API v2.

    Si la résidence des données est activée, spécifiez l'emplacement Security Command Center dans lequel la notification est stockée.

    Si la résidence des données n'est pas activée, incluez /locations/LOCATION dans le nom complet ou ne spécifiez l'option --location que si la ressource notificationConfig a été créée à l'aide de l'API Security Command Center v2. Dans ce cas, le seul emplacement valide est global.

  • NOTIFICATION_NAME: nom de la notification.

  • NOTIFICATION_DESCRIPTION: description de la notification comportant 1 024 caractères au maximum.

  • PUBSUB_TOPIC: sujet Pub/Sub qui recevra les notifications. Son format est projects/PROJECT_ID/topics/TOPIC.

  • FILTER: l'expression que vous définissez pour sélectionner les résultats à envoyer à Pub/Sub. Exemple : state="ACTIVE".

Python

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.


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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

// 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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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#

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.


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

Supprimer un objet NotificationConfig

Pour supprimer un objet NotificationConfig, vous devez disposer d'un rôle IAM qui inclut l'autorisation securitycenter.notification.delete.

Lorsque vous supprimez un objet NotificationConfig, le rôle securitycenter.notificationServiceAgent reste dans le sujet Pub/Sub. Si vous n'utilisez pas le thème Pub/Sub dans un autre objet NotificationConfig, supprimez le rôle du thème. Pour plus d'informations, consultez la section Contrôle des accès.

Supprimez un objet NotificationConfig en utilisant la langue de votre choix :

gcloud

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

Remplacez les éléments suivants :

  • PARENT_TYPE par organizations, folders ou projects, selon le niveau de la hiérarchie des ressources spécifié dans la configuration de la notification ;
  • PARENT_ID par l'ID numérique de la ressource parente.
  • LOCATION: obligatoire si la résidence des données est activée ou si le notificationConfig a été créé à l'aide de l'API v2.

    Si la résidence des données est activée, spécifiez l'emplacement Security Command Center dans lequel la notification est stockée.

    Si la résidence des données n'est pas activée, incluez /locations/LOCATION dans le nom complet ou ne spécifiez l'option --location que si notificationConfig a été créé à l'aide de l'API Security Command Center v2, auquel cas, le seul emplacement valide est global.

  • NOTIFICATION_NAME: nom de la notification.

Python

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.


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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

// 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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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#

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.


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

Répertorier les objets NotificationConfig

Pour répertorier des objets NotificationConfigs, vous devez disposer d'un rôle IAM incluant l'autorisation securitycenter.notification.list.

Toutes les listes de l'API Security Command Center sont paginées. Chaque réponse renvoie une page de résultats et un jeton pour renvoyer la page suivante. La valeur pageSize par défaut est 10. Vous pouvez configurer la taille des pages sur un minimum de 1, et un maximum de 1 000.

Répertoriez les objets NotificationConfigs dans la langue de votre choix :

gcloud

gcloud scc notifications list PARENT_TYPE/PARENT_ID/locations/LOCATION

Remplacez les éléments suivants :

  • PARENT_TYPE par organizations, folders ou projects, selon le champ d'application auquel vous devez répertorier les notifications.
  • PARENT_ID par l'ID numérique de la ressource parente.
  • LOCATION: obligatoire si la résidence des données est activée ou si les ressources notificationConfig ont été créées à l'aide de l'API v2.

    Si la résidence des données est activée, spécifiez l'emplacement Security Command Center dans lequel les notifications sont stockées.

    Si la résidence des données n'est pas activée, inclure /locations/LOCATION dans le nom ou l'option --location dans la commande ne répertorie que les ressources notificationConfig créées à l'aide de l'API Security Command Center v2 et le seul emplacement valide est global.

Python

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.


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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

// 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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.

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#

L'exemple suivant utilise l'API v1. Pour modifier l'exemple pour la v2, remplacez v1 par v2 et ajoutez /locations/LOCATION au nom de la ressource.

Pour la plupart des ressources, ajoutez /locations/LOCATION au nom de la ressource après /PARENT/PARENT_ID, où PARENT est organizations, folders ou projects.

Pour les résultats, ajoutez /locations/LOCATION au nom de la ressource après /sources/SOURCE_ID, où SOURCE_ID est l'ID du service Security Command Center qui a émis le résultat.


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

Recevoir des notifications Pub/Sub

Cette section fournit un exemple de message de notification et des exemples qui montrent comment convertir un message Pub/Sub en un message NotificationMessage contenant un résultat.

Les notifications sont publiées dans Pub/Sub au format JSON. Voici un exemple de message de notification :

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

Convertissez un message Pub/Sub en un message NotificationMessage dans la langue de votre choix :

gcloud

gcloud CLI ne permet pas de convertir un message Pub/Sub en un message NotificationMessage. Vous pouvez utiliser gcloud CLI pour obtenir un NotificationMessage et imprimer le JSON directement dans votre 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

Remplacez les éléments suivants :

  • PROJECT_ID par votre ID de projet
  • SUBSCRIPTION_ID par votre ID d'abonnement

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

Étapes suivantes