検出通知の設定

>

Security Command Center API の通知機能を有効にします。通知は Pub/Sub トピックに情報を送信して、数分以内に検出結果の更新と新しい検出結果を知らせます。Security Command Center API は組織レベルで機能するため、Security Command Center API の通知には Security Command Center ダッシュボードに表示されるすべての検出結果情報が含まれます。

Security Command Center Pub/Sub の通知を Cloud Functions のアクションに直接接続できます。レスポンス、拡張、修復に役立つセキュリティ関数の例については、Security Command Center ツールのアラートのサンプルアプリをご覧ください。

始める前に

  • Security Command Center API の通知を有効にするには、セキュリティー センター管理者 の IAM ロールが必要です。
  • Security Command Center ダッシュボードにアクセスするには、セキュリティ センター管理閲覧者の IAM ロールが必要です。
  • 通知サービス アカウントまたは gcloud ツール アカウントに適切なロールを付与するには、組織管理者 の IAM ロールが必要です。

Security Command Center のロールの詳細を確認する。

Security Command Center API の通知の設定

通知を設定するには、まず Security Command Center API を有効にします。

Security Command Center API を有効にする

Security Command Center API を有効にする手順は次のとおりです。

  1. Cloud Console の API ライブラリ ページに移動します。
    API ライブラリ ページに移動
  2. 通知 API を有効にするプロジェクトを選択します。
  3. [検索] ボックスに「Security Command Center」と入力し、検索結果で [Security Command Center] をクリックします。
  4. 表示された API ページで [有効にする] をクリックします。

これで、プロジェクトで Security Command Center API が有効になりました。次に、gcloud ツールまたはクライアント ライブラリを使用して Pub/Sub トピックをサブスクライブし、権限を設定します。

Pub/Sub トピックの設定

この手順では、通知を送信する Pub/Sub トピックを作成してサブスクライブします。プログラムで API を呼び出す必要がない場合は、設定が容易な gcloud ツールコマンドをおすすめします。

gcloud

gcloud ツールを使用して Security Command Center API の通知機能を設定する手順は次のとおりです。

  1. Pub/Sub トピックとサブスクリプションを設定します。
  2. gcloud ツール アカウントの権限を設定します。

ステップ 1: Pub/Sub を設定する

Pub/Sub トピックを設定してサブスクライブする手順は次のとおりです。

  1. Google Cloud Console に移動します。
    Google Cloud Console に移動
  2. Security Command Center API を有効にしたプロジェクトを選択します。
  3. Cloud Shell をアクティブにする をクリックします。
  4. 新しいトピックを作成するか、既存のトピックを再利用します。新しいトピックを作成するには、次のようにします。

       gcloud pubsub topics create topic-id
    
  5. 環境変数を設定します。

    1. トピック ID を設定します。

        export TOPIC_ID=topic-id
      
  6. トピックへのサブスクリプションを作成します。

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

Pub/Sub の設定について詳しくは、トピックとサブスクリプションの管理をご覧ください。次にアカウントの権限をセットアップします

手順 2: gcloud ツールのアカウント権限を設定する

NotificationConfig を作成するには、gcloud ツール アカウントに次の Identity and Access Management(IAM)ロールが必要です。

  • roles/securitycenter.admin または roles/securitycenter.notificationConfigEditor
  • 通知を受け取る Pub/Sub トピックの roles/pubsub.admin

これらの権限を付与する手順は次のとおりです。

  1. Google Cloud Console に移動します。
    Google Cloud Console に移動
  2. Security Command Center API を有効にしたプロジェクトを選択します。
  3. Cloud Shell をアクティブにする をクリックします。

    1. 組織名を設定します。

        export ORGANIZATION_ID=organization-id
      
    2. Pub/Sub トピックが属するプロジェクトのプロジェクト ID を設定します。

        export PUBSUB_PROJECT=project-id
      
    3. 使用している gcloud ツール アカウントを設定します。

        export GCLOUD_ACCOUNT=your-username@email.com
      
    4. トピック ID を設定するか、ステップ 1 で設定したトピックを使用します。

        export TOPIC_ID=topic-id
      
    5. gcloud ツール アカウントに pubsub.topics.setIamPolicy 権限を持つ Pub/Sub ロールを付与します。

        gcloud pubsub topics add-iam-policy-binding \
          projects/$PUBSUB_PROJECT/topics/$TOPIC_ID \
          --member="user:$GCLOUD_ACCOUNT" \
          --role='roles/pubsub.admin'
      
    6. gcloud ツール アカウントに、roles/securitycenter.notificationConfigEditorroles/securitycenter.admin など、すべての securitycenter.notification 権限を含む組織のロールを付与します。

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

