Creazione e gestione di oggetti NotificationConfig

Questa pagina descrive come utilizzare la funzionalità di notifica dell'API Security Command Center, inclusi i seguenti esempi:

  • Crea un NotificationConfig
  • Ricevi un NotificationConfig
  • Aggiorna un NotificationConfig
  • Elimina un NotificationConfig
  • Elenco NotificationConfig
  • Ricevi notifiche Pub/Sub

In alternativa, i clienti di Security Command Center Premium possono configurare le esportazioni continue per Pub/Sub nella dashboard di Security Command Center.

Prima di iniziare

Per utilizzare gli esempi in questa pagina, devi completare la guida alla configurazione delle notifiche sui risultati.

Per eseguire gli esempi seguenti, devi avere un ruolo Identity and Access Management (IAM) con le autorizzazioni appropriate:

  • Crea NotificationConfig: editor delle configurazioni delle notifiche del Centro sicurezza (roles/securitycenter.notificationConfigEditor)
  • Recupera ed elenca NotificationConfig: Visualizzatore configurazioni di notifiche Centro sicurezza (roles/securitycenter.notificationConfigViewer) o Editor configurazioni notifiche Centro sicurezza (roles/securitycenter.notificationConfigEditor)
  • Aggiorna ed elimina NotificationConfig: editor delle configurazioni di notifica del Centro sicurezza (roles/securitycenter.notificationConfigEditor)

Per concedere i ruoli appropriati a un'entità che accede a un notificationConfig, devi avere uno dei seguenti ruoli IAM:

  • Amministratore organizzazione (roles/resourcemanager.organizationAdmin)
  • Amministratore IAM cartella (roles/resourcemanager.folderIamAdmin)
  • Amministratore IAM progetto (roles/resourcemanager.projectIamAdmin)

I ruoli IAM per Security Command Center possono essere concessi a livello di organizzazione, cartella o progetto. La possibilità di visualizzare, modificare, creare o aggiornare risultati, asset e origini di sicurezza dipende dal livello per cui ti viene concesso l'accesso. Per saperne di più sui ruoli di Security Command Center, consulta Controllo dell'accesso.

Localizzazione dei dati e notifiche

Se per Security Command Center è abilitata la località dei dati, le configurazioni che definiscono le esportazioni continue nelle risorse Pub/Sub (notificationConfig) sono soggette al controllo della residenza dei dati e vengono archiviate nella località di Security Command Center.

Per esportare i risultati in una località di Security Command Center in Pub/Sub, devi configurare l'esportazione continua nella stessa località di Security Command Center dei risultati.

Poiché i filtri utilizzati nelle esportazioni continue possono contenere dati soggetti a controlli di residenza, assicurati di specificare la posizione corretta prima di crearli. Security Command Center non limita la località in cui vengono create le esportazioni.

Le esportazioni continue vengono archiviate solo nella località in cui sono state create e non possono essere visualizzate o modificate in altre località.

Dopo aver creato un'esportazione continua, non puoi modificarne la località. Per cambiare la località, devi eliminare l'esportazione continua e ricrearla nella nuova posizione.

Per recuperare un'esportazione continua utilizzando le chiamate API, devi specificare la località nel nome completo della risorsa di notificationConfig. Ad esempio:

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

Analogamente, per recuperare un'esportazione continua utilizzando gcloud CLI, devi specificare la località nel nome completo della risorsa della configurazione o utilizzando il flag --locations. Ad esempio:

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

Creazione di un NotificationConfig

Per creare un NotificationConfig, devi avere:

  • Un argomento Pub/Sub esistente a cui vuoi inviare notifiche.
  • Ruoli IAM obbligatori per l'entità che crea notificationConfig.

Per ulteriori informazioni, consulta il passaggio Configurare un argomento Pub/Sub nella guida Configurare le notifiche sui risultati.

Prima di creare un NotificationConfig, tieni presente che ogni organizzazione può avere un numero limitato di file NotificationConfig. Per ulteriori informazioni, consulta Quote e limiti.

NotificationConfig include un campo filter che limita le notifiche a eventi utili. Questo campo accetta tutti i filtri disponibili nel metodo findings.list dell'API Security Command Center.

Quando crei un elemento NotificationConfig, specifichi un elemento padre per l'elemento NotificationConfig dalla gerarchia delle risorse di Google Cloud: un'organizzazione, una cartella o un progetto. Se devi recuperare, aggiornare o eliminare NotificationConfig in un secondo momento, devi includere l'ID numerico dell'organizzazione, della cartella o del progetto principale quando lo fai riferimento.

Per creare NotificationConfig utilizzando la lingua o la piattaforma che preferisci:

gcloud

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

