Pub/Sub-Benachrichtigungen konfigurieren

In diesem Dokument wird beschrieben, wie Sie Benachrichtigungen für Aktualisierungen von Hinweisen und Vorkommen einrichten.

Artefaktanalyse stellt Benachrichtigungen über Pub/Sub für Sicherheitslücken bereit, die durch automatisiertes Scannen gefunden wurden, sowie für andere Metadaten. Wenn ein Hinweis oder ein Vorkommen erstellt oder aktualisiert wird, wird für jede API-Version eine Nachricht an das entsprechende Thema veröffentlicht. Verwenden Sie das Thema für die API-Version, die Sie verwenden.

Hinweis

  1. Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Enable the Container Analysis API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  4. Installieren Sie die Google Cloud CLI.

  5. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  6. Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  8. Enable the Container Analysis API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  9. Installieren Sie die Google Cloud CLI.

  10. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  11. Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  12. Informationen zum Einrichten der Zugriffssteuerung für Metadaten in Ihrem Projekt Überspringen Sie diesen Schritt, wenn Sie nur Metadaten aus Vorkommen verwenden, die durch das Scannen von Artefaktanalyse-Containern erstellt wurden.

Pub/Sub-Themen erstellen

Nachdem Sie die Artifact Analysis API aktiviert haben, werden automatisch Pub/Sub-Themen mit den folgenden Themen-IDs erstellt:

  • container-analysis-notes-v1
  • container-analysis-occurrences-v1

Wenn die Themen versehentlich gelöscht wurden oder fehlen, können Sie sie selbst hinzufügen. Die Themen fehlen möglicherweise, wenn Ihre Google CloudOrganisation eine Einschränkung der Organisationsrichtlinie hat, die eine Verschlüsselung mit kundenverwalteten Verschlüsselungsschlüsseln (CMEK) erfordert. Wenn die Pub/Sub API in der Ablehnungsliste dieser Einschränkung enthalten ist, können Dienste keine Themen mitGoogle-owned and Google-managed encryption keysautomatisch erstellen.

So erstellen Sie die Themen mit Google-owned and Google-managed encryption keys:

Console

  1. Rufen Sie in der Google Cloud Console die Seite „Pub/Sub-Themen“ auf.

    Seite "Pub/Sub-Themen" öffnen

  2. Klicken Sie auf Thema erstellen.

  3. Geben Sie eine Themen-ID ein:

    container-analysis-notes-v1
    

    damit der Name mit dem URI übereinstimmt:

    projects/PROJECT_ID/topics/container-analysis-notes-v1
    

    Dabei ist PROJECT_ID die Google Cloud Projekt-ID.

  4. Klicken Sie auf Erstellen.

  5. Geben Sie eine Themen-ID ein:

    container-analysis-occurrences-v1
    

    damit der Name mit dem URI übereinstimmt:

    projects/PROJECT_ID/topics/container-analysis-occurrences-v1
    

gcloud

Führen Sie die folgenden Befehle in der Shell oder im Terminalfenster aus:

gcloud pubsub topics create projects/PROJECT_ID/topics/container-analysis-notes-v1
gcloud pubsub topics create projects/PROJECT_ID/topics/container-analysis-occurrences-v1

Weitere Informationen zum Befehl gcloud pubsub topics finden Sie in der topics-Dokumentation.

Informationen zum Erstellen der Themen mit CMEK-Verschlüsselung finden Sie in der Pub/Sub-Dokumentation unter Themen verschlüsseln.

Bei jedem Erstellen oder Aktualisieren einer Notiz oder eines Vorkommens wird im entsprechenden Thema eine Nachricht veröffentlicht. Sie müssen jedoch auch ein Pub/Sub-Abo erstellen, um auf Ereignisse zu warten und Nachrichten vom Pub/Sub-Dienst zu empfangen.

Pub/Sub-Abos erstellen

Damit Sie Ereignisse erhalten, erstellen Sie ein mit dem Thema verknüpftes Pub/Sub-Abo:

Console

  1. Rufen Sie in derGoogle Cloud Console die Seite „Pub/Sub-Abos“ auf.

    Seite „Pub/Sub-Abos“ öffnen

  2. Klicken Sie auf Abo erstellen.

  3. Geben Sie einen Namen für das Abo ein. Beispiel: Hinweise.

  4. Geben Sie den URI des Themas für Hinweise ein:

    projects/PROJECT_ID/topics/container-analysis-notes-v1
    

    Dabei ist PROJECT_ID die Google Cloud Projekt-ID.

  5. Klicken Sie auf Erstellen.

  6. Erstellen Sie ein weiteres Abo für Vorkommen mit dem URI:

    projects/PROJECT_ID/topics/container-analysis-occurrences-v1
    

gcloud

Damit Sie Pub/Sub-Ereignisse erhalten, müssen Sie zuerst ein Abo erstellen, das mit dem Thema container-analysis-occurrences-v1 verknüpft ist:

gcloud pubsub subscriptions create \
    --topic container-analysis-occurrences-v1 occurrences

Jetzt können Sie über Ihr neues Abo Nachrichten bezüglich Ihrer Vorkommen abrufen:

gcloud pubsub subscriptions pull \
    --auto-ack occurrences

Java

Informationen zum Installieren und Verwenden der Clientbibliothek für Artefaktanalyse finden Sie unter Artifact Analysis-Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Artifact Analysis Java API.

Richten Sie zur Authentifizierung bei Artefaktanalyse die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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.pubsub.v1.SubscriptionAdminClient;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;
import com.google.pubsub.v1.PushConfig;
import com.google.pubsub.v1.Subscription;
import com.google.pubsub.v1.SubscriptionName;
import com.google.pubsub.v1.TopicName;
import io.grpc.StatusRuntimeException;
import java.io.IOException;
import java.lang.InterruptedException;
import java.util.concurrent.TimeUnit;

public class Subscriptions {
  // Handle incoming Occurrences using a Cloud Pub/Sub subscription
  public static int pubSub(String subId, long timeoutSeconds, String projectId)
      throws InterruptedException {
    // String subId = "my-occurrence-subscription";
    // long timeoutSeconds = 20;
    // String projectId = "my-project-id";
    Subscriber subscriber = null;
    MessageReceiverExample receiver = new MessageReceiverExample();

    try {
      // Subscribe to the requested Pub/Sub channel
      ProjectSubscriptionName subName = ProjectSubscriptionName.of(projectId, subId);
      subscriber = Subscriber.newBuilder(subName, receiver).build();
      subscriber.startAsync().awaitRunning();
      // Sleep to listen for messages
      TimeUnit.SECONDS.sleep(timeoutSeconds);
    } finally {
      // Stop listening to the channel
      if (subscriber != null) {
        subscriber.stopAsync();
      }
    }
    // Print and return the number of Pub/Sub messages received
    System.out.println(receiver.messageCount);
    return receiver.messageCount;
  }

  // Custom class to handle incoming Pub/Sub messages
  // In this case, the class will simply log and count each message as it comes in
  static class MessageReceiverExample implements MessageReceiver {
    public int messageCount = 0;

    @Override
    public synchronized void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
      // Every time a Pub/Sub message comes in, print it and count it
      System.out.println("Message " + messageCount + ": " + message.getData().toStringUtf8());
      messageCount += 1;
      // Acknowledge the message
      consumer.ack();
    }
  }

  // Creates and returns a Pub/Sub subscription object listening to the Occurrence topic
  public static Subscription createOccurrenceSubscription(String subId, String projectId) 
      throws IOException, StatusRuntimeException, InterruptedException {
    // This topic id will automatically receive messages when Occurrences are added or modified
    String topicId = "container-analysis-occurrences-v1";
    TopicName topicName = TopicName.of(projectId, topicId);
    SubscriptionName subName = SubscriptionName.of(projectId, subId);

    SubscriptionAdminClient client = SubscriptionAdminClient.create();
    PushConfig config = PushConfig.getDefaultInstance();
    Subscription sub = client.createSubscription(subName, topicName, config, 0);
    return sub;
  }
}

Go