次に、NotificationConfig を作成します。

クライアント ライブラリ

クライアント ライブラリを使用して Security Command Center API の通知機能を設定する手順は次のとおりです。

  1. サービス アカウントを設定します。
  2. API クライアント ライブラリをダウンロードします。
  3. 開発環境を設定します。
  4. Pub/Sub トピックとサブスクリプションを設定します。

ステップ 1: サービス アカウントを設定する

Security Command Center API の通知機能は、適切な権限を持つサービス アカウントを使用して通知を構成します。このサービス アカウントは、構成ファイルの初期設定にのみ使用します。後で追加の通知構成ファイルを作成するのに再利用することもできます。このサービス アカウントは、Security Command Center を設定したときに作成したサービス アカウントとは別のものです。

サービス アカウントを作成するには:

  1. Google Cloud Console に移動します。
    Google Cloud Console に移動
  2. Security Command Center API を有効にしたプロジェクトを選択します。
  3. Cloud Shell をアクティブにする をクリックします。
  4. 環境変数を設定します。

    1. 組織名を設定します。

        export ORGANIZATION_ID=organization-id
      
    2. 通知 API を有効にするプロジェクトのプロジェクト ID を設定します。

        export PROJECT_ID=project-id
      
    3. 新しいサービス アカウントに使用するカスタム ID を設定します(scc-notifications など)。サービス アカウント名は 6 ~ 30 文字で、先頭は英字にします。すべて英小文字、数字とハイフンで指定してください。

        export SERVICE_ACCOUNT=custom-id
      
    4. サービス アカウントキーを保存するパスを設定します(export KEY_LOCATION=/home/$USER/mykeys/$SERVICE_ACCOUNT.json など)。

        export KEY_LOCATION=full-key-location-path
        # This is used by client libraries to find the key
        export GOOGLE_APPLICATION_CREDENTIALS=$KEY_LOCATION
      
  5. プロジェクト ID に関連付けられたサービス アカウントを作成します。

       gcloud iam service-accounts create $SERVICE_ACCOUNT  --display-name \
        "Service Account for [USER]"  --project $PROJECT_ID
    
  6. サービス アカウントに関連付ける鍵を作成します。この鍵は NotificationConfig の作成時に使用され、前の手順で指定した KEY_LOCATION に永続的に保存されます。

       gcloud iam service-accounts keys create $KEY_LOCATION  --iam-account \
        $SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
    
  7. サービス アカウントに、roles/securitycenter.notificationConfigEditorroles/securitycenter.admin など、すべての securitycenter.notification 権限を含む組織のロールを付与します。

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

これで、通知で使用できるようにサービス アカウントが設定され、サービス アカウントキーが指定した KEY_LOCATION に保存されました。サービス アカウントの詳細については、サービス アカウントキーの作成と管理をご覧ください。

ステップ 2: 開発環境の設定

Security Command Center API の通知機能を使用するには、gcloud ツールを使用するか、クライアント ライブラリをダウンロードして、選択した言語で開発環境を設定します。

Python

  1. 省略可: Python ライブラリをインストールする前に、Virtualenv を使用して、隔離された Python 環境を作成することをおすすめします。

     virtualenv your-env
     source your-env/bin/activate
    
  2. Python ライブラリのインストールを管理するために、pip をインストールします。

  3. 次のコマンドを実行して、次の Python ライブラリをインストールします。

     pip install google-cloud-securitycenter
    

Java

Security Command Center の Java ライブラリを依存関係としてプロジェクトに含めるには、Maven リポジトリからアーティファクトを選択します。通知は、ライブラリ バージョン 0.119.0 以降に含まれます。

Intellij を使用している場合は、GOOGLE_APPLICATION_CREDENTIALS 環境変数を、前の手順でダウンロードした通知サービス アカウントキーの絶対パスに設定します。

  1. Intellij で、[実行] > [構成を編集] の順にクリックします。
  2. [Application] > [Run_Configuration_For_Sample] > [Environment Variables] で次の変数を設定します。

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

Go

通知 API Go の依存関係をインストールするには、次のコマンドを実行します。

Go ライブラリをダウンロードするには、次のコマンドを実行します。

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

Node.js

プロジェクト フォルダで、npm を使用して必要な通知 API の依存関係をインストールします。

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

ステップ 3: Pub/Sub の設定

