Configura la búsqueda de notificaciones

>

Habilita la función de notificaciones de la API de Security Command Center. Las notificaciones envían información a un tema de Pub/Sub para proporcionar actualizaciones de resultados y resultados nuevos en minutos. Dado que Security Command Center funciona a nivel de la organización, las notificaciones de la API de Security Command Center incluyen toda la información de búsqueda que se muestra en el panel de Security Command Center.

Puedes conectar las notificaciones de Pub/Sub de Security Command Center directamente a las acciones de Cloud Functions. Para ver ejemplos de funciones de seguridad que pueden ayudarte con la respuesta, el enriquecimiento y la solución, consulta la app de ejemplo de herramientas de Security Command Center.

Antes de comenzar

  • Para habilitar las notificaciones de la API de Security Command Center, debes tener la función de IAM de Administrador del centro de seguridad.
  • Para acceder al panel de Security Command Center, debes tener la función de IAM Visualizador del centro de seguridad del centro de seguridad.
  • Para otorgar las funciones adecuadas a la cuenta de servicio de notificaciones o a la cuenta de herramienta de gcloud, debes tener la función de Administrador de la organización.

Obtén más información sobre las funciones de Security Command Center.

Configura las notificaciones de la API de Security Command Center

Para configurar las notificaciones, primero habilita la API de Security Command Center.

Habilita la API de Security Command Center

Para habilitar la API de Security Command Center:

  1. Ve a la página Biblioteca de API en Cloud Console.
    Ir a la página Biblioteca de API
  2. Selecciona el proyecto para el que deseas habilitar la API de notificaciones.
  3. En el cuadro Buscar, ingresa Security Command Center y, luego, haz clic en Security Command Center en los resultados de la búsqueda.
  4. En la página de API que aparece, haz clic en Habilitar.

Ahora la API de Security Command Center está habilitada para tu proyecto. A continuación, usa la herramienta de gcloud o las bibliotecas cliente para suscribirte a un tema de Pub/Sub y configurar los permisos.

Configura un tema de Pub/Sub

En este paso, crearás y te suscribirás al tema de Pub/Sub al que desea enviar notificaciones. Si no necesitas llamar a la API de manera programática, se recomiendan los comandos de la herramienta de gcloud porque es más fácil de configurar.

gcloud

Para configurar la función de notificaciones de la API de Security Command Center con la herramienta de gcloud, debes hacer lo siguiente:

  1. Configura una suscripción y un tema de Pub/Sub
  2. Configura los permisos de la cuenta de la herramienta de gcloud.

Paso 1: Configura Pub/Sub

Para configurar un tema de Pub/Sub y suscribirse a él, sigue estos pasos:

  1. Ve a Google Cloud Console.
    Ir a Google Cloud Console
  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. Crea un tema nuevo o vuelve a usar un tema existente. Para crear un tema nuevo, sigue estos pasos:

       gcloud pubsub topics create topic-id
    
  5. Establece las variables de entorno:

    1. Configura el ID del tema:

        export TOPIC_ID=topic-id
      
  6. Crea una suscripción al tema:

       gcloud pubsub subscriptions create subscription-id --topic topic-id
    

Para obtener más información sobre la configuración de Pub/Sub, consulta Administra temas y suscripciones. A continuación, configura los permisos para tu cuenta.

Paso 2: Configura los permisos de la cuenta de la herramienta de gcloud

Para crear un NotificationConfig, necesitas las siguientes funciones de administración de identidades y accesos (IAM) en tu cuenta de herramienta de gcloud:

  • roles/securitycenter.admin o bien roles/securitycenter.notificationConfigEditor
  • roles/pubsub.admin en el tema de Pub/Sub que recibe notificaciones

