Activer les notifications de résultats pour Pub/Sub

Cette page explique comment activer les notifications de l'API Security Command Center.

Les notifications envoient des résultats et des mises à jour de résultats à un sujet Pub/Sub en quelques minutes. Les notifications de l'API Security Command Center incluent toutes les informations de résultat affichées par Security Command Center dans la console Google Cloud.

Vous pouvez directement associer des notifications Security Command Center dans Pub/Sub aux actions Cloud Functions. Pour obtenir des exemples de fonctions capables de réponse, d'enrichissement et de résolution, consultez le dépôt Open Source Security Command Center contenant le code Cloud Functions. Le dépôt contient des solutions permettant d'effectuer des actions automatisées sur les résultats de sécurité.

Vous pouvez également exporter les résultats vers BigQuery ou configurer des exportations continues pour Pub/Sub dans la console Google Cloud.

Avant de commencer

Pour configurer des notifications, vous devez disposer des rôles IAM (Identity and Access Management) suivants :

  • Administrateur du centre de sécurité (roles/securitycenter.Admin) pour activer les notifications de l'API Security Command Center
  • Lecteur administrateur du centre de sécurité (roles/securitycenter.adminViewer): permet d'accéder à Security Command Center dans la console Google Cloud.
  • Pour attribuer des rôles au compte de service de notifications ou à gcloud CLI au niveau de l'organisation, d'un dossier ou d'un projet, utilisez l'un des rôles suivants :
    • Administrateur de l'organisation (roles/resourcemanager.organizationAdmin)
    • Administrateur IAM de dossier (roles/resourcemanager.folderIamAdmin)
    • Administrateur de projet IAM (roles/resourcemanager.projectIamAdmin)

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

Configurer les notifications de l'API Security Command Center

Pour configurer les notifications, commencez par activer l'API Security Command Center.

Activer l'API Security Command Center

Pour activer l'API Security Command Center, procédez comme suit :

  1. Accédez à la page "Bibliothèque d'API" de la console Google Cloud.

    Accéder à la bibliothèque d'API

  2. Sélectionnez le projet pour lequel vous souhaitez activer l'API de notifications.

  3. Dans le champ de recherche, saisissez Security Command Center, puis cliquez sur Security Command Center dans les résultats de recherche.

  4. Dans la page de l'API qui s'affiche, cliquez sur Activer.

L'API Security Command Center est désormais activée pour votre projet. Utilisez ensuite gcloud CLI ou les bibliothèques clientes pour vous abonner à un sujet Pub/Sub et configurer les autorisations.

Résidence des données et notifications

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

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

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

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

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

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

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

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

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

Configurer un sujet Pub/Sub

Lors de cette étape, vous allez créer et vous abonner au sujet Pub/Sub auquel vous souhaitez envoyer des notifications. Si vous n'avez pas besoin d'appeler l'API par programmation, les commandes de gcloud CLI sont recommandées.

gcloud

Pour configurer la fonctionnalité de notifications de l'API Security Command Center à l'aide de gcloud CLI, procédez comme suit :

  1. Configurez un sujet et un abonnement Pub/Sub.
  2. Configurez les autorisations du compte de gcloud CLI.

Étape 1 : Configurer Pub/Sub

Pour configurer un sujet Pub/Sub et vous y abonner, procédez comme suit :

  1. Accédez à Google Cloud Console.

    Accédez à la console Google Cloud.

  2. Sélectionnez le projet pour lequel vous avez activé l'API Security Command Center.

  3. Cliquez sur Activer Cloud Shell.

  4. Pour créer un sujet Pub/Sub ou utiliser un sujet existant, exécutez la commande suivante :

      gcloud pubsub topics create TOPIC_ID
    

    Remplacez TOPIC_ID par le nom de votre sujet.

  5. Définissez la variable d'environnement correspondant à l'ID du sujet :

      export TOPIC_ID=TOPIC_ID
    
  6. Créez un abonnement associé au sujet :

      gcloud pubsub subscriptions create SUBSCRIPTION_ID --topic TOPIC_ID
    

    Remplacez SUBSCRIPTION_ID par le nom de votre abonnement.

Pour en savoir plus sur la configuration de Pub/Sub, consultez la page Gérer les sujets et les abonnements.