Pub/Sub に通知を配信するには、Pub/Sub トピックをサブスクライブし、通知サービス アカウントに pubsub.topics.setIamPolicy 権限を含む IAM ロールを付与します。

  1. 新しいトピックを作成するか、既存のトピックを再利用します。新しいトピックを作成するには、次のようにします。

       gcloud pubsub topics create topic-id
    
  2. 環境変数を設定します。

    1. トピック ID を設定します。

        export TOPIC_ID=topic-id
      
    2. 通知 API を有効にしたプロジェクトのプロジェクト ID を設定します。

        export CONSUMER_PROJECT=project-id
      
    3. 前の手順で作成したサービス アカウントのメールアドレスを設定します。

        export SERVICE_ACCOUNT_EMAIL=service-account-name@$CONSUMER_PROJECT.iam.gserviceaccount.com
      
  3. トピックへのサブスクリプションを作成します。

       gcloud pubsub subscriptions create subscription-id --topic topic-id
    
  4. 通知サービス アカウントに pubsub.topics.setIamPolicy 権限を持つロールを付与します。

       gcloud pubsub topics add-iam-policy-binding \
         projects/$CONSUMER_PROJECT/topics/$TOPIC_ID \
         --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
         --role='roles/pubsub.admin'
    

Pub/Sub の設定について詳しくは、トピックとサブスクリプションの管理をご覧ください。次のステップでは、NotificationConfig を作成して設定を完了します。

NotificationConfig の作成

NotificationConfig を作成する前に、次の点にご注意ください。

  • 各組織で保持できる NotificationConfig ファイルの数には上限があります。詳細については、割り当てと上限をご覧ください。
  • 通知サービス アカウントまたは gcloud ツール アカウントに適切なロールを付与するには、組織管理者の IAM ロールが必要です。

NotificationConfig には、便利なイベントへの通知に限定する filter フィールドが含まれています。このフィールドには、Security Command Center API の findings.list メソッドで使用できるすべてのフィルタを受け入れます。

gcloud コマンドライン ツールを使用して、セキュリティ センター通知構成の編集者の IAM ロールをアカウントに付与する手順は次のとおりです。

  1. 環境変数を設定します。

    1. 組織名を設定します。

        export ORGANIZATION_ID=organization-id
      
    2. 検出結果通知を設定したときに作成したサービス アカウントのメールアドレスか、gcloud ツールコマンドの実行に使用しているアカウントのメールアドレスを設定します。

      • gcloud ツールコマンドの実行に使用するアカウントのメールアドレスを設定します。

        export EMAIL=your-username@email.com
        
      • または、サービス アカウントのメールアドレスを設定します。

        export EMAIL=service-account-name@$CONSUMER_PROJECT.iam.gserviceaccount.com
        
  2. 必要なロールをサービス アカウントまたは gcloud ツールコマンドで使用したアカウントに付与します。

    • gcloud ツール コマンドの実行に使用したアカウントにロールを付与します。

         gcloud organizations add-iam-policy-binding \
           $ORGANIZATION_ID \
           --member="user:$EMAIL" \
           --role='roles/securitycenter.notificationConfigEditor'
      
    • または、サービス アカウントにロールを付与します。

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

サービス アカウントまたは gcloud ツール アカウントに権限を付与したら、任意の言語またはプラットフォームを使用して NotificationConfig を作成します。

gcloud

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

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

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

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

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

Python

from google.cloud import securitycenter as securitycenter

client = securitycenter.SecurityCenterClient()

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

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