Informationen zum Installieren und Verwenden der Clientbibliothek für Artefaktanalyse finden Sie unter Artifact Analysis-Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Artifact Analysis Go API.

Richten Sie zur Authentifizierung bei Artefaktanalyse die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.


import (
	"context"
	"fmt"
	"io"
	"sync"
	"time"

	pubsub "cloud.google.com/go/pubsub"
)

// occurrencePubsub handles incoming Occurrences using a Cloud Pub/Sub subscription.
func occurrencePubsub(w io.Writer, subscriptionID string, timeout time.Duration, projectID string) (int, error) {
	// subscriptionID := fmt.Sprintf("my-occurrences-subscription")
	// timeout := time.Duration(20) * time.Second
	ctx := context.Background()

	var mu sync.Mutex
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return -1, fmt.Errorf("pubsub.NewClient: %w", err)
	}
	// Subscribe to the requested Pub/Sub channel.
	sub := client.Subscription(subscriptionID)
	count := 0

	// Listen to messages for 'timeout' seconds.
	ctx, cancel := context.WithTimeout(ctx, timeout)
	defer cancel()
	err = sub.Receive(ctx, func(ctx context.Context, msg *pubsub.Message) {
		mu.Lock()
		count = count + 1
		fmt.Fprintf(w, "Message %d: %q\n", count, string(msg.Data))
		msg.Ack()
		mu.Unlock()
	})
	if err != nil {
		return -1, fmt.Errorf("sub.Receive: %w", err)
	}
	// Print and return the number of Pub/Sub messages received.
	fmt.Fprintln(w, count)
	return count, nil
}

// createOccurrenceSubscription creates a new Pub/Sub subscription object listening to the Occurrence topic.
func createOccurrenceSubscription(subscriptionID, projectID string) error {
	// subscriptionID := fmt.Sprintf("my-occurrences-subscription")
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %w", err)
	}
	defer client.Close()

	// This topic id will automatically receive messages when Occurrences are added or modified
	topicID := "container-analysis-occurrences-v1"
	topic := client.Topic(topicID)
	config := pubsub.SubscriptionConfig{Topic: topic}
	_, err = client.CreateSubscription(ctx, subscriptionID, config)
	return fmt.Errorf("client.CreateSubscription: %w", err)
}

Node.js

Informationen zum Installieren und Verwenden der Clientbibliothek für Artefaktanalyse finden Sie unter Artifact Analysis-Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Artifact Analysis Node.js API.

Richten Sie zur Authentifizierung bei Artefaktanalyse die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

/**
 * TODO(developer): Uncomment these variables before running the sample
 */
// const projectId = 'your-project-id', // Your GCP Project ID
// const subscriptionId = 'my-sub-id', // A user-specified subscription to the 'container-analysis-occurrences-v1' topic
// const timeoutSeconds = 30 // The number of seconds to listen for the new Pub/Sub Messages

// Import the pubsub library and create a client, topic and subscription
const {PubSub} = require('@google-cloud/pubsub');
const pubsub = new PubSub({projectId});
const subscription = pubsub.subscription(subscriptionId);

// Handle incoming Occurrences using a Cloud Pub/Sub subscription
let count = 0;
const messageHandler = message => {
  count++;
  message.ack();
};

// Listen for new messages until timeout is hit
subscription.on('message', messageHandler);

setTimeout(() => {
  subscription.removeListener('message', messageHandler);
  console.log(`Polled ${count} occurrences`);
}, timeoutSeconds * 1000);

Ruby

Informationen zum Installieren und Verwenden der Clientbibliothek für Artefaktanalyse finden Sie unter Artifact Analysis-Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Artifact Analysis Ruby API.

Richten Sie zur Authentifizierung bei Artefaktanalyse die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

# subscription_id = "A user-specified identifier for the new subscription"
# timeout_seconds = "The number of seconds to listen for new Pub/Sub messages"
# project_id      = "Your Google Cloud project ID"

require "google/cloud/pubsub"

pubsub = Google::Cloud::PubSub.new project_id: project_id
subscription_admin = pubsub.subscription_admin
subscription = subscription_admin.create_subscription \
  name: pubsub.subscription_path(subscription_id),
  topic: pubsub.topic_path("container-analysis-occurrences-v1")