Vous devez ensuite définir des autorisations pour votre compte.

Étape 2 : Configurer les autorisations du compte de la CLI gcloud

Pour créer un NotificationConfig, vous devez attribuer les rôles suivants à votre compte de gcloud CLI:

  • Administrateur du centre de sécurité (roles/securitycenter.admin) ou Éditeur des configurations de notification du centre de sécurité (roles/securitycenter.notificationConfigEditor). Ce rôle doit être attribué au même niveau (organisation, dossier ou projet) que celui où vous créez le NotificationConfig.
  • Administrateur Pub/Sub (roles/pubsub.admin) sur le sujet Pub/Sub qui reçoit les notifications

au niveau de l'organisation, d'un dossier ou d'un projet

Pour accorder ces autorisations, procédez comme suit :

  1. Accédez à Google Cloud Console.

    Accédez à la console Google Cloud.

  2. Sélectionnez le projet pour lequel vous avez activé l'API Security Command Center.

  3. Cliquez sur Activer Cloud Shell

    1. Définissez le nom de votre organisation :

      export ORGANIZATION_ID=ORGANIZATION_ID
      

      Remplacez ORGANIZATION_ID par l'ID de votre organisation.

    2. Définissez l'ID du projet auquel appartient le sujet Pub/Sub :

      export PUBSUB_PROJECT=PROJECT_ID
      

      en remplaçant PROJECT_ID par l'ID de votre projet :

    3. Définissez le compte de gcloud CLI que vous utilisez :

      export GCLOUD_ACCOUNT=EMAIL
      

      Remplacez EMAIL par l'adresse e-mail du compte exécutant des commandes de gcloud CLI.

    4. Définissez l'ID du sujet ou utilisez le sujet que vous avez configuré précédemment.

      export TOPIC_ID=TOPIC_ID
      

      Remplacez TOPIC_ID par le nom de votre sujet.

    5. Attribuez au compte de gcloud CLI un rôle Pub/Sub disposant de l'autorisation pubsub.topics.setIamPolicy :

      gcloud pubsub topics add-iam-policy-binding \
        projects/$PUBSUB_PROJECT/topics/$TOPIC_ID \
        --member="user:$GCLOUD_ACCOUNT" \
        --role='roles/pubsub.admin'
      
    6. Attribuez au compte de gcloud CLI un rôle qui inclut toutes les autorisations securitycenter.notification, telles que roles/securitycenter.notificationConfigEditor ou roles/securitycenter.admin. Vous pouvez attribuer ce rôle au niveau du projet, du dossier ou de l'organisation.

      Pour accorder le rôle au niveau du projet:

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

      Remplacez les éléments suivants :

      • PROJECT_ID: ID du projet dans lequel Security Command Center est activé.
      • ROLE_NAME: rôle à attribuer

      Pour attribuer le rôle au niveau de l'organisation:

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

      Remplacez ROLE_NAME par le rôle à attribuer.

Vous devez ensuite créer un objet NotificationConfig.

Bibliothèques clientes

Pour configurer la fonctionnalité de notifications de l'API Security Command Center à l'aide des bibliothèques clientes, procédez comme suit :

  1. Configurez un compte de service.
  2. Téléchargez les bibliothèques clientes de l'API.
  3. Configurez un environnement de développement.
  4. Configurez un sujet et un abonnement Pub/Sub.

Étape 1 : Configurer un compte de service

La fonctionnalité de notifications de l'API Security Command Center utilise un compte de service disposant des autorisations appropriées pour configurer les notifications. Ce compte de service n'est utilisé que pour la mise en place initiale d'une configuration. Vous pouvez le réutiliser pour créer d'autres configurations de notifications ultérieurement. Ce compte est distinct du compte de service qui a été créé lors de la configuration de Security Command Center.

