Attivare le notifiche sui risultati per Pub/Sub

Questa pagina spiega come attivare le notifiche dell'API Security Command Center.

Le notifiche inviano risultati e aggiornamenti dei risultati a un argomento Pub/Sub in pochi minuti. Le notifiche dell'API Security Command Center includono tutte le informazioni sui risultati visualizzate da Security Command Center nella console Google Cloud.

Puoi collegare le notifiche di Security Command Center in Pub/Sub direttamente alle azioni delle funzioni Cloud Run. Per esempi di funzioni che possono essere utili per la risposta, l'arricchimento e la correzione, consulta il repository open source di codice delle funzioni Cloud Run di Security Command Center. Il repository contiene soluzioni che ti aiutano a eseguire azioni automatiche sui risultati di sicurezza.

In alternativa, puoi esportare i risultati in BigQuery o configurare le esportazioni continue per Pub/Sub nella console Google Cloud.

Prima di iniziare

  1. Per ottenere le autorizzazioni necessarie per impostare e configurare le notifiche dell'API Security Command Center, chiedi all'amministratore di concederti i seguenti ruoli IAM:

    Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

  2. Enable the Security Command Center API:

    gcloud services enable securitycenter.googleapis.com

Residenza dei dati e notifiche

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

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

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

Le esportazioni continue vengono archiviate solo nella posizione in cui vengono create e non possono essere visualizzate o modificate in altre posizioni.

Una volta creata un'esportazione continua, non puoi modificarne la posizione. Per modificare la posizione, devi eliminare l'esportazione continua e ricrearla nella nuova posizione.

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

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

Analogamente, per recuperare un'esportazione continua utilizzando l'interfaccia a riga di comando gcloud, devi specificare la posizione utilizzando il flag --location. Ad esempio:

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

Configura un argomento Pub/Sub

In questa attività, crei e ti abboni all'argomento Pub/Sub a cui vuoi inviare le notifiche.

Passaggio 1: configura Pub/Sub

Per configurare e iscriverti a un argomento Pub/Sub, segui questi passaggi:

  1. Vai alla console Google Cloud.

    Vai alla console Google Cloud

  2. Seleziona il progetto in cui hai attivato l'API Security Command Center.

  3. Fai clic su Attiva Cloud Shell.

  4. (Facoltativo) Per creare un nuovo argomento Pub/Sub, esegui il seguente comando:

    gcloud pubsub topics create TOPIC_ID
    

    Sostituisci TOPIC_ID con il nome di un argomento.

  5. Crea una sottoscrizione per l'argomento:

    gcloud pubsub subscriptions create SUBSCRIPTION_ID --topic=TOPIC_ID
    

    Sostituisci quanto segue:

    • SUBSCRIPTION_ID: l'ID abbonamento
    • TOPIC_ID: l'ID argomento

Per scoprire di più sulla configurazione di Pub/Sub, consulta Gestire argomenti e iscrizioni.

Passaggio 2: concedi il ruolo all'argomento Pub/Sub

Per creare un NotificationConfig, devi disporre del ruolo Amministratore Pub/Sub (roles/pubsub.admin) per l'argomento Pub/Sub per cui hai creato una sottoscrizione.

Per concedere questo ruolo:

  1. Vai alla console Google Cloud.

    Vai alla console Google Cloud

  2. Seleziona il progetto per cui hai attivato l'API Security Command Center.

  3. Fai clic su Attiva Cloud Shell.

  4. Concedi il ruolo richiesto al tuo Account Google nell'argomento Pub/Sub:

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

    Sostituisci quanto segue:

    • PUBSUB_PROJECT: il progetto Google Cloud che contiene lo tuo argomento Pub/Sub
    • TOPIC_ID: l'ID argomento
    • GOOGLE_ACCOUNT: l'indirizzo email del tuo Account Google

Crea un oggetto NotificationConfig

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 agli eventi utili. Questo campo accetta tutti i filtri disponibili nel metodo findings.list dell'API Security Command Center.

Quando crei un NotificationConfig, specifichi un elemento principale per il NotificationConfig dalla gerarchia delle risorse Google Cloud, ovvero un'organizzazione, una cartella o un progetto. Se in un secondo momento dovrai recuperare, aggiornare o eliminareNotificationConfig, dovrai includere l'ID numerico dell'organizzazione, della cartella o del progetto principale quando fai riferimento a NotificationConfig.

Nella console Google Cloud, alcune risorse NotificationConfig potrebbero avere l'etichetta Legacy, che indica che sono state create con l'API Security Command Center v1. Puoi gestire queste risorseNotificationConfig con la console Google Cloud, l'gcloud CLI, l'API Security Command Center v1 o le librerie client v1 per Security Command Center.

Per gestire queste risorse NotificationConfig con gcloud CLI, non devi specificare una posizione quando esegui il comando gcloud CLI.

Per creare il NotificationConfig utilizzando la lingua o la piattaforma di tua scelta:

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 essere compreso tra 1 e 128 caratteri e deve contenere solo caratteri alfanumerici, trattini bassi o trattini.
  • PARENT: l'ambito nella 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, la località di Security Command Center in cui eseguire l'operazione; se la residenza dei dati non è abilitata, utilizza il valore global.
  • NOTIFICATION_DESCRIPTION: una descrizione della notifica di massimo 1024 caratteri.
  • PUBSUB_TOPIC: l'argomento Pub/Sub che riceverà le notifiche. Il formato è projects/PROJECT_ID/topics/TOPIC.
  • FILTER: l'espressione che definisci per selezionare i risultati da inviare a Pub/Sub. Ad esempio, state=\"ACTIVE\".

Vai

import (
	"context"
	"fmt"
	"io"

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

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

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

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

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

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

	return nil
}

Java


