Membuat dan mengelola Konfigurasi Notifikasi

Halaman ini menjelaskan cara menggunakan fitur notifikasi Security Command Center API, termasuk contoh berikut:

  • Membuat NotificationConfig
  • Dapatkan NotificationConfig
  • Mengupdate NotificationConfig
  • Menghapus NotificationConfig
  • Mencantumkan NotificationConfig
  • Menerima notifikasi Pub/Sub

Atau, pelanggan Security Command Center Premium dapat menyiapkan Ekspor Berkelanjutan untuk Pub/Sub di dasbor Security Command Center.

Sebelum memulai

Untuk menggunakan contoh di halaman ini, Anda harus menyelesaikan panduan untuk Menyiapkan notifikasi temuan.

Untuk menjalankan contoh berikut, Anda memerlukan peran Identity and Access Management (IAM) dengan izin yang sesuai:

  • Buat NotificationConfig: Editor Konfigurasi Notifikasi Pusat Keamanan (roles/securitycenter.notificationConfigEditor)
  • Mendapatkan dan Mencantumkan NotificationConfig: Penampil Konfigurasi Notifikasi Pusat Keamanan (roles/securitycenter.notificationConfigViewer) atau Editor Konfigurasi Notifikasi Pusat Keamanan (roles/securitycenter.notificationConfigEditor)
  • Mengupdate dan Menghapus NotificationConfig: Editor Konfigurasi Notifikasi Pusat Keamanan (roles/securitycenter.notificationConfigEditor)

Untuk memberikan peran yang sesuai kepada akun utama yang mengakses notificationConfig, Anda harus memiliki salah satu peran IAM berikut:

  • Administrator Organisasi (roles/resourcemanager.organizationAdmin)
  • Admin IAM Folder (roles/resourcemanager.folderIamAdmin)
  • Admin IAM Project (roles/resourcemanager.projectIamAdmin)

Peran IAM untuk Security Command Center dapat diberikan di tingkat organisasi, folder, atau project. Kemampuan Anda untuk melihat, mengedit, membuat, atau memperbarui temuan, aset, dan sumber keamanan bergantung pada tingkat akses yang diberikan kepada Anda. Untuk mempelajari peran Security Command Center lebih lanjut, lihat Kontrol akses.

Residensi data dan notifikasi

Jika residensi data diaktifkan untuk Security Command Center, konfigurasi yang menentukan ekspor berkelanjutan ke resource Pub/Sub—notificationConfig—tunduk pada kontrol residensi data dan disimpan di lokasi Security Command Center Anda.

Untuk mengekspor temuan di lokasi Security Command Center ke Pub/Sub, Anda harus mengonfigurasi ekspor berkelanjutan di lokasi Security Command Center yang sama dengan temuan.

Karena filter yang digunakan dalam ekspor berkelanjutan dapat berisi data yang tunduk pada kontrol residensi, pastikan Anda menentukan lokasi yang benar sebelum membuatnya. Security Command Center tidak membatasi lokasi tempat Anda membuat ekspor.

Ekspor berkelanjutan hanya disimpan di lokasi tempatnya dibuat dan tidak dapat dilihat atau diedit di lokasi lain.

Setelah membuat ekspor berkelanjutan, Anda tidak dapat mengubah lokasinya. Untuk mengubah lokasi, Anda harus menghapus ekspor berkelanjutan dan membuatnya ulang di lokasi baru.

Untuk mengambil ekspor berkelanjutan dengan menggunakan panggilan API, Anda harus menentukan lokasi dalam nama resource lengkap notificationConfig. Contoh:

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

Demikian pula, untuk mengambil ekspor berkelanjutan dengan menggunakan gcloud CLI, Anda harus menentukan lokasi dalam nama resource lengkap konfigurasi atau dengan menggunakan flag --locations. Contoh:

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

Membuat NotificationConfig

Untuk membuat NotificationConfig, Anda harus memiliki:

  • Topik Pub/Sub yang sudah ada dan ingin Anda kirimi notifikasi.
  • Peran IAM yang diperlukan untuk akun utama yang membuat notificationConfig.

Untuk mengetahui informasi selengkapnya, lihat langkah untuk Menyiapkan topik Pub/Sub dalam panduan Menyiapkan notifikasi temuan.

Sebelum Anda membuat NotificationConfig, perhatikan bahwa setiap organisasi dapat memiliki file NotificationConfig dalam jumlah terbatas. Untuk informasi selengkapnya, lihat Kuota dan batas.

NotificationConfig menyertakan kolom filter yang membatasi notifikasi hanya untuk peristiwa yang berguna. Kolom ini menerima semua filter yang tersedia di metode findings.list Security Command Center API.

Saat membuat NotificationConfig, Anda menentukan induk untuk NotificationConfig dari hierarki resource Google Cloud, baik organisasi, folder, maupun project. Jika nanti perlu mengambil, memperbarui, atau menghapus NotificationConfig, Anda harus menyertakan ID numerik organisasi, folder, atau project induk saat mereferensikannya.

Untuk membuat NotificationConfig menggunakan bahasa atau platform pilihan Anda:

gcloud

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