Sostituisci quanto segue:

  • NOTIFICATION_NAME: il nome della notifica. Deve avere una lunghezza compresa tra 1 e 128 caratteri e contenere solo caratteri alfanumerici, trattini bassi o trattini.
  • PARENT: l'ambito della gerarchia delle risorse a cui si applica la notifica, organization, folder o project.
  • PARENT_ID: l'ID dell'organizzazione, della cartella o del progetto principale specificato nel formato organizations/123, folders/456 o projects/789.
  • LOCATION: se la residenza dei dati è abilitata, specifica la località di Security Command Center in cui creare la notifica. La risorsa notificationConfig risultante viene archiviata solo in questa località. Solo i risultati emessi in questa posizione vengono inviati a Pub/Sub.

    Se la residenza dei dati non è abilitata, se specifichi il flag --location viene creata la notifica utilizzando l'API Security Command Center v2. L'unico valore valido per il flag è global.

  • NOTIFICATION_DESCRIPTION: una descrizione della notifica che non superi i 1024 caratteri.

  • PUBSUB_TOPIC: l'argomento Pub/Sub che riceverà le notifiche. Il suo formato è projects/PROJECT_ID/topics/TOPIC.

  • FILTER: l'espressione definita per selezionare i risultati che vengono inviati a Pub/Sub. Ad esempio, state="ACTIVE".

Python

L'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.


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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

// 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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.


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

Ora le notifiche sono pubblicate nell'argomento Pub/Sub specificato.

Per pubblicare le notifiche, viene creato per te un account di servizio sotto forma di service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gserviceaccount.com. Questo account di servizio viene creato quando crei il tuo primo NotificationConfig e ti viene concesso automaticamente il ruolo securitycenter.notificationServiceAgent nel criterio IAM per PUBSUB_TOPIC durante la creazione della configurazione delle notifiche. Questo ruolo dell'account di servizio è necessario per il funzionamento delle notifiche.

Recupero di NotificationConfig

Per ottenere un NotificationConfig, devi avere un ruolo IAM che includa l'autorizzazione securitycenter.notification.get.

gcloud

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

Sostituisci quanto segue:

  • PARENT_TYPE con organizations, folders o projects, a seconda del livello della gerarchia delle risorse specificato nella configurazione della notifica.
  • PARENT_ID con l'ID numerico della risorsa padre.
  • LOCATION: obbligatorio se è abilitata la residenza dei dati o se le risorse notificationConfig sono state create utilizzando l'API v2.

    Se la residenza dei dati è abilitata, specifica la località di Security Command Center in cui sono archiviate le notifiche.

    Se la residenza dei dati non è abilitata, includi /locations/LOCATION solo se la risorsa notificationConfig è stata creata utilizzando l'API Security Command Center v2; in tal caso, l'unica località valida è global.

  • NOTIFICATION_NAME: il nome della notifica.

Python

L'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.


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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

// 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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.


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

Aggiornamento di un NotificationConfig

Per aggiornare un NotificationConfig, devi avere un ruolo IAM che includa l'autorizzazione securitycenter.notification.update.

Quando esegui l'aggiornamento utilizzando una maschera di campo, vengono aggiornati solo i campi specificati. Se non utilizzi una maschera di campo, tutti i campi modificabili in NotificationConfig vengono sostituiti dai nuovi valori. Con una maschera di campo, puoi aggiornare l'argomento e la descrizione di Pub/Sub.

Per completare questo esempio, devi avere effettuato la sottoscrizione al nuovo argomento e il tuo account di servizio di notifica deve disporre dell'autorizzazione pubsub.topics.setIamPolicy per l'argomento.

Dopo aver concesso le autorizzazioni necessarie, aggiorna la descrizione NotificationConfig, l'argomento Pub/Sub e il filtro utilizzando la lingua che preferisci:

gcloud

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

Sostituisci quanto segue:

  • PARENT_TYPE con organizations, folders o projects, a seconda del livello della gerarchia delle risorse specificato nella configurazione della notifica.
  • PARENT_ID con l'ID numerico della risorsa padre.
  • LOCATION: obbligatorio se la residenza dei dati è abilitata o se notificationConfig è stato creato utilizzando l'API v2.

    Se la residenza dei dati è abilitata, specifica la località di Security Command Center in cui è archiviata la notifica.

    Se la residenza dei dati non è abilitata, includi /locations/LOCATION nel nome completo o specifica il flag --location solo se la risorsa notificationConfig è stata creata utilizzando l'API Security Command Center v2. In questo caso, l'unica località valida è global.

  • NOTIFICATION_NAME: il nome della notifica.

  • NOTIFICATION_DESCRIPTION: una descrizione della notifica che non superi i 1024 caratteri.

  • PUBSUB_TOPIC: l'argomento Pub/Sub che riceverà le notifiche. Il suo formato è projects/PROJECT_ID/topics/TOPIC.

  • FILTER: l'espressione definita per selezionare i risultati che vengono inviati a Pub/Sub. Ad esempio, state="ACTIVE".