package vtwo.notifications;

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

public class CreateNotification {

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

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

  // Crete a notification config.
  // Ensure the ServiceAccount has the "pubsub.topics.setIamPolicy" permission on the new topic.
  public static NotificationConfig createNotificationConfig(
      String parentId, String location, String topicName, String notificationConfigId)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (SecurityCenterClient client = SecurityCenterClient.create()) {

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

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

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

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

Node.js

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

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

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

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

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

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

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

await createNotificationConfig();

Python

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


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

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

Le notifiche vengono ora pubblicate nell'argomento Pub/Sub specificato.

Per pubblicare le notifiche, viene creato 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 al quale viene concesso automaticamente il ruolo securitycenter.notificationServiceAgent nel criterio IAM per PUBSUB_TOPIC durante la creazione della configurazione di notifica. Questo ruolo dell'account di servizio è necessario per il funzionamento delle notifiche.

Concedi l'accesso al perimetro in Controlli di servizio VPC

Se utilizzi Controlli di servizio VPC e il tuo argomento Pub/Sub fa parte di un progetto all'interno di un perimetro di servizio, devi concedere l'accesso ai progetti per creare notifiche.

Per concedere l'accesso ai progetti, crea regole di ingresso e uscita per i principali e i progetti utilizzati per creare notifiche. Le regole consentono di accedere alle risorse protette e consentono a Pub/Sub di verificare che gli utenti dispongano dell'autorizzazione setIamPolicy per l'argomento Pub/Sub.

Prima di creare un oggetto NotificationConfig

Prima di completare i passaggi descritti in Creazione di una NotificationConfig, svolgi i seguenti passaggi:

  1. Vai alla pagina Controlli di servizio VPC nella console Google Cloud.

    Vai a Controlli di servizio VPC

  2. Se necessario, seleziona la tua organizzazione.

  3. Fai clic sul nome del perimetro di servizio da modificare.

    Per trovare il perimetro di servizio da modificare, puoi controllare i log per verificare se sono presenti voci che mostrano violazioni RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER. In queste voci, controlla il campo servicePerimeterName: accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME.

  4. Fai clic su Modifica perimetro.

  5. Nel menu di navigazione, fai clic su Criterio in entrata.

  6. Per configurare le regole di ingresso per gli utenti o gli account servizio, utilizza i seguenti parametri:

    • Attributi FROM del client API:
      • Nel menu a discesa Origine, seleziona Tutte le origini.
      • Nel menu a discesa Identità, scegli Identità selezionate.
      • Fai clic su Seleziona, quindi inserisci il principale utilizzato per chiamare l'API Security Command Center.
    • Attributi TO di servizi/risorse Google Cloud:
      • Nel menu a discesa Progetto, scegli Progetti selezionati.
      • Fai clic su Seleziona e poi inserisci il progetto che contiene l'argomento Pub/Sub.
      • Nel menu a discesa Servizi, scegli Servizi selezionati e poi API Cloud Pub/Sub.
      • Nel menu a discesa Metodi, scegli Tutte le azioni.
  7. Fai clic su Salva.

  8. Nel menu di navigazione, fai clic su Regola di uscita.

  9. Fai clic su Aggiungi regola.

  10. Per configurare le regole di uscita per gli account utente o di servizio, inserisci i seguenti parametri:

    • Attributi FROM del client API:
      • Nel menu a discesa Identità, scegli Identità selezionate.
      • Fai clic su Seleziona, quindi inserisci il principale utilizzato per chiamare l'API Security Command Center.
    • Attributi TO di servizi/risorse Google Cloud:
      • Nel menu a discesa Progetto, scegli Tutti i progetti.
      • Nel menu a discesa Servizi, scegli Servizi selezionati, quindi seleziona API Cloud Pub/Sub.
      • Nel menu a discesa Metodi, scegli Tutte le azioni.
  11. Fai clic su Salva.

Crea una regola di ingresso per NotificationConfig

Per creare una regola di ingresso per un NotificationConfig:

  1. Completa le istruzioni riportate in Creare un oggetto NotificationConfig.
  2. Riapri il perimetro di servizio della sezione precedente.
  3. Fai clic su Criterio in entrata.
  4. Fai clic su Aggiungi regola.
  5. Per configurare la regola di ingresso per l'account di servizio NotificationConfig che hai creato, inserisci i seguenti parametri:
    • Attributi FROM del client API:
      • Nel menu a discesa Origine, seleziona Tutte le origini.
      • Nel menu a discesa Identità, scegli Identità selezionate.
      • Fai clic su Seleziona, quindi inserisci il nome dell'NotificationConfig account di servizio: service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gserviceaccount.com
    • Attributi TO di servizi/risorse Google Cloud:
      • Nel menu a discesa Progetto, scegli Progetti selezionati.
      • Fai clic su Seleziona e poi seleziona il progetto che contiene l'argomento Pub/Sub.
      • Nel menu a discesa Servizi, scegli Servizi selezionati e poi seleziona API Cloud Pub/Sub.
      • Nel menu a discesa Metodi, scegli Tutte le azioni.
  6. Nel menu di navigazione, fai clic su Salva.

Gli account di progetti, utenti e servizi selezionati ora possono accedere alle risorse protette e creare notifiche.

Se hai seguito tutti i passaggi descritti in questa guida e le notifiche funzionano correttamente, ora puoi eliminare quanto segue:

  • La regola in entrata per l'entità
  • La regola in uscita per l'entità

Queste regole erano necessarie solo per configurare NotificationConfig. Tuttavia, per continuare a utilizzare le notifiche, devi mantenere la regola di ingresso per il NotificationConfig, che consente di pubblicare notifiche nel tuo argomento Pub/Sub dietro il perimetro di servizio.

Passaggi successivi