Habilita las notificaciones de resultados para Pub/Sub

En esta página, se explica cómo habilitar las notificaciones de la API de Security Command Center.

Las notificaciones envían resultados y actualizaciones de resultados a un tema de Pub/Sub en cuestión de minutos. Las notificaciones de la API de Security Command Center incluyen toda la información de búsqueda que Security Command Center muestra en la consola de Google Cloud.

Puedes conectar las notificaciones de Security Command Center en Pub/Sub directamente a las acciones de funciones de Cloud Run. Para ver ejemplos de funciones que pueden ayudar con la respuesta, el enriquecimiento y la solución, consulta el repositorio de código abierto de Security Command Center del código de funciones de Cloud Run. El repositorio contiene soluciones que te ayudan a realizar acciones automatizadas con respecto a los resultados de seguridad.

Como alternativa, puedes exportar los resultados a BigQuery o configurar exportaciones continuas para Pub/Sub en la consola de Google Cloud.

Antes de comenzar

  1. Para obtener los permisos que necesitas para configurar las notificaciones de la API de Security Command Center, pídele a tu administrador que te otorgue los siguientes roles de IAM:

    Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

    También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.

  2. Enable the Security Command Center API:

    gcloud services enable securitycenter.googleapis.com

Notificaciones y residencia de datos

Si la residencia de datos está habilitada para Security Command Center, las configuraciones que definen las exportaciones continuas a Pub/Sub (recursos notificationConfig) están sujetas al control de residencia de datos y se almacenan en tu ubicación de Security Command Center.

Para exportar resultados de una ubicación de Security Command Center a Pub/Sub, debes configurar la exportación continua en la misma ubicación de Security Command Center que los resultados.

Debido a que los filtros que se usan en las exportaciones continuas pueden contener datos sujetos a controles de residencia, asegúrate de especificar la ubicación correcta antes de crearlos. Security Command Center no restringe la ubicación en la que creas las exportaciones.

Las exportaciones continuas se almacenan solo en la ubicación en la que se crean y no se pueden ver ni editar en otras ubicaciones.

Después de crear una exportación continua, no puedes cambiar su ubicación. Para cambiar la ubicación, debes borrar la exportación continua y volver a crearla en la ubicación nueva.

Para recuperar una exportación continua con llamadas a la API, debes especificar la ubicación en el nombre completo del recurso de notificationConfig. Por ejemplo:

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

Del mismo modo, para recuperar una exportación continua con la gcloud CLI, debes especificar la ubicación con la marca --location. Por ejemplo:

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

Configura un tema de Pub/Sub

En esta tarea, crearás y te suscribirás al tema de Pub/Sub al que deseas enviar notificaciones.

Paso 1: Configura Pub/Sub

Para configurar un tema de Pub/Sub y suscribirte a él, haz lo siguiente:

  1. Ve a la consola de Google Cloud.

    Ve a la consola de Google Cloud.

  2. Selecciona el proyecto en el que habilitaste la API de Security Command Center.

  3. Haz clic en Activate Cloud Shell (Activar Cloud Shell).

  4. Opcional: Para crear un tema nuevo de Pub/Sub, ejecuta el siguiente comando:

    gcloud pubsub topics create TOPIC_ID
    

    Reemplaza TOPIC_ID por un nombre de tema.

  5. Crea una suscripción al tema:

    gcloud pubsub subscriptions create SUBSCRIPTION_ID --topic=TOPIC_ID
    

    Reemplaza lo siguiente:

    • SUBSCRIPTION_ID: El ID de suscripción.
    • TOPIC_ID: El ID del tema

Para obtener más información sobre cómo configurar Pub/Sub, consulta Administra temas y suscripciones.

Paso 2: Otorga un rol en el tema de Pub/Sub

Para crear un NotificationConfig, necesitas el rol de administrador de Pub/Sub (roles/pubsub.admin) en el tema de Pub/Sub para el que creaste una suscripción.