Ganti kode berikut:

  • NOTIFICATION_NAME: nama notifikasi. Harus berisi antara 1 hingga 128 karakter dan hanya berisi karakter alfanumerik, garis bawah, atau tanda hubung.
  • PARENT: cakupan dalam hierarki resource tempat notifikasi diterapkan, organization, folder, atau project.
  • PARENT_ID: ID organisasi, folder, atau project induk, yang ditentukan dalam format organizations/123, folders/456, atau projects/789.
  • LOCATION: Jika residensi data diaktifkan, tentukan lokasi Security Command Center untuk membuat notifikasi. Resource notificationConfig yang dihasilkan hanya disimpan di lokasi ini. Hanya temuan yang dikeluarkan di lokasi ini yang dikirim ke Pub/Sub.

    Jika residensi data tidak diaktifkan, menentukan flag --location akan membuat notifikasi menggunakan Security Command Center API v2, dan satu-satunya nilai yang valid untuk flag tersebut adalah global.

  • NOTIFICATION_DESCRIPTION: deskripsi notifikasi yang berisi maksimal 1.024 karakter.

  • PUBSUB_TOPIC: Topik Pub/Sub yang akan menerima notifikasi. Formatnya adalah projects/PROJECT_ID/topics/TOPIC.

  • FILTER: ekspresi yang Anda tentukan untuk memilih temuan yang akan dikirim ke Pub/Sub. Misalnya, state="ACTIVE".

Python

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

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

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.


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

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

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

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

// 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

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

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

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

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#

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.


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

Sekarang notifikasi dipublikasikan ke topik Pub/Sub yang Anda tentukan.

Untuk memublikasikan notifikasi, akun layanan dibuat untuk Anda dalam bentuk service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gserviceaccount.com. Akun layanan ini dibuat saat Anda membuat NotificationConfig pertama dan otomatis diberi peran securitycenter.notificationServiceAgent berdasarkan kebijakan IAM untuk PUBSUB_TOPIC saat membuat konfigurasi notifikasi. Peran akun layanan ini diperlukan agar notifikasi dapat berfungsi.

Mendapatkan NotificationConfig

Untuk mendapatkan NotificationConfig, Anda harus memiliki peran IAM yang menyertakan izin securitycenter.notification.get.

gcloud

gcloud scc notifications describe PARENT_TYPE/PARENT_ID/locations/LOCATION/notificationConfigs/NOTIFICATION_NAME

Ganti kode berikut:

  • PARENT_TYPE dengan organizations, folders, atau projects, bergantung pada level hierarki resource yang ditentukan dalam konfigurasi notifikasi.
  • PARENT_ID dengan ID numerik resource induk.
  • LOCATION: diperlukan jika residensi data diaktifkan atau resource notificationConfig dibuat menggunakan API v2.

    Jika residensi data diaktifkan, tentukan lokasi Security Command Center tempat notifikasi disimpan.

    Jika residensi data tidak diaktifkan, sertakan /locations/LOCATION hanya jika resource notificationConfig dibuat menggunakan Security Command Center API v2. Dalam hal ini, satu-satunya lokasi yang valid adalah global.

  • NOTIFICATION_NAME: nama notifikasi.

Python

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

def get_notification_config(parent_id, notification_config_id):
    """
    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"
    """
    from google.cloud import securitycenter as securitycenter

    client = securitycenter.SecurityCenterClient()

    notification_config_name = (
        f"{parent_id}/notificationConfigs/{notification_config_id}"
    )

    notification_config = client.get_notification_config(
        request={"name": notification_config_name}
    )
    print(f"Got notification config: {notification_config}")

Java

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.


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