Para otorgar estos permisos:

  1. Ve a Google Cloud Console.
    Ir a Google Cloud Console
  2. Selecciona el proyecto para el que habilitaste la API de Security Command Center.
  3. Haz clic en Activate Cloud Shell (Activar Cloud Shell).

    1. Establece el nombre de la organización:

        export ORGANIZATION_ID=organization-id
      
    2. Configura el ID del proyecto para el proyecto al que pertenece el tema de Pub/Sub:

        export PUBSUB_PROJECT=project-id
      
    3. Configura la cuenta de herramienta de gcloud que estás usando:

        export GCLOUD_ACCOUNT=your-username@email.com
      
    4. Configura el ID del tema o usa el tema del Paso 1.

        export TOPIC_ID=topic-id
      
    5. Otorga a la cuenta de la herramienta de gcloud una función de Pub/Sub con el permiso 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. Otorga a la cuenta de herramienta de gcloud una función para la organización que incluye todos los permisos securitycenter.notification, como roles/securitycenter.notificationConfigEditor o roles/securitycenter.admin.

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

A continuación, debes crear una NotificationConfig.

Bibliotecas cliente

Para configurar la función de notificaciones de la API de Security Command Center con las bibliotecas cliente, debes hacer lo siguiente:

  1. Configura una cuenta de servicio
  2. Descarga las bibliotecas cliente de la API.
  3. Configura un entorno de desarrollo.
  4. Configura una suscripción y un tema de Pub/Sub

Paso 1: Configura una cuenta de servicio

La función de notificaciones de la API de Security Command Center usa una cuenta de servicio con los permisos adecuados para configurar las notificaciones. Esta cuenta de servicio solo se usa para la configuración inicial de una configuración, y puedes volver a usarla a fin de crear más configuraciones de notificaciones más adelante. Esta cuenta de servicio es independiente de la que se creó para configurar Security Command Center.

Para crear una cuenta de servicio:

  1. Ve a Google Cloud Console.
    Ir a Google Cloud Console
  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. Establece las variables de entorno:

    1. Establece el nombre de la organización:

        export ORGANIZATION_ID=organization-id
      
    2. Establece el ID del proyecto en el que deseas habilitar la API de notificaciones:

        export PROJECT_ID=project-id
      
    3. Configura el ID personalizado que deseas usar para la cuenta de servicio nueva, como scc-notifications. El nombre de la cuenta de servicio debe tener entre 6 y 30 caracteres, debe comenzar con una letra y contener todos los caracteres alfanuméricos y guiones minúsculas en minúscula:

        export SERVICE_ACCOUNT=custom-id
      
    4. Establece la ruta en la que se debe almacenar la clave de la cuenta de servicio, como 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
      
  5. Crea una cuenta de servicio asociada con tu ID del proyecto:

       gcloud iam service-accounts create $SERVICE_ACCOUNT  --display-name \
        "Service Account for [USER]"  --project $PROJECT_ID
    
  6. Crea una clave para asociar con la cuenta de servicio. La clave se usa cuando creas un NotificationConfig y se almacena de forma persistente en el KEY_LOCATION que especificaste en los pasos anteriores.

       gcloud iam service-accounts keys create $KEY_LOCATION  --iam-account \
        $SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
    
  7. Otorga a la cuenta de servicio una función para la organización que incluya todos los permisos de securitycenter.notification, como roles/securitycenter.notificationConfigEditor o roles/securitycenter.admin.

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

La cuenta de servicio ya está configurada para usar con notificaciones y la clave de la cuenta de servicio se almacena en el KEY_LOCATION que especificaste. Para obtener más información sobre las cuentas de servicio, consulta crea y administra claves de cuenta de servicio.

Paso 2: Configura un entorno de desarrollo

Para usar la característica de notificaciones de la API de Security Command Center, puedes usar la herramienta de gcloud o descargar las bibliotecas cliente y configurar tu entorno de desarrollo para el lenguaje que elijas.

Python

  1. Opcional: Antes de instalar la biblioteca de Python, te recomendamos usar Virtualenv para crear un entorno aislado de Python.

     virtualenv your-env
     source your-env/bin/activate
    
  2. Instala pip para administrar la instalación de la biblioteca de Python.

  3. Ejecuta los siguientes comandos para instalar la biblioteca de Python:

     pip install google-cloud-securitycenter
    

Java

Para incluir la biblioteca de Java de Security Command Center como una dependencia en tu proyecto, selecciona un artefacto del repositorio de Maven. Las notificaciones se incluyen en la versión 0.119.0 de la biblioteca y versiones posteriores.

