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 sur les résultats 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 Run 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 Run 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 les exportations continues pour Pub/Sub dans la console Google Cloud.

Avant de commencer

  1. Pour obtenir les autorisations nécessaires pour configurer les notifications de l'API Security Command Center, demandez à votre administrateur de vous accorder les rôles IAM suivants:

    Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.

    Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

  2. Enable the Security Command Center API:

    gcloud services enable securitycenter.googleapis.com

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 Pub/Sub (ressources 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 les résultats d'un emplacement Security Command Center vers Pub/Sub, vous devez configurer l'exportation continue dans le même emplacement Security Command Center que les résultats.

Étant donné que les filtres utilisés dans les exportations continues peuvent contenir des données soumises à des contrôles de résidence, assurez-vous de 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 dans l'emplacement où elles sont créées et ne peuvent pas être consultées ni modifiées dans d'autres emplacements.

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 de notificationConfig. Exemple :

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

De même, pour récupérer une exportation continue à l'aide de gcloud CLI, vous devez spécifier l'emplacement à l'aide de l'option --location. Exemple :

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

Configurer un sujet Pub/Sub

Dans cette tâche, vous allez créer et vous abonner au sujet Pub/Sub auquel vous souhaitez envoyer des notifications.

É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 dans lequel vous avez activé l'API Security Command Center.

  3. Cliquez sur Activer Cloud Shell.

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

    gcloud pubsub topics create TOPIC_ID
    

    Remplacez TOPIC_ID par un nom de sujet.

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

    gcloud pubsub subscriptions create SUBSCRIPTION_ID --topic=TOPIC_ID
    

    Remplacez les éléments suivants :

    • SUBSCRIPTION_ID : ID de l'abonnement
    • TOPIC_ID: ID du sujet

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

Étape 2: Attribuer un rôle au sujet Pub/Sub

Pour créer un NotificationConfig, vous avez besoin du rôle Administrateur Pub/Sub (roles/pubsub.admin) sur le sujet Pub/Sub pour lequel vous avez créé un abonnement.

Pour accorder ce rôle, procédez comme suit:

  1. Accédez à Google Cloud Console.

    Accédez à Google Cloud Console.

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

  3. Cliquez sur Activer Cloud Shell.

  4. Attribuez le rôle requis à votre compte Google sur le sujet Pub/Sub:

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

    Remplacez les éléments suivants :

    • PUBSUB_PROJECT: projet Google Cloud contenant votre sujet Pub/Sub
    • TOPIC_ID: ID du sujet
    • GOOGLE_ACCOUNT: adresse e-mail de votre compte Google

Créer un paramètre NotificationConfig

Avant de créer un 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 le NotificationConfig à partir de la hiérarchie des ressources Google Cloud, qu'il s'agisse d'une organisation, d'un dossier ou d'un projet. Si vous devez récupérer, mettre à jour ou supprimer l'NotificationConfig ultérieurement, vous devez inclure l'ID numérique de l'organisation, du dossier ou du projet parent lorsque vous y faites référence.

Dans la console Google Cloud, certaines ressources NotificationConfig peuvent afficher un libellé Ancienne, ce qui indique qu'elles ont été créées avec l'API Security Command Center v1. Vous pouvez gérer ces ressources NotificationConfig avec la console Google Cloud, la gcloud CLI, l'API Security Command Center v1 ou les bibliothèques clientes v1 pour Security Command Center.

Pour gérer ces ressources NotificationConfig avec la CLI gcloud, vous ne devez pas spécifier d'emplacement lorsque vous exécutez la commande gcloud CLI.

Pour créer l'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. Il doit comporter entre 1 et 128 caractères, et ne peut contenir que des caractères alphanumériques, des traits de soulignement ou des traits d'union.
  • PARENT: champ d'application dans 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, au format organizations/123, folders/456 ou projects/789.
  • LOCATION : si la résidence des données est activée, l'emplacement Security Command Center dans lequel effectuer l'opération. Si la résidence des données n'est pas activée, utilisez la valeur global.
  • NOTIFICATION_DESCRIPTION: description de la notification (1 024 caractères maximum).
  • PUBSUB_TOPIC: sujet Pub/Sub qui recevra les notifications. Son format est projects/PROJECT_ID/topics/TOPIC.
  • FILTER: expression que vous définissez pour sélectionner les résultats à envoyer à Pub/Sub. Exemple : state=\"ACTIVE\".

Go

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

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 objet NotificationConfig et 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 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 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 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 pour le principal
  • Règle de sortie pour le 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.

Étape suivante