Pour créer un compte de service, procédez comme suit :

  1. Accédez à Google Cloud Console.

    Accédez à la console Google Cloud.

  2. Sélectionnez le projet pour lequel vous avez activé l'API Security Command Center.

  3. Cliquez sur Activer Cloud Shell

  4. Définissez les variables d'environnement :

    1. Définissez le nom de votre organisation :

        export ORGANIZATION_ID=ORGANIZATION_ID
      

      Remplacez ORGANIZATION_ID par l'ID de votre organisation.

    2. Définissez l'ID du projet dans lequel vous souhaitez activer l'API de notifications :

        export PROJECT_ID=PROJECT_ID
      

      en remplaçant PROJECT_ID par l'ID de votre projet :

    3. Définissez l'ID personnalisé que vous souhaitez utiliser pour le nouveau compte de service, par exemple scc-notifications. Le nom du compte de service doit comporter entre 6 et 30 caractères, commencer par une lettre, et ne se composer que de caractères alphanumériques et de tirets :

        export SERVICE_ACCOUNT=CUSTOM_ID
      

      Remplacez CUSTOM_ID par le nom personnalisé du compte de service.

    4. Définissez le chemin d'accès à la clé du compte de service, par exemple export KEY_LOCATION=/home/$USER/mykeys/$SERVICE_ACCOUNT.json :

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

      Remplacez FULL_KEY_LOCATION_PATH par le chemin d'accès complet à votre clé de compte de service.

  5. Créez un compte de service associé à votre ID de projet :

       gcloud iam service-accounts create $SERVICE_ACCOUNT  --display-name \
        "Service Account for [USER]"  --project $PROJECT_ID
    
  6. Créez une clé à associer au compte de service. La clé est utilisée lorsque vous créez un objet NotificationConfig et est stockée de manière permanente à l'emplacement KEY_LOCATION que vous avez spécifié lors des étapes précédentes.

       gcloud iam service-accounts keys create $KEY_LOCATION  --iam-account \
        $SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
    
  7. Attribuez au compte de service un rôle qui inclut toutes les autorisations securitycenter.notification, telles que roles/securitycenter.notificationConfigEditor ou roles/securitycenter.admin. Vous pouvez attribuer ce rôle au niveau du projet, du dossier ou de l'organisation.

    Pour accorder le rôle au niveau du projet:

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

    Remplacez ROLE_NAME par le rôle à attribuer.

    Pour attribuer le rôle au niveau de l'organisation:

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

    Remplacez ROLE_NAME par le rôle à attribuer.

Le compte de service est maintenant configuré pour être utilisé avec les notifications, et la clé du compte de service est stockée à l'emplacement KEY_LOCATION que vous avez spécifié. Pour en savoir plus sur les comptes de service, consultez la page Créer et gérer des clés de compte de service.

Étape 2 : Configurer un environnement de développement

Pour utiliser la fonctionnalité de notifications de l'API Security Command Center, vous pouvez utiliser gcloud CLI ou télécharger les bibliothèques clientes et configurer votre environnement de développement pour le langage de votre choix.

Python

  1. Facultatif : avant d'installer la bibliothèque Python, nous vous recommandons d'utiliser Virtualenv pour créer un environnement Python isolé.

     virtualenv YOUR_ENV
     source YOUR_ENV/bin/activate
    

    Remplacez YOUR_ENV par le nom de votre environnement virtuel.

  2. Installez pip pour gérer l'installation de la bibliothèque Python.

  3. Exécutez les commandes suivantes pour installer la bibliothèque Python :

     pip install google-cloud-securitycenter
    

Java

Pour inclure la bibliothèque Java Security Command Center en tant que dépendance dans votre projet, sélectionnez un artefact dans le dépôt Maven. Les notifications sont incluses dans la version 0.119.0 et ultérieures de la bibliothèque.

Si vous utilisez Intellij, définissez la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS sur le chemin absolu de la clé du compte de service des notifications que vous avez téléchargé lors des étapes précédentes :

  1. Dans Intellij, cliquez sur Exécuter > Modifier les configurations.
  2. Définissez la variable suivante sous Application > Run_Configuration_For_Sample > Variables d'environnement :

      GOOGLE_APPLICATION_CREDENTIALS=ABSOLUTE_PATH_TO_SERVICE_ACCOUNT_KEY
    

    Remplacez ABSOLUTE_PATH_TO_SERVICE_ACCOUNT_KEY par le chemin d'accès complet à la clé de votre compte de service.

Go

Pour installer les dépendances Go de l'API de notifications, téléchargez la bibliothèque Go :

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

Node.js