Si usas IntelliJ, configura la variable de entorno GOOGLE_APPLICATION_CREDENTIALS como la ruta absoluta de la clave de la cuenta de servicio de notificaciones que descargaste en los pasos anteriores:

  1. En IntelliJ, haz clic en Run (Ejecutar) > Edit Configurations (Editar configuraciones).
  2. Configura la siguiente variable en Aplicación > Run_Configuration_For_Sample > Variables de entorno:

      GOOGLE_APPLICATION_CREDENTIALS=absolute-path-to-service-account-key
    

Go

Para instalar las dependencias de Go de la API de Go, ejecuta el siguiente comando:

Para descargar la biblioteca de Go, ejecuta lo siguiente:

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

Node.js

En la carpeta del proyecto, usa npm para instalar las dependencias de la API de notificaciones necesarias:

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

Paso 3: configura Pub/Sub

Para entregar notificaciones a Pub/Sub, te suscribes a un tema de Pub/Sub y otorgas a la cuenta de servicio de notificaciones una función de IAM que incluya el permiso pubsub.topics.setIamPolicy:

  1. Crea un tema nuevo o vuelve a usar un tema existente. Para crear un tema nuevo, sigue estos pasos:

       gcloud pubsub topics create topic-id
    
  2. Establece las variables de entorno:

    1. Configura el ID del tema:

        export TOPIC_ID=topic-id
      
    2. Configura el ID del proyecto para el proyecto en el que habilitaste la API de notificaciones:

        export CONSUMER_PROJECT=project-id
      
    3. Configura el correo electrónico de la cuenta de servicio que creaste en los pasos anteriores:

        export SERVICE_ACCOUNT_EMAIL=service-account-name@$CONSUMER_PROJECT.iam.gserviceaccount.com
      
  3. Crea una suscripción al tema:

       gcloud pubsub subscriptions create subscription-id --topic topic-id
    
  4. Otorga una función a la cuenta de servicio de notificaciones con el permiso 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'
    

Para obtener más información sobre la configuración de Pub/Sub, consulta Administra temas y suscripciones. En el siguiente paso, puedes completar la configuración mediante la creación de un NotificationConfig.

Crea una NotificationConfig

Antes de crear un NotificationConfig, ten en cuenta la siguiente información:

  • Cada organización puede tener una cantidad limitada de archivos NotificationConfig. Para obtener más información, consulta Cuotas y límites.
  • Debes tener la función de IAM Administrador de la organización para que puedas otorgar las funciones adecuadas a la cuenta de servicio de notificaciones o a la cuenta de la herramienta gcloud.

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.

Para otorgar a la cuenta la función de IAM de Editor de configuraciones de notificaciones del centro de seguridad mediante la herramienta de línea de comandos de gcloud, haz lo siguiente:

  1. Establece las variables de entorno:

    1. Establece el nombre de la organización:

        export ORGANIZATION_ID=organization-id
      
    2. Configura el correo electrónico de la cuenta de servicio que creaste cuando configuraste las notificaciones de búsqueda o la cuenta que usas para ejecutar los comandos de la herramienta gcloud:

      • Configura el correo electrónico de la cuenta que se usa para ejecutar los comandos de la herramienta de gcloud:

        export EMAIL=your-username@email.com
        
      • O configura el correo electrónico de la cuenta de servicio:

        export EMAIL=service-account-name@$CONSUMER_PROJECT.iam.gserviceaccount.com
        
  2. Otorga la función necesaria a la cuenta de servicio o a la cuenta que usaste con los comandos de la herramienta gcloud:

    • Otorga la función a la cuenta que se usó para ejecutar los comandos de la herramienta gcloud:

         gcloud organizations add-iam-policy-binding \
           $ORGANIZATION_ID \
           --member="user:$EMAIL" \
           --role='roles/securitycenter.notificationConfigEditor'
           ```
      
    • O bien, otorga la función a la cuenta de servicio:

         gcloud organizations add-iam-policy-binding \
           $ORGANIZATION_ID \
           --member="serviceAccount:$EMAIL" \
           --role='roles/securitycenter.notificationConfigEditor'
           ```
      