Python

L'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.


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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

// 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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.


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

Eliminazione di NotificationConfig

Per eliminare un NotificationConfig, devi avere un ruolo IAM che includa l'autorizzazione securitycenter.notification.delete.

Quando elimini un elemento NotificationConfig, il ruolo securitycenter.notificationServiceAgent rimane nell'argomento Pub/Sub. Se non utilizzi l'argomento Pub/Sub in nessun altro NotificationConfig, rimuovi il ruolo dall'argomento. Per ulteriori informazioni, consulta la sezione Controllo dell'accesso.

Elimina un NotificationConfig utilizzando la lingua che preferisci:

gcloud

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

Sostituisci quanto segue:

  • PARENT_TYPE con organizations, folders o projects, a seconda del livello della gerarchia delle risorse specificato nella configurazione della notifica.
  • PARENT_ID con l'ID numerico della risorsa padre.
  • LOCATION: obbligatorio se la residenza dei dati è abilitata o se notificationConfig è stato creato utilizzando l'API v2.

    Se la residenza dei dati è abilitata, specifica la località di Security Command Center in cui è archiviata la notifica.

    Se la residenza dei dati non è abilitata, includi /locations/LOCATION nel nome completo o specifica il flag --location solo se notificationConfig è stato creato utilizzando l'API Security Command Center v2. In questo caso, l'unica località valida è global.

  • NOTIFICATION_NAME: il nome della notifica.

Python

L'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.


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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

// 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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.


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

Elenco NotificationConfig

Per elencare NotificationConfigs, devi avere un ruolo IAM che includa l'autorizzazione securitycenter.notification.list.

Tutti gli elenchi delle API Security Command Center sono impaginati. Ogni risposta restituisce una pagina di risultati e un token per restituire la pagina successiva. Il valore predefinito di pageSize è 10. Puoi configurare le dimensioni della pagina impostandole su un minimo di 1 e un massimo di 1000.

Elenca NotificationConfigs utilizzando la lingua che preferisci:

gcloud

gcloud scc notifications list PARENT_TYPE/PARENT_ID/locations/LOCATION

Sostituisci quanto segue:

  • PARENT_TYPE con organizations, folders o projects, a seconda dell'ambito in cui devi elencare le notifiche.
  • PARENT_ID con l'ID numerico della risorsa padre.
  • LOCATION: obbligatorio se è abilitata la residenza dei dati o se le risorse notificationConfig sono state create utilizzando l'API v2.

    Se la residenza dei dati è abilitata, specifica la località di Security Command Center in cui sono archiviate le notifiche.

    Se la residenza dei dati non è abilitata, se includi /locations/LOCATION nel nome o il flag --location nel comando elenca solo le risorse notificationConfig create utilizzando l'API Security Command Center v2 e l'unica località valida è global.

Python

L'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.


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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

// 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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.

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'esempio seguente utilizza l'API v1. Per modificare l'esempio per la versione v2, sostituisci v1 con v2 e aggiungi /locations/LOCATION al nome della risorsa.

Per la maggior parte delle risorse, aggiungi /locations/LOCATION al nome della risorsa dopo /PARENT/PARENT_ID, dove PARENT è organizations, folders o projects.

Per i risultati, aggiungi /locations/LOCATION al nome della risorsa dopo /sources/SOURCE_ID, dove SOURCE_ID è l'ID del servizio Security Command Center che ha inviato il risultato.


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

Ricezione di notifiche Pub/Sub

Questa sezione fornisce un esempio di messaggio di notifica ed esempi che mostrano come convertire un messaggio Pub/Sub in un NotificationMessage che contiene un risultato.

Le notifiche vengono pubblicate in Pub/Sub nel formato JSON. Di seguito è riportato un esempio di messaggio di notifica:

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

Converti un messaggio Pub/Sub in un NotificationMessage utilizzando la lingua che preferisci:

gcloud

L'interfaccia a riga di comando gcloud non supporta la conversione di un messaggio Pub/Sub in NotificationMessage. Puoi utilizzare gcloud CLI per ottenere un NotificationMessage e stampare JSON direttamente nel tuo terminale:

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

  gcloud pubsub subscriptions pull $PUBSUB_SUBSCRIPTION

Sostituisci quanto segue:

  • PROJECT_ID con il tuo ID progetto.
  • SUBSCRIPTION_ID con il tuo ID abbonamento.

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

Passaggi successivi