Dans le dossier du projet, utilisez npm pour installer les dépendances nécessaires à l'API de notifications :

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

Étape 3 : Configurer Pub/Sub

Pour envoyer des notifications à Pub/Sub, vous devez vous abonner à un sujet Pub/Sub et attribuer au compte de service des notifications un rôle IAM incluant l'autorisation pubsub.topics.setIamPolicy :

  1. Créez un sujet Pub/Sub ou utilisez un sujet existant :

       gcloud pubsub topics create TOPIC_ID
    

    Remplacez TOPIC_ID par votre ID de sujet.

  2. Définissez les variables d'environnement :

    1. Définissez l'ID du sujet :

        export TOPIC_ID=TOPIC_ID
      
    2. Définissez l'ID de projet du projet dans lequel vous avez activé l'API Notifications :

        export CONSUMER_PROJECT=PROJECT_ID
      

      en remplaçant PROJECT_ID par l'ID de votre projet :

    3. Définissez l'adresse e-mail du compte de service que vous avez créé lors des étapes précédentes :

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

      Remplacez SERVICE_ACCOUNT_NAME par le nom du compte de service.

  3. Créez un abonnement associé au sujet :

       gcloud pubsub subscriptions create SUBSCRIPTION_ID --topic TOPIC_ID
    

    Remplacez SUBSCRIPTION_ID par l'ID d'abonnement.

  4. Attribuez au compte de service des notifications un rôle doté de l'autorisation pubsub.topics.setIamPolicy :

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

Pour en savoir plus sur la configuration de Pub/Sub, consultez la page Gérer les sujets et les abonnements. À l'étape suivante, vous allez terminer la configuration en créant un objet NotificationConfig.

Créer un objet NotificationConfig

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

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

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

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

gcloud

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

Remplacez les éléments suivants :

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

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

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

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

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

Python

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

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

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

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

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

    client = securitycenter.SecurityCenterClient()

    created_notification_config = client.create_notification_config(
        request={
            "parent": parent_id,
            "config_id": notification_config_id,
            "notification_config": {
                "description": "Notification for active findings",
                "pubsub_topic": pubsub_topic,
                "streaming_config": {"filter": 'state = "ACTIVE"'},
            },
        }
    )

    print(created_notification_config)

Java

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

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

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


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

public class CreateNotificationConfigSnippets {

  public static void main(String[] args) throws IOException {
    // parentId: must be in one of the following formats:
    //    "organizations/{organization_id}"
    //    "projects/{project_id}"
    //    "folders/{folder_id}"
    String parentId = String.format("organizations/%s", "ORG_ID");
    String notificationConfigId = "{config-id}";
    String projectId = "{your-project}";
    String topicName = "{your-topic}";

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

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

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

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

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

Go

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

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

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

import (
	"context"
	"fmt"
	"io"

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

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

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

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

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

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

	return nil
}

Node.js

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

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

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

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

const client = new SecurityCenterClient();

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

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

createNotificationConfig();

PHP

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

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

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

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

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

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

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

Ruby

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

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

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

require "google/cloud/security_center"

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

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

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

client = Google::Cloud::SecurityCenter.security_center

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

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

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

C#

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

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

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


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

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

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

        NotificationConfig response = client.CreateNotificationConfig(request);
        Console.WriteLine($"Notification config was created: {response}");
        return response;
    }
}

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

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

Accorder l'accès à un périmètre dans VPC Service Controls

Si vous utilisez VPC Service Controls et que votre sujet Pub/Sub fait partie d'un projet dans un périmètre de service, vous devez accorder l'accès aux projets afin de créer des notifications.

Pour accorder l'accès aux projets, créez des règles d'entrée et de sortie pour les comptes principaux et les projets utilisés pour créer des notifications. Les règles autorisent l'accès aux ressources protégées et permettent à Pub/Sub de vérifier que les utilisateurs disposent de l'autorisation setIamPolicy sur le sujet Pub/Sub.

Créer un objet NotificationConfig