Para otorgar este rol, haz lo siguiente:

  1. Ve a la consola de Google Cloud.

    Ve a la consola de Google Cloud.

  2. Selecciona el proyecto para el que habilitaste la API de Security Command Center.

  3. Haz clic en Activate Cloud Shell (Activar Cloud Shell).

  4. Otorga el rol requerido a tu Cuenta de Google en el tema de Pub/Sub:

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

    Reemplaza lo siguiente:

    • PUBSUB_PROJECT: Es el proyecto de Google Cloud que contiene tu tema de Pub/Sub.
    • TOPIC_ID: El ID del tema
    • GOOGLE_ACCOUNT: La dirección de correo electrónico de tu Cuenta de Google

Crear una NotificationConfig

Antes de crear un NotificationConfig, ten en cuenta que cada organización puede tener una cantidad limitada de archivos NotificationConfig. Para obtener más información, consulta Cuotas y límites.

El NotificationConfig incluye un campo filter que limita las notificaciones a eventos útiles. Este campo acepta todos los filtros disponibles en el método findings.list de la API de Security Command Center.

Cuando creas un NotificationConfig, especificas un elemento superior para el NotificationConfig de la jerarquía de recursos de Google Cloud, ya sea una organización, una carpeta o un proyecto. Si necesitas recuperar, actualizar o borrar el NotificationConfig más adelante, debes incluir el ID numérico de la organización, la carpeta o el proyecto superior cuando hagas referencia a él.

En la consola de Google Cloud, es posible que algunos recursos NotificationConfig tengan la etiqueta Heredado, que indica que se crearon con la API de Security Command Center v1. Puedes administrar estos recursos de NotificationConfig con la consola de Google Cloud, gcloud CLI, la API de Security Command Center v1 o las bibliotecas cliente de Security Command Center v1.

Para administrar estos recursos NotificationConfig con gcloud CLI, no debes especificar una ubicación cuando ejecutes el comando de gcloud CLI.

Para crear la NotificationConfig con el lenguaje o la plataforma que prefieras, haz lo siguiente:

gcloud

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

Reemplaza lo siguiente:

  • NOTIFICATION_NAME: Es el nombre de la notificación. Debe tener entre 1 y 128 caracteres y contener solo caracteres alfanuméricos, guiones bajos o guiones.
  • PARENT: Es el permiso en la jerarquía de recursos al que se aplica la notificación, organization, folder o project.
  • PARENT_ID: El ID de la organización, la carpeta o el proyecto superior, especificado en el formato organizations/123, folders/456 o projects/789.
  • LOCATION: Si la residencia de datos está habilitada, es la ubicación de Security Command Center en la que se encuentra. Si la residencia de datos no está habilitada, usa el valor global.
  • NOTIFICATION_DESCRIPTION: Es una descripción de la notificación de no más de 1,024 caracteres.
  • PUBSUB_TOPIC: Es el tema de Pub/Sub que recibirá notificaciones. Su formato es projects/PROJECT_ID/topics/TOPIC.
  • FILTER: Es la expresión que defines para seleccionar qué resultados se envían a Pub/Sub. Por ejemplo, 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

Las notificaciones ahora se publican en el tema de Pub/Sub que especificaste.

Para publicar notificaciones, se crea una cuenta de servicio para ti con el formato service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gserviceaccount.com. Esta cuenta de servicio se crea cuando creas tu primer NotificationConfig y se te otorga de forma automática el rol securitycenter.notificationServiceAgent en la política de IAM para PUBSUB_TOPIC cuando creas la configuración de notificaciones. Esta función de cuenta de servicio es obligatoria para que las notificaciones funcionen.

Otorga acceso al perímetro en los Controles del servicio de VPC

Si usas los Controles del servicio de VPC y tu tema de Pub/Sub forma parte de un proyecto dentro de un perímetro de servicio, debes otorgar acceso a los proyectos para crear notificaciones.

Para otorgar acceso a los proyectos, crea reglas de entrada y salida para las principales y los proyectos que se usan para crear notificaciones. Las reglas permiten el acceso a los recursos protegidos y permiten que Pub/Sub verifique que los usuarios tengan el permiso setIamPolicy en el tema de Pub/Sub.

Antes de crear una NotificationConfig