Después de otorgar los permisos de la cuenta de servicio o la cuenta de servicio gcloud, crea NotificationConfig con el lenguaje o la plataforma que elijas:

gcloud

  # The numeric ID of the organization
  ORGANIZATION_ID=organization-id

  # The topic to which the notifications are published
  PUBSUB_TOPIC="projects/project-id/topics/topic-id"

  # The description for the NotificationConfig
  DESCRIPTION="Notifies for active findings"

  # Filters for active findings
  FILTER="state=\"ACTIVE\""

  gcloud alpha scc notifications create notification-name \
    --organization "$ORGANIZATION_ID" \
    --description "$DESCRIPTION" \
    --pubsub-topic $PUBSUB_TOPIC \
    --filter "$FILTER"

Python

from google.cloud import securitycenter as securitycenter

client = securitycenter.SecurityCenterClient()

# TODO: organization_id = "your-org-id"
# TODO: notification_config_id = "your-config-id"
# TODO: pubsub_topic = "projects/{your-project-id}/topics/{your-topic-ic}"
# Ensure this ServiceAccount has the "pubsub.topics.setIamPolicy" permission on the new topic.

org_name = "organizations/{org_id}".format(org_id=organization_id)

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

print(created_notification_config)

Java

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 static NotificationConfig createNotificationConfig(
      String organizationId, String notificationConfigId, String projectId, String topicName)
      throws IOException {
    // String organizationId = "{your-org-id}";
    // String notificationConfigId = {"your-unique-id"};
    // String projectId = "{your-project}"";
    // String topicName = "{your-topic}";

    String orgName = String.format("organizations/%s", organizationId);

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

    try (SecurityCenterClient client = SecurityCenterClient.create()) {
      CreateNotificationConfigRequest request =
          CreateNotificationConfigRequest.newBuilder()
              .setParent(orgName)
              .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.println(String.format("Notification config was created: %s", response));
      return response;
    }
  }

Go

import (
	"context"
	"fmt"
	"io"

	securitycenter "cloud.google.com/go/securitycenter/apiv1"
	securitycenterpb "google.golang.org/genproto/googleapis/cloud/securitycenter/v1"
)

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: %v", err)
	}
	defer client.Close()

	req := &securitycenterpb.CreateNotificationConfigRequest{
		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: %v", err)
	}
	fmt.Fprintln(w, "New NotificationConfig created: ", notificationConfig)

	return nil
}

Node.js

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

const client = new SecurityCenterClient();

// organizationId = "your-org-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 orgName = client.organizationPath(organizationId);

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

createNotificationConfig();

PHP

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

/** Uncomment and populate these variables in your code */
// $organizationId = "{your-org-id}";
// $notificationConfigId = {"your-unique-id"};
// $projectId = "{your-project}"";
// $topicName = "{your-topic}";

$securityCenterClient = new SecurityCenterClient();
$organizationName = $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);

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

Ruby

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

org_path = 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:              org_path,
  config_id:           config_id,
  notification_config: notification_config
)
puts "Created notification config #{config_id}: #{response}."

C#


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

Las notificaciones ahora se publican en el tema Pub/Sub que especificaste. Para publicar notificaciones, Security Command Center usa una cuenta de servicio a nivel de la organización en forma de service-org-organization-id@gcp-sa-scc-notification.iam.gserviceaccount.com con la función securitycenter.notificationServiceAgent. Esta función de cuenta de servicio a nivel de la organización es necesaria para que las notificaciones funcionen.

En los pasos anteriores, creaste una cuenta de servicio de notificaciones a nivel del proyecto en el formato de service-account-id@project-id.iam.gserviceaccount.com o usaste una cuenta de usuario con la herramienta de gcloud. Opcionalmente, puede revocar los permisos que otorgaste a esta cuenta. Para obtener más información, consulta la sección sobre cómo otorgar, cambiar y revocar el acceso a los recursos en la documentación de IAM.

¿Qué sigue?