public class GetNotificationConfigSnippets {

  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}";

    getNotificationConfig(parentId, notificationConfigId);
  }

  // Retrieve an existing notification config.
  public static NotificationConfig getNotificationConfig(
      String parentId, 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()) {
      NotificationConfig response =
          client.getNotificationConfig(String.format("%s/notificationConfigs/%s",
              parentId, notificationConfigId));

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

Go

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

import (
	"context"
	"fmt"
	"io"

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

func getNotificationConfig(w io.Writer, orgID string, notificationConfigID string) error {
	// orgID := "your-org-id"
	// 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()

	// Parent must be in one of the following formats:
	//		"organizations/{orgId}"
	//		"projects/{projectId}"
	//		"folders/{folderId}"
	parent := fmt.Sprintf("organizations/%s", orgID)
	req := &securitycenterpb.GetNotificationConfigRequest{
		Name: fmt.Sprintf("%s/notificationConfigs/%s", parent, notificationConfigID),
	}

	notificationConfig, err := client.GetNotificationConfig(ctx, req)
	if err != nil {
		return fmt.Errorf("Failed to retrieve notification config: %w", err)
	}
	fmt.Fprintln(w, "Received config: ", notificationConfig)

	return nil
}

Node.js

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

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

const client = new SecurityCenterClient();

// formattedConfigName: You can also use
//    `client.projectNotificationConfigPath(projectId, configId)` or
//    `client.folderNotificationConfigPath(folderId, configId)`.
// configId = "your-config-id";
const formattedConfigName = client.organizationNotificationConfigPath(
  organizationId,
  configId
);

async function getNotificationConfg() {
  const [response] = await client.getNotificationConfig({
    name: formattedConfigName,
  });
  console.log('Notification config: ', response);
}

getNotificationConfg();

PHP

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

use Google\Cloud\SecurityCenter\V1\Client\SecurityCenterClient;
use Google\Cloud\SecurityCenter\V1\GetNotificationConfigRequest;

/**
 * @param string $organizationId        Your org ID
 * @param string $notificationConfigId  A unique identifier
 */
function get_notification(string $organizationId, string $notificationConfigId): void
{
    $securityCenterClient = new SecurityCenterClient();
    $notificationConfigName = $securityCenterClient::notificationConfigName(
        // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
        $organizationId,
        $notificationConfigId
    );
    $getNotificationConfigRequest = (new GetNotificationConfigRequest())
        ->setName($notificationConfigName);

    $response = $securityCenterClient->getNotificationConfig($getNotificationConfigRequest);
    printf('Notification config was retrieved: %s' . PHP_EOL, $response->getName());
}

Ruby

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

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"

client = Google::Cloud::SecurityCenter.security_center

# You can also use 'project_id' or 'folder_id' as a parent.
config_path = client.notification_config_path organization:        org_id,
                                              notification_config: config_id

response = client.get_notification_config name: config_path
puts "Notification config fetched: #{response}"

C#

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.


using Google.Cloud.SecurityCenter.V1;
using System;

/// <summary>Snippet for GetNotificationConfig</summary>
public class GetNotificationConfigSnippets
{
    public static NotificationConfig GetNotificationConfig(string organizationId, string configId)
    {
        SecurityCenterClient client = SecurityCenterClient.Create();
        // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
        NotificationConfigName notificationConfigName = new NotificationConfigName(organizationId, configId);

        NotificationConfig response = client.GetNotificationConfig(notificationConfigName);
        Console.WriteLine($"Notification config: {response}");
        return response;
    }
}

Memperbarui NotificationConfig

Untuk memperbarui NotificationConfig, Anda harus memiliki peran IAM yang menyertakan izin securitycenter.notification.update.

Saat Anda memperbarui menggunakan mask kolom, hanya kolom yang Anda tentukan yang akan diperbarui. Jika Anda tidak menggunakan mask kolom, semua kolom yang dapat diubah di NotificationConfig akan diganti dengan nilai baru. Anda dapat menggunakan mask kolom untuk mengupdate topik dan deskripsi Pub/Sub.

Untuk menyelesaikan contoh ini, Anda harus berlangganan topik baru, dan akun layanan notifikasi Anda harus memiliki izin pubsub.topics.setIamPolicy terkait topik tersebut.

Setelah Anda memberikan izin yang diperlukan, perbarui deskripsi NotificationConfig, topik Pub/Sub, dan filter menggunakan bahasa pilihan Anda:

gcloud

gcloud scc notifications update PARENT_TYPE/PARENT_ID/locations/LOCATION/notificationConfigs/NOTIFICATION_NAME
--description="NOTIFICATION_DESCRIPTION" \
--pubsub-topic=PUBSUB_TOPIC \
--filter="FILTER"

Ganti kode berikut:

  • PARENT_TYPE dengan organizations, folders, atau projects, bergantung pada level hierarki resource yang ditentukan dalam konfigurasi notifikasi.
  • PARENT_ID dengan ID numerik resource induk.
  • LOCATION: diperlukan jika residensi data diaktifkan atau notificationConfig dibuat menggunakan API v2.

    Jika residensi data diaktifkan, tentukan lokasi Security Command Center tempat notifikasi disimpan.

    Jika residensi data tidak diaktifkan, sertakan /locations/LOCATION dalam nama lengkap atau tentukan flag --location hanya jika resource notificationConfig dibuat menggunakan Security Command Center API v2. Dalam hal ini, satu-satunya lokasi yang valid adalah global.

  • NOTIFICATION_NAME: nama notifikasi.

  • NOTIFICATION_DESCRIPTION: deskripsi notifikasi yang berisi maksimal 1.024 karakter.

  • PUBSUB_TOPIC: topik Pub/Sub yang akan menerima notifikasi. Formatnya adalah projects/PROJECT_ID/topics/TOPIC.

  • FILTER: ekspresi yang Anda tentukan untuk memilih temuan yang akan dikirim ke Pub/Sub. Misalnya, state="ACTIVE".

Python

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

def update_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: "config-id-to-update"
        pubsub_topic: "projects/{new-project}/topics/{new-topic}"

    If updating a pubsub_topic, ensure this ServiceAccount has the
    "pubsub.topics.setIamPolicy" permission on the new topic.
    """
    from google.cloud import securitycenter as securitycenter
    from google.protobuf import field_mask_pb2

    client = securitycenter.SecurityCenterClient()

    notification_config_name = (
        f"{parent_id}/notificationConfigs/{notification_config_id}"
    )

    updated_description = "New updated description"
    updated_filter = 'state = "INACTIVE"'

    # Only description and pubsub_topic can be updated.
    field_mask = field_mask_pb2.FieldMask(
        paths=["description", "pubsub_topic", "streaming_config.filter"]
    )

    updated_notification_config = client.update_notification_config(
        request={
            "notification_config": {
                "name": notification_config_name,
                "description": updated_description,
                "pubsub_topic": pubsub_topic,
                "streaming_config": {"filter": updated_filter},
            },
            "update_mask": field_mask,
        }
    )

    print(updated_notification_config)

Java

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.


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

public class UpdateNotificationConfigSnippets {

  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}";

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

  // Update an existing notification config.
  // If updating a Pubsub Topic, ensure the ServiceAccount has the
  // "pubsub.topics.setIamPolicy" permission on the new topic.
  public static NotificationConfig updateNotificationConfig(
      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()) {

      String notificationConfigName =
          String.format(
              "%s/notificationConfigs/%s", parentId, notificationConfigId);

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

      NotificationConfig configToUpdate =
          NotificationConfig.newBuilder()
              .setName(notificationConfigName)
              .setDescription("updated description")
              .setPubsubTopic(pubsubTopic)
              .setStreamingConfig(StreamingConfig.newBuilder().setFilter("state = \"ACTIVE\""))
              .build();

      FieldMask fieldMask =
          FieldMask.newBuilder()
              .addPaths("description")
              .addPaths("pubsub_topic")
              .addPaths("streaming_config.filter")
              .build();

      NotificationConfig updatedConfig = client.updateNotificationConfig(configToUpdate, fieldMask);

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

Go

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

import (
	"context"
	"fmt"
	"io"

	securitycenter "cloud.google.com/go/securitycenter/apiv1"
	"cloud.google.com/go/securitycenter/apiv1/securitycenterpb"
	"google.golang.org/genproto/protobuf/field_mask"
)

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

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

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

	updatedDescription := "Updated sample config"
	updatedFilter := `state = "INACTIVE"`
	// Parent must be in one of the following formats:
	//		"organizations/{orgId}"
	//		"projects/{projectId}"
	//		"folders/{folderId}"
	parent := fmt.Sprintf("organizations/%s", orgID)
	req := &securitycenterpb.UpdateNotificationConfigRequest{
		NotificationConfig: &securitycenterpb.NotificationConfig{
			Name:        fmt.Sprintf("%s/notificationConfigs/%s", parent, notificationConfigID),
			Description: updatedDescription,
			PubsubTopic: updatedPubsubTopic,
			NotifyConfig: &securitycenterpb.NotificationConfig_StreamingConfig_{
				StreamingConfig: &securitycenterpb.NotificationConfig_StreamingConfig{
					Filter: updatedFilter,
				},
			},
		},
		UpdateMask: &field_mask.FieldMask{
			Paths: []string{"description", "pubsub_topic", "streaming_config.filter"},
		},
	}

	notificationConfig, err := client.UpdateNotificationConfig(ctx, req)
	if err != nil {
		return fmt.Errorf("Failed to update notification config: %w", err)
	}

	fmt.Fprintln(w, "Updated NotificationConfig: ", notificationConfig)

	return nil
}

Node.js

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

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

const client = new SecurityCenterClient();

// formattedConfigName: You can also use
//    `client.projectNotificationConfigPath(projectId, configId)` or
//    `client.folderNotificationConfigPath(folderId, configId)`.
// configId = "your-config-id";
const formattedConfigName = client.organizationNotificationConfigPath(
  organizationId,
  configId
);

// pubsubTopic = "projects/{your-project}/topics/{your-topic}";
// Ensure this Service Account has the "pubsub.topics.setIamPolicy" permission on this topic.

async function updateNotificationConfig() {
  const [response] = await client.updateNotificationConfig({
    updateMask: {
      paths: ['description', 'pubsub_topic', 'streaming_config.filter'],
    },
    notificationConfig: {
      name: formattedConfigName,
      description: 'Updated config description',
      pubsubTopic: pubsubTopic,
      streamingConfig: {filter: 'state = "INACTIVE"'},
    },
  });
  console.log('notification config update succeeded: ', response);
}

updateNotificationConfig();

PHP

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

use Google\Cloud\SecurityCenter\V1\Client\SecurityCenterClient;
use Google\Cloud\SecurityCenter\V1\NotificationConfig;
use Google\Cloud\SecurityCenter\V1\NotificationConfig\StreamingConfig;
use Google\Cloud\SecurityCenter\V1\UpdateNotificationConfigRequest;
use Google\Protobuf\FieldMask;

/**
 * @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 update_notification(
    string $organizationId,
    string $notificationConfigId,
    string $projectId,
    string $topicName
): void {
    $securityCenterClient = new SecurityCenterClient();

    // Ensure this ServiceAccount has the 'pubsub.topics.setIamPolicy' permission on the topic.
    // https://cloud.google.com/pubsub/docs/reference/rest/v1/projects.topics/setIamPolicy
    $pubsubTopic = $securityCenterClient::topicName($projectId, $topicName);
    // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
    $notificationConfigName = $securityCenterClient::notificationConfigName($organizationId, $notificationConfigId);

    $streamingConfig = (new StreamingConfig())->setFilter('state = "ACTIVE"');
    $fieldMask = (new FieldMask())->setPaths(['description', 'pubsub_topic', 'streaming_config.filter']);
    $notificationConfig = (new NotificationConfig())
        ->setName($notificationConfigName)
        ->setDescription('Updated description.')
        ->setPubsubTopic($pubsubTopic)
        ->setStreamingConfig($streamingConfig);
    $updateNotificationConfigRequest = (new UpdateNotificationConfigRequest())
        ->setNotificationConfig($notificationConfig);

    $response = $securityCenterClient->updateNotificationConfig($updateNotificationConfigRequest);
    printf('Notification config was updated: %s' . PHP_EOL, $response->getName());
}

Ruby

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

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"

# Updated description of the notification config.
# description = "YOUR_DESCRIPTION"

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

# Updated filter string for Notification config.
# filter = "UPDATED_FILTER"

client = Google::Cloud::SecurityCenter.security_center

# You can also use 'project_id' or 'folder_id' as a parent.
config_path = client.notification_config_path organization:        org_id,
                                              notification_config: config_id
notification_config = { name: config_path }
notification_config[:description] = description unless description.nil?
notification_config[:pubsub_topic] = pubsub_topic unless pubsub_topic.nil?
notification_config[:streaming_config][:filter] = filter unless filter.nil?

paths = []
paths.push "description" unless description.nil?
paths.push "pubsub_topic" unless pubsub_topic.nil?
paths.push "streaming_config.filter" unless filter.nil?
update_mask = { paths: paths }

response = client.update_notification_config(
  notification_config: notification_config,
  update_mask:         update_mask
)
puts response

C#

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.


using Google.Cloud.SecurityCenter.V1;
using static Google.Cloud.SecurityCenter.V1.NotificationConfig.Types;
using Google.Protobuf.WellKnownTypes;
using System;

/// <summary>Snippet for UpdateNotificationConfig</summary>
public class UpdateNotificationConfigSnippets
{
    public static NotificationConfig UpdateNotificationConfig(
        string organizationId, string notificationConfigId, string projectId, string topicName)
    {
        // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
        NotificationConfigName notificationConfigName = new NotificationConfigName(organizationId, notificationConfigId);
        TopicName pubsubTopic = new TopicName(projectId, topicName);

        NotificationConfig configToUpdate = new NotificationConfig
        {
            NotificationConfigName = notificationConfigName,
            Description = "updated description",
            PubsubTopicAsTopicName = pubsubTopic,
            StreamingConfig = new StreamingConfig { Filter = "state = \"INACTIVE\"" }
        };

        FieldMask fieldMask = new FieldMask { Paths = { "description", "pubsub_topic", "streaming_config.filter" } };
        SecurityCenterClient client = SecurityCenterClient.Create();
        NotificationConfig updatedConfig = client.UpdateNotificationConfig(configToUpdate, fieldMask);

        Console.WriteLine($"Notification config updated: {updatedConfig}");
        return updatedConfig;
    }
}

Menghapus NotificationConfig

Untuk menghapus NotificationConfig, Anda harus memiliki peran IAM yang menyertakan izin securitycenter.notification.delete.

Saat Anda menghapus NotificationConfig, peran securitycenter.notificationServiceAgent tetap berada di topik Pub/Sub. Jika Anda tidak menggunakan topik Pub/Sub di NotificationConfig lainnya, hapus peran dari topik. Untuk mengetahui informasi selengkapnya, lihat kontrol akses.

Hapus NotificationConfig menggunakan bahasa pilihan Anda:

gcloud

gcloud scc notifications delete PARENT_TYPE/PARENT_ID/locations/LOCATION/notificationConfigs/NOTIFICATION_NAME

Ganti kode berikut:

  • PARENT_TYPE dengan organizations, folders, atau projects, bergantung pada level hierarki resource yang ditentukan dalam konfigurasi notifikasi.
  • PARENT_ID dengan ID numerik resource induk.
  • LOCATION: diperlukan jika residensi data diaktifkan atau notificationConfig dibuat menggunakan API v2.

    Jika residensi data diaktifkan, tentukan lokasi Security Command Center tempat notifikasi disimpan.

    Jika residensi data tidak diaktifkan, sertakan /locations/LOCATION dalam nama lengkap atau tentukan flag --location hanya jika notificationConfig dibuat menggunakan Security Command Center API v2. Dalam hal ini, satu-satunya lokasi yang valid adalah global.

  • NOTIFICATION_NAME: nama notifikasi.

Python

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

def delete_notification_config(parent_id, notification_config_id):
    """
    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"
    """
    from google.cloud import securitycenter as securitycenter

    client = securitycenter.SecurityCenterClient()

    notification_config_name = (
        f"{parent_id}/notificationConfigs/{notification_config_id}"
    )

    client.delete_notification_config(request={"name": notification_config_name})
    print(f"Deleted notification config: {notification_config_name}")

Java

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.


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

public class DeleteNotificationConfigSnippets {

  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}";

    deleteNotificationConfig(parentId, notificationConfigId);
  }

  // Delete a notification config.
  public static boolean deleteNotificationConfig(String parentId, 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()) {

      client.deleteNotificationConfig(String.format("%s/notificationConfigs/%s",
          parentId, notificationConfigId));

      System.out.printf("Deleted Notification config: %s%n", notificationConfigId);
    }
    return true;
  }
}

Go

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

import (
	"context"
	"fmt"
	"io"

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

func deleteNotificationConfig(w io.Writer, orgID string, notificationConfigID string) error {
	// orgID := "your-org-id"
	// notificationConfigID := "config-to-delete"

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

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

	// Parent must be in one of the following formats:
	//		"organizations/{orgId}"
	//		"projects/{projectId}"
	//		"folders/{folderId}"
	parent := fmt.Sprintf("organizations/%s", orgID)
	name := fmt.Sprintf("%s/notificationConfigs/%s", parent, notificationConfigID)
	req := &securitycenterpb.DeleteNotificationConfigRequest{
		Name: name,
	}

	if err = client.DeleteNotificationConfig(ctx, req); err != nil {
		return fmt.Errorf("Failed to retrieve notification config: %w", err)
	}
	fmt.Fprintln(w, "Deleted config: ", name)

	return nil
}

Node.js

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

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

const client = new SecurityCenterClient();

// formattedConfigName: You can also use
//    `client.projectNotificationConfigPath(projectId, configId)` or
//    `client.folderNotificationConfigPath(folderId, configId)`.
// configId = "your-config-id";
const formattedConfigName = client.organizationNotificationConfigPath(
  organizationId,
  configId
);

async function deleteNotificationConfg() {
  await client.deleteNotificationConfig({name: formattedConfigName});
  console.log('Notification config deleted: ', formattedConfigName);
}

deleteNotificationConfg();

PHP

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

use Google\Cloud\SecurityCenter\V1\Client\SecurityCenterClient;
use Google\Cloud\SecurityCenter\V1\DeleteNotificationConfigRequest;

/**
 * @param string $organizationId        Your org ID
 * @param string $notificationConfigId  A unique identifier
 */
function delete_notification(string $organizationId, string $notificationConfigId): void
{
    $securityCenterClient = new SecurityCenterClient();
    $notificationConfigName = $securityCenterClient::notificationConfigName(
        // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
        $organizationId,
        $notificationConfigId
    );
    $deleteNotificationConfigRequest = (new DeleteNotificationConfigRequest())
        ->setName($notificationConfigName);

    $securityCenterClient->deleteNotificationConfig($deleteNotificationConfigRequest);
    print('Notification config was deleted' . PHP_EOL);
}

Ruby

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

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"

client = Google::Cloud::SecurityCenter.security_center

# You can also use 'project_id' or 'folder_id' as a parent.
config_path = client.notification_config_path organization:        org_id,
                                              notification_config: config_id

response = client.delete_notification_config name: config_path
puts "Deleted notification config #{config_id} with response: #{response}"

C#

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.


using Google.Cloud.SecurityCenter.V1;
using System;

/// <summary>Snippet for DeleteNotificationConfig</summary>
public class DeleteNotificationConfigSnippets
{
    public static bool DeleteNotificationConfig(string organizationId, string notificationConfigId)
    {
        // You can also use 'projectId' or 'folderId' instead of the 'organizationId'.
        NotificationConfigName notificationConfigName = new NotificationConfigName(organizationId, notificationConfigId);
        SecurityCenterClient client = SecurityCenterClient.Create();

        client.DeleteNotificationConfig(notificationConfigName);
        Console.WriteLine($"Deleted Notification config: {notificationConfigName}");
        return true;
    }
}

Mencantumkan NotificationConfig

Untuk mencantumkan NotificationConfigs, Anda harus memiliki peran IAM yang menyertakan izin securitycenter.notification.list.

Semua daftar Security Command Center API telah diberi nomor halaman. Setiap respons menampilkan halaman hasil dan token untuk menampilkan halaman berikutnya. pageSize default adalah 10. Anda dapat mengonfigurasi ukuran halaman hingga minimum 1 dan maksimum 1.000.

Cantumkan NotificationConfigs menggunakan bahasa pilihan Anda:

gcloud

gcloud scc notifications list PARENT_TYPE/PARENT_ID/locations/LOCATION

Ganti kode berikut:

  • PARENT_TYPE dengan organizations, folders, atau projects, bergantung pada cakupan tempat Anda perlu mencantumkan notifikasi.
  • PARENT_ID dengan ID numerik resource induk.
  • LOCATION: diperlukan jika residensi data diaktifkan atau resource notificationConfig dibuat menggunakan API v2.

    Jika residensi data diaktifkan, tentukan lokasi Security Command Center tempat notifikasi disimpan.

    Jika residensi data tidak diaktifkan, menyertakan /locations/LOCATION dalam nama atau flag --location dalam perintah hanya mencantumkan resource notificationConfig yang dibuat menggunakan Security Command Center API v2 dan satu-satunya lokasi yang valid adalah global.

Python

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

def list_notification_configs(parent_id):
    """
    Args:
        parent_id: must be in one of the following formats:
            "organizations/{organization_id}"
            "projects/{project_id}"
            "folders/{folder_id}"
    """
    from google.cloud import securitycenter as securitycenter

    client = securitycenter.SecurityCenterClient()

    notification_configs_iterator = client.list_notification_configs(
        request={"parent": parent_id}
    )
    for i, config in enumerate(notification_configs_iterator):
        print(f"{i}: notification_config: {config}")

Java

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.


import com.google.cloud.securitycenter.v1.NotificationConfig;
import com.google.cloud.securitycenter.v1.SecurityCenterClient;
import com.google.cloud.securitycenter.v1.SecurityCenterClient.ListNotificationConfigsPagedResponse;
import com.google.common.collect.ImmutableList;
import java.io.IOException;

public class ListNotificationConfigSnippets {

  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");

    listNotificationConfigs(parentId);
  }

  // List notification configs present in the given parent.
  public static ImmutableList<NotificationConfig> listNotificationConfigs(String parentId)
      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()) {

      ListNotificationConfigsPagedResponse response = client.listNotificationConfigs(parentId);

      ImmutableList<NotificationConfig> notificationConfigs =
          ImmutableList.copyOf(response.iterateAll());

      System.out.printf("List notifications response: %s%n", response.getPage().getValues());
      return notificationConfigs;
    }
  }
}

Go

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

import (
	"context"
	"fmt"
	"io"

	securitycenter "cloud.google.com/go/securitycenter/apiv1"
	"cloud.google.com/go/securitycenter/apiv1/securitycenterpb"
	"google.golang.org/api/iterator"
)

func listNotificationConfigs(w io.Writer, orgID string) error {
	// orgId := "your-org-id"

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

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

	req := &securitycenterpb.ListNotificationConfigsRequest{
		// Parent must be in one of the following formats:
		//		"organizations/{orgId}"
		//		"projects/{projectId}"
		//		"folders/{folderId}"
		Parent: fmt.Sprintf("organizations/%s", orgID),
	}
	it := client.ListNotificationConfigs(ctx, req)
	for {
		result, err := it.Next()
		if err == iterator.Done {
			break
		}

		if err != nil {
			return fmt.Errorf("it.Next: %w", err)
		}

		fmt.Fprintln(w, "NotificationConfig: ", result)
	}

	return nil
}

Node.js

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

// 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}`
const parent = `organizations/${organizationId}`;

async function listNotificationConfigs() {
  const [resources] = await client.listNotificationConfigs({parent: parent});
  console.log('Received Notification configs: ');
  for (const resource of resources) {
    console.log(resource);
  }
}

listNotificationConfigs();

PHP

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

use Google\Cloud\SecurityCenter\V1\Client\SecurityCenterClient;
use Google\Cloud\SecurityCenter\V1\ListNotificationConfigsRequest;

/**
 * @param string $organizationId        Your org ID
 */
function list_notification(string $organizationId): void
{
    $securityCenterClient = new SecurityCenterClient();
    // 'parent' must be in one of the following formats:
    //		"organizations/{orgId}"
    //		"projects/{projectId}"
    //		"folders/{folderId}"
    $parent = $securityCenterClient::organizationName($organizationId);
    $listNotificationConfigsRequest = (new ListNotificationConfigsRequest())
        ->setParent($parent);

    foreach ($securityCenterClient->listNotificationConfigs($listNotificationConfigsRequest) as $element) {
        printf('Found notification config %s' . PHP_EOL, $element->getName());
    }

    print('Notification configs were listed' . PHP_EOL);
}

Ruby

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.

require "google/cloud/security_center"

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

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

client.list_notification_configs(parent: parent).each_page do |page|
  page.each do |element|
    puts element
  end
end

C#

Contoh berikut menggunakan API v1. Guna memodifikasi contoh untuk v2, ganti v1 dengan v2 dan tambahkan /locations/LOCATION ke nama resource.

Untuk sebagian besar resource, tambahkan /locations/LOCATION ke nama resource setelah /PARENT/PARENT_ID, dengan PARENT adalah organizations, folders, atau projects.

Untuk temuan, tambahkan /locations/LOCATION ke nama resource setelah /sources/SOURCE_ID, dengan SOURCE_ID adalah ID layanan Security Command Center yang mengeluarkan temuan tersebut.


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

/// <summary>Snippet for ListNotificationConfig</summary>
public class ListNotificationConfigSnippets
{
    public static PagedEnumerable<ListNotificationConfigsResponse, NotificationConfig> ListNotificationConfigs(string organizationId)
    {
        // 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);
        SecurityCenterClient client = SecurityCenterClient.Create();
        PagedEnumerable<ListNotificationConfigsResponse, NotificationConfig> notificationConfigs = client.ListNotificationConfigs(orgName);

        // Print Notification Configuration names.
        foreach (var config in notificationConfigs)
        {
            Console.WriteLine(config.NotificationConfigName);
        }
        return notificationConfigs;
    }
}

Menerima notifikasi Pub/Sub

Bagian ini memberikan contoh pesan notifikasi dan contoh yang menunjukkan cara mengonversi pesan Pub/Sub menjadi NotificationMessage yang berisi temuan.

Notifikasi dipublikasikan ke Pub/Sub dalam format JSON. Berikut adalah contoh pesan notifikasi:

{
   "notificationConfigName": "organizations/ORGANIZATION_ID/notificationConfigs/CONFIG_ID",
   "finding": {
     "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
     "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
     "state": "ACTIVE",
     "category": "TEST-CATEGORY",
     "securityMarks": {
       "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID/securityMarks"
     },
     "eventTime": "2019-07-26T07:32:37Z",
     "createTime": "2019-07-29T18:45:27.243Z"
   }
 }

Konversi pesan Pub/Sub menjadi NotificationMessage menggunakan bahasa pilihan Anda:

gcloud

Gcloud CLI tidak mendukung konversi pesan Pub/Sub menjadi NotificationMessage. Anda dapat menggunakan gcloud CLI untuk mendapatkan NotificationMessage dan mencetak JSON langsung di terminal:

  # The subscription used to receive published messages from a topic
  PUBSUB_SUBSCRIPTION="projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID"

  gcloud pubsub subscriptions pull $PUBSUB_SUBSCRIPTION

Ganti kode berikut:

  • PROJECT_ID dengan ID project Anda.
  • SUBSCRIPTION_ID dengan ID langganan Anda.

Python

# Requires https://cloud.google.com/pubsub/docs/quickstart-client-libraries#pubsub-client-libraries-python
import concurrent

from google.cloud import pubsub_v1
from google.cloud.securitycenter_v1 import NotificationMessage

# TODO: project_id = "your-project-id"
# TODO: subscription_name = "your-subscription-name"

def callback(message):
    # Print the data received for debugging purpose if needed
    print(f"Received message: {message.data}")

    notification_msg = NotificationMessage.from_json(message.data)

    print(
        "Notification config name: {}".format(
            notification_msg.notification_config_name
        )
    )
    print(f"Finding: {notification_msg.finding}")

    # Ack the message to prevent it from being pulled again
    message.ack()

subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(project_id, subscription_name)

streaming_pull_future = subscriber.subscribe(subscription_path, callback=callback)

print(f"Listening for messages on {subscription_path}...\n")
try:
    streaming_pull_future.result(timeout=1)  # Block for 1 second
except concurrent.futures.TimeoutError:
    streaming_pull_future.cancel()

Java


import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.cloud.securitycenter.v1.NotificationMessage;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class NotificationReceiver {

  private NotificationReceiver() {
  }

  public static void receiveNotificationMessages(String projectId, String subscriptionId) {
    // String projectId = "{your-project}";
    // String subscriptionId = "{your-subscription}";
    ProjectSubscriptionName subscriptionName =
        ProjectSubscriptionName.of(projectId, subscriptionId);

    try {
      Subscriber subscriber =
          Subscriber.newBuilder(subscriptionName, new NotificationMessageReceiver()).build();
      subscriber.startAsync().awaitRunning();

      // This sets the timeout value of the subscriber to 10s.
      subscriber.awaitTerminated(10_000, TimeUnit.MILLISECONDS);
    } catch (IllegalStateException | TimeoutException e) {
      System.out.println("Subscriber stopped: " + e);
    }
  }

  static class NotificationMessageReceiver implements MessageReceiver {

    @Override
    public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
      NotificationMessage.Builder notificationMessageBuilder = NotificationMessage.newBuilder();

      try {
        String jsonString = message.getData().toStringUtf8();
        JsonFormat.parser().merge(jsonString, notificationMessageBuilder);

        NotificationMessage notificationMessage = notificationMessageBuilder.build();
        System.out.println(
            String.format("Config id: %s", notificationMessage.getNotificationConfigName()));
        System.out.println(String.format("Finding: %s", notificationMessage.getFinding()));
      } catch (InvalidProtocolBufferException e) {
        System.out.println("Could not parse message: " + e);
      } finally {
        consumer.ack();
      }
    }
  }
}

Go

import (
	"bytes"
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsub"
	"cloud.google.com/go/securitycenter/apiv1/securitycenterpb"
	"github.com/golang/protobuf/jsonpb"
)

func receiveMessages(w io.Writer, projectID string, subscriptionName string) error {
	// projectID := "your-project-id"
	// subsriptionName := "your-subscription-name"

	ctx := context.Background()

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

	sub := client.Subscription(subscriptionName)
	cctx, cancel := context.WithCancel(ctx)
	err = sub.Receive(cctx, func(ctx context.Context, msg *pubsub.Message) {
		var notificationMessage = new(securitycenterpb.NotificationMessage)
		jsonpb.Unmarshal(bytes.NewReader(msg.Data), notificationMessage)

		fmt.Fprintln(w, "Got finding: ", notificationMessage.GetFinding())
		msg.Ack()
		cancel()
	})
	if err != nil {
		return fmt.Errorf("Receive: %w", err)
	}

	return nil
}

Node.js

const {PubSub} = require('@google-cloud/pubsub');
const {StringDecoder} = require('string_decoder');

// projectId = 'your-project-id'
// subscriptionId = 'your-subscription-id'

const subscriptionName =
  'projects/' + projectId + '/subscriptions/' + subscriptionId;
const pubSubClient = new PubSub();

function listenForMessages() {
  const subscription = pubSubClient.subscription(subscriptionName);

  // message.data is a buffer array of json
  // 1. Convert buffer to normal string
  // 2. Convert json to NotificationMessage object
  const messageHandler = message => {
    const jsonString = new StringDecoder('utf-8').write(message.data);
    const parsedNotificationMessage = JSON.parse(jsonString);

    console.log(parsedNotificationMessage);
    console.log(parsedNotificationMessage.finding);

    // ACK when done with message
    message.ack();
  };

  subscription.on('message', messageHandler);

  // Set timeout to 10 seconds
  setTimeout(() => {
    subscription.removeListener('message', messageHandler);
  }, 10000);
}

listenForMessages();

PHP

use Google\Cloud\PubSub\PubSubClient;

/**
 * @param string $projectId             Your Cloud Project ID
 * @param string $subscriptionId        Your subscription ID
 */
function receive_notification(string $projectId, string $subscriptionId): void
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionId);

    foreach ($subscription->pull() as $message) {
        printf('Message: %s' . PHP_EOL, $message->data());
        // Acknowledge the Pub/Sub message has been received, so it will not be pulled multiple times.
        $subscription->acknowledge($message);
    }
}

Langkah selanjutnya