Antes de completar los pasos de Crea una NotificationConfig, haz lo siguiente:

  1. Ve a la página Controles del servicio de VPC en la consola de Google Cloud.

    Ir a los Controles del servicio de VPC

  2. Si es necesario, selecciona tu organización.

  3. Haz clic en el nombre del perímetro de servicio que deseas cambiar.

    Para encontrar el perímetro de servicio que necesitas modificar, puedes revisar los registros en busca de entradas que muestren incumplimientos de RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER. En esas entradas, verifica el campo servicePerimeterName: accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME.

  4. Haz clic en Editar perímetro.

  5. En el menú de navegación, haz clic en Política de entrada.

  6. Si quieres configurar reglas de entrada para usuarios o cuentas de servicio, usa los siguientes parámetros:

    • DESDE atributos del cliente de la API:
      • En el menú desplegable Fuente, selecciona Todas las fuentes.
      • En el menú desplegable Identidades, elige Identidades seleccionadas.
      • Haz clic en Seleccionar y, luego, ingresa el principal que se usa para llamar a la API de Security Command Center.
    • HACIA atributos de los servicios o recursos de Google Cloud:
      • En el menú desplegable Proyecto, elige Proyectos seleccionados.
      • Haz clic en Seleccionar y, luego, ingresa el proyecto que contiene el tema de Pub/Sub.
      • En el menú desplegable Servicios, selecciona Servicios seleccionados y, luego, selecciona API de Cloud Pub/Sub.
      • En el menú desplegable Métodos, selecciona Todas las acciones.
  7. Haz clic en Guardar.

  8. En el menú de navegación, haz clic en Política de salida.

  9. Haz clic en Agregar regla.

  10. A fin de configurar reglas de salida para cuentas de usuario o servicio, ingresa los siguientes parámetros:

    • DESDE atributos del cliente de la API:
      • En el menú desplegable Identidades, elige Identidades seleccionadas.
      • Haz clic en Seleccionar y, luego, ingresa el principal que se usa para llamar a la API de Security Command Center.
    • HACIA atributos de los servicios o recursos de Google Cloud:
      • En el menú desplegable Proyecto, selecciona Todos los proyectos.
      • En el menú desplegable Servicios, selecciona Servicios seleccionados y, luego, selecciona API de Cloud Pub/Sub.
      • En el menú desplegable Métodos, selecciona Todas las acciones.
  11. Haz clic en Guardar.

Crea una regla de entrada para la NotificationConfig

A fin de crear una regla de entrada para una NotificationConfig, haz lo siguiente:

  1. Completa las instrucciones de Crea una NotificationConfig.
  2. Vuelve a abrir el perímetro de servicio de la sección anterior.
  3. Haz clic en Política de entrada.
  4. Haz clic en Agregar regla.
  5. Para configurar la regla de entrada de la cuenta de servicio NotificationConfig que creaste, ingresa los siguientes parámetros:
    • DESDE atributos del cliente de la API:
      • En el menú desplegable Fuente, selecciona Todas las fuentes.
      • En el menú desplegable Identidades, elige Identidades seleccionadas.
      • Haz clic en Seleccionar y, luego, ingresa el nombre de la cuenta de servicio NotificationConfig: service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gserviceaccount.com
    • HACIA atributos de los servicios o recursos de GCP:
      • En el menú desplegable Proyecto, elige Proyectos seleccionados.
      • Haz clic en Seleccionar y, luego, selecciona el proyecto que contiene el tema de Pub/Sub.
      • En el menú desplegable Servicios, selecciona Servicios seleccionados y, luego, selecciona API de Cloud Pub/Sub.
      • En el menú desplegable Métodos, selecciona Todas las acciones.
  6. En el menú de navegación, haz clic en Guardar.

Los proyectos, los usuarios y las cuentas de servicio seleccionados ahora pueden acceder a los recursos protegidos y crear notificaciones.

Si seguiste todos los pasos de esta guía y las notificaciones funcionan de forma correcta, ahora puedes borrar lo siguiente:

  • La regla de entrada para el principal
  • La regla de salida del principal

Esas reglas solo eran necesarias para configurar la NotificationConfig. Sin embargo, para que las notificaciones continúen funcionando, debes conservar la regla de entrada de la NotificationConfig, que le permite publicar notificaciones en tu tema de Pub/Sub detrás del perímetro de servicio.

¿Qué sigue?