Pour suivre la procédure décrite dans la section Créer un objet NotificationConfig, procédez comme suit :

  1. Accédez à la page "VPC Service Controls" dans Google Cloud Console.

    Accéder à VPC Service Controls

  2. Si nécessaire, sélectionnez votre organisation.

  3. Cliquez sur le nom du périmètre de service que vous souhaitez modifier.

    Pour trouver le périmètre de service que vous devez modifier, vous pouvez rechercher dans vos journaux les entrées indiquant des cas de non-respect de RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER. Dans ces entrées, vérifiez le champ servicePerimeterName : accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME.

  4. Cliquez sur Modifier le périmètre.

  5. Dans le menu de navigation, cliquez sur Règle d'entrée.

  6. Pour configurer des règles d'entrée pour les utilisateurs ou les comptes de service, utilisez les paramètres suivants :

    • Attributs "FROM" du client API :
      • Dans le menu déroulant Source, sélectionnez Toutes les sources.
      • Dans le menu déroulant Identités, choisissez Identités sélectionnées.
      • Cliquez sur Sélectionner, puis saisissez le compte principal utilisé pour appeler l'API Security Command Center.
    • Attributs "TO" des services/ressources Google Cloud :
      • Dans le menu déroulant Projet, choisissez Projets sélectionnés.
      • Cliquez sur Sélectionner, puis saisissez le projet contenant le sujet Pub/Sub.
      • Dans le menu déroulant Services, choisissez Services sélectionnés, puis API Cloud Pub/Sub.
      • Dans le menu déroulant Méthodes, choisissez Toutes les actions.
  7. Cliquez sur Enregistrer.

  8. Dans le menu de navigation, cliquez sur Règle de sortie.

  9. Cliquez sur Add Rule (Ajouter une règle).

  10. Pour configurer des règles de sortie pour les comptes utilisateur ou de service, saisissez les paramètres suivants :

    • Attributs "FROM" du client API :
      • Dans le menu déroulant Identités, choisissez Identités sélectionnées.
      • Cliquez sur Sélectionner, puis saisissez le compte principal utilisé pour appeler l'API Security Command Center.
    • Attributs "TO" des services/ressources Google Cloud :
      • Dans le menu déroulant Projet, choisissez Tous les projets.
      • Dans le menu déroulant Services, choisissez Sélectionner des services, puis API Cloud Pub/Sub.
      • Dans le menu déroulant Méthodes, choisissez Toutes les actions.
  11. Cliquez sur Enregistrer.

Créer une règle d'entrée pour l'objet NotificationConfig

Pour créer une règle d'entrée pour un objet NotificationConfig, procédez comme suit :

  1. Suivez les instructions de la section Créer un objet NotificationConfig.
  2. Ouvrez à nouveau le périmètre de service de la section précédente.
  3. Cliquez sur Règle d'entrée.
  4. Cliquez sur Add Rule (Ajouter une règle).
  5. Pour configurer la règle d'entrée du compte de service NotificationConfig que vous avez créé, saisissez les paramètres suivants :
    • Attributs "FROM" du client API :
      • Dans le menu déroulant Source, sélectionnez Toutes les sources.
      • Dans le menu déroulant Identités, choisissez Identités sélectionnées.
      • Cliquez sur Sélectionner, puis saisissez le nom du compte de service NotificationConfig : service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gserviceaccount.com
    • Attributs "TO" des services/ressources GCP :
      • Dans le menu déroulant Projet, choisissez Projets sélectionnés.
      • Cliquez sur Sélectionner, puis sélectionnez le projet contenant le sujet Pub/Sub.
      • Dans le menu déroulant Services, choisissez Sélectionner des services, puis API Cloud Pub/Sub.
      • Dans le menu déroulant Méthodes, choisissez Toutes les actions.
  6. Dans le menu de navigation, cliquez sur Enregistrer.

Les projets, utilisateurs et comptes de service sélectionnés peuvent désormais accéder aux ressources protégées et créer des notifications.

Si vous avez suivi toutes les étapes de ce guide et que les notifications fonctionnent correctement, vous pouvez maintenant supprimer les éléments suivants :

  • Règle d'entrée du compte principal
  • Règle de sortie du compte principal

Ces règles n'étaient nécessaires que pour configurer l'objet NotificationConfig. Toutefois, pour que les notifications continuent de fonctionner, vous devez conserver la règle d'entrée pour NotificationConfig qui permet de publier des notifications dans votre sujet Pub/Sub derrière le périmètre de service.

Étapes suivantes