subscriber = pubsub.subscriber subscription.name
count = 0
listener = subscriber.listen do |received_message|
  count += 1
  # Process incoming occurrence here
  puts "Message #{count}: #{received_message.data}"
  received_message.acknowledge!
end

listener.start
# Wait for incoming occurrences
sleep timeout_seconds
listener.stop.wait!

subscription_admin.delete_subscription subscription: subscription.name

# Print and return the total number of Pub/Sub messages received
puts "Total Messages Received: #{count}"
count

Python

Informationen zum Installieren und Verwenden der Clientbibliothek für Artefaktanalyse finden Sie unter Artifact Analysis-Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Artifact Analysis Python API.

Richten Sie zur Authentifizierung bei Artefaktanalyse die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

import time

from google.api_core.exceptions import AlreadyExists
from google.cloud.pubsub import SubscriberClient
from google.cloud.pubsub_v1.subscriber.message import Message


def pubsub(subscription_id: str, timeout_seconds: int, project_id: str) -> int:
    """Respond to incoming occurrences using a Cloud Pub/Sub subscription."""
    # subscription_id := 'my-occurrences-subscription'
    # timeout_seconds = 20
    # project_id = 'my-gcp-project'

    client = SubscriberClient()
    subscription_name = client.subscription_path(project_id, subscription_id)
    receiver = MessageReceiver()
    client.subscribe(subscription_name, receiver.pubsub_callback)

    # listen for 'timeout' seconds
    for _ in range(timeout_seconds):
        time.sleep(1)
    # print and return the number of pubsub messages received
    print(receiver.msg_count)
    return receiver.msg_count


class MessageReceiver:
    """Custom class to handle incoming Pub/Sub messages."""

    def __init__(self) -> None:
        # initialize counter to 0 on initialization
        self.msg_count = 0

    def pubsub_callback(self, message: Message) -> None:
        # every time a pubsub message comes in, print it and count it
        self.msg_count += 1
        print(f"Message {self.msg_count}: {message.data}")
        message.ack()


def create_occurrence_subscription(subscription_id: str, project_id: str) -> bool:
    """Creates a new Pub/Sub subscription object listening to the
    Container Analysis Occurrences topic."""
    # subscription_id := 'my-occurrences-subscription'
    # project_id = 'my-gcp-project'

    topic_id = "container-analysis-occurrences-v1"
    client = SubscriberClient()
    topic_name = f"projects/{project_id}/topics/{topic_id}"
    subscription_name = client.subscription_path(project_id, subscription_id)
    success = True
    try:
        client.create_subscription({"name": subscription_name, "topic": topic_name})
    except AlreadyExists:
        # if subscription already exists, do nothing
        pass
    else:
        success = False
    return success

Abonnentenanwendungen erhalten nur die Nachrichten, die nach dem Erstellen des Abos für das Thema veröffentlicht wurden.

Pub/Sub-Nutzlasten haben das JSON-Format und folgendes Schema:

Notizen:

{
    "name": "projects/PROJECT_ID/notes/NOTE_ID",
    "kind": "NOTE_KIND",
    "notificationTime": "NOTIFICATION_TIME",
}

Vorkommen:

{
    "name": "projects/PROJECT_ID/occurrences/OCCURRENCE_ID",
    "kind": "NOTE_KIND",
    "notificationTime": "NOTIFICATION_TIME",
}

Dabei gilt:

  • NOTE_KIND ist einer der Werte in NoteKind.
  • NOTIFICATION_TIME ist ein Zeitstempel im Format RFC 3339 UTC „Zulu“ in Nanosekunden.

Details ansehen

Wenn Sie mehr über eine Notiz oder ein Ereignis erfahren möchten, können Sie auf die in der Artefaktanalyse gespeicherten Metadaten zugreifen. Sie können beispielsweise alle Details zu einem bestimmten Ereignis anfordern. Eine Anleitung dazu finden Sie unter Sicherheitslücken untersuchen.

Nächste Schritte