created_notification_config = client.create_notification_config(
    request={
        "parent": org_name,
        "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

import com.google.cloud.securitycenter.v1.CreateNotificationConfigRequest;
import com.google.cloud.securitycenter.v1.NotificationConfig;
import com.google.cloud.securitycenter.v1.NotificationConfig.StreamingConfig;
import com.google.cloud.securitycenter.v1.SecurityCenterClient;
import java.io.IOException;
  public static NotificationConfig createNotificationConfig(
      String organizationId, String notificationConfigId, String projectId, String topicName)
      throws IOException {
    // String organizationId = "{your-org-id}";
    // String notificationConfigId = {"your-unique-id"};
    // String projectId = "{your-project}"";
    // String topicName = "{your-topic}";

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

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

    try (SecurityCenterClient client = SecurityCenterClient.create()) {
      CreateNotificationConfigRequest request =
          CreateNotificationConfigRequest.newBuilder()
              .setParent(orgName)
              .setConfigId(notificationConfigId)
              .setNotificationConfig(
                  NotificationConfig.newBuilder()
                      .setDescription("Java notification config")
                      .setPubsubTopic(pubsubTopic)
                      .setStreamingConfig(
                          StreamingConfig.newBuilder().setFilter("state = \"ACTIVE\"").build())
                      .build())
              .build();

      NotificationConfig response = client.createNotificationConfig(request);
      System.out.println(String.format("Notification config was created: %s", response));
      return response;
    }
  }

Go

import (
	"context"
	"fmt"
	"io"

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

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

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

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

	req := &securitycenterpb.CreateNotificationConfigRequest{
		Parent:   fmt.Sprintf("organizations/%s", orgID),
		ConfigId: notificationConfigID,
		NotificationConfig: &securitycenterpb.NotificationConfig{
			Description: "Go sample config",
			PubsubTopic: pubsubTopic,
			NotifyConfig: &securitycenterpb.NotificationConfig_StreamingConfig_{
				StreamingConfig: &securitycenterpb.NotificationConfig_StreamingConfig{
					Filter: `state = "ACTIVE"`,
				},
			},
		},
	}

	notificationConfig, err := client.CreateNotificationConfig(ctx, req)
	if err != nil {
		return fmt.Errorf("Failed to create notification config: %v", err)
	}
	fmt.Fprintln(w, "New NotificationConfig created: ", notificationConfig)

	return nil
}

Node.js

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

const client = new SecurityCenterClient();

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

const orgName = client.organizationPath(organizationId);

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

createNotificationConfig();

PHP

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

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

$securityCenterClient = new SecurityCenterClient();
$organizationName = $securityCenterClient::organizationName($organizationId);
$pubsubTopic = $securityCenterClient::topicName($projectId, $topicName);

$streamingConfig = (new StreamingConfig())->setFilter("state = \"ACTIVE\"");
$notificationConfig = (new NotificationConfig())
    ->setDescription('A sample notification config')
    ->setPubsubTopic($pubsubTopic)
    ->setStreamingConfig($streamingConfig);

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

Ruby

require "google/cloud/security_center"

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

# Your notification config id. e.g. for
# "organizations/123/notificationConfigs/my-config" this would be "my-config".
# config_id = "YOUR_CONFIG_ID"

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

client = Google::Cloud::SecurityCenter.security_center

org_path = client.organization_path organization: org_id

notification_config = {
  description:      "Sample config for Ruby",
  pubsub_topic:     pubsub_topic,
  streaming_config: { filter: 'state = "ACTIVE"' }
}

response = client.create_notification_config(
  parent:              org_path,
  config_id:           config_id,
  notification_config: notification_config
)
puts "Created notification config #{config_id}: #{response}."

C#


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

///<summary> Create NotificationConfig Snippet. </summary>
public class CreateNotificationConfigSnippets
{
    public static NotificationConfig CreateNotificationConfig(
        string organizationId, string notificationConfigId, string projectId, string topicName)
    {
        OrganizationName orgName = new OrganizationName(organizationId);
        TopicName pubsubTopic = new TopicName(projectId, topicName);

        SecurityCenterClient client = SecurityCenterClient.Create();
        CreateNotificationConfigRequest request = new CreateNotificationConfigRequest
        {
            ParentAsOrganizationName = orgName,
            ConfigId = notificationConfigId,
            NotificationConfig = new NotificationConfig
            {
                Description = ".Net notification config",
                PubsubTopicAsTopicName = pubsubTopic,
                StreamingConfig = new NotificationConfig.Types.StreamingConfig { Filter = "state = \"ACTIVE\"" }
            }
        };

        NotificationConfig response = client.CreateNotificationConfig(request);
        Console.WriteLine($"Notification config was created: {response}");
        return response;
    }
}

これで、指定した Pub/Sub トピックに通知が発行されるようになりました。通知を発行するために、Security Command Center は、ロール securitycenter.notificationServiceAgent を持つ service-org-organization-id@gcp-sa-scc-notification.iam.gserviceaccount.com の形式の組織レベルのサービス アカウントを使用します。通知を機能させるには、この組織レベルのサービス アカウントのロールが必要です。

前の手順では、プロジェクト レベルの通知サービス アカウントを service-account-id@project-id.iam.gserviceaccount.com の形式で作成しているか、gcloud ツールでユーザー アカウントを使用しました。このアカウントに付与した権限は、必要に応じて取り消すことができます。詳細は、IAM ドキュメントのアクセス権の付与、変更、取り消しをご覧ください。

次のステップ