概要
Security Command Center は、Google Cloud コンソールに検出結果をリアルタイムで通知します。このガイドでは、 Google Cloud サービスとサードパーティの API を使用して機能を拡張し、準リアルタイムの通知を Slack で受け取る方法について説明します。このガイドを完了すると、 Google Cloud コンソールにログインせずに、構成したサードパーティ サービスで新しい検出結果の通知を受け取り、脆弱性や脅威の優先順位付けをより速やかに行えます。Security Command Center では、さまざまな種類の脆弱性と脅威について確認できます。
トポロジ
このガイドでは、次の図に示す構成を作成します。
目標
このガイドでは、次のことを行います。
- Pub/Sub トピックを設定する。
- Slack を設定します。
- Cloud Run functions でコードを記述する。
- 重要度が「高」または「重大」の新しい検出結果が Security Command Center に書き込まれるたびに、Slack に通知を送信するように Pub/Sub と Cloud Run functions を構成する。
- 通知に関する問題のトラブルシューティングを行う。
費用
このチュートリアルでは、以下を含む、 Google Cloudの課金対象となるコンポーネントを使用します。
- Pub/Sub
- Cloud Run functions
- Cloud Build
予想使用量に基づいて費用の見積もりを作成するには、料金計算ツールを使用します。
始める前に
このガイドの内容を行うには、次の Identity and Access Management(IAM)ロールが必要です。
- 組織管理者(
roles/resourcemanager.organizationAdmin) - セキュリティ センター管理者(
roles/securitycenter.admin) - セキュリティ管理者(
roles/iam.securityAdmin) - オーナー(
roles/owner)、編集者(roles/editor)、カスタムロールなど、serviceusage.services.use権限を持つロール - サービス アカウントの作成(
roles/iam.serviceAccountCreator) - Pub/Sub 編集者(
roles/pubsub.editor) - 請求先アカウント管理者(
roles/billing.admin)
Security Command Center の IAM ロールは、組織レベル、フォルダレベル、またはプロジェクト レベルで付与できます。検出結果、アセット、セキュリティ ソースを表示、編集、作成、更新する権限は、アクセス権が付与されているレベルによって異なります。Security Command Center のロールの詳細については、アクセス制御をご覧ください。
プロジェクトの設定
プロジェクトを作成または選択するためには、次の手順を完了します。
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Build API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Build API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init
所要時間: 1 つのサービスに対する通知の設定とテストに約 1 時間かかります。
Pub/Sub トピックの設定
Pub/Sub は、独立したアプリケーション間でメッセージを送受信できるリアルタイム メッセージング サービスです。詳細については Pub/Sub をご覧ください。
このセクションでは、検出結果を Pub/Sub トピックにパブリッシュするように Security Command Center を構成します。
Pub/Sub トピックを設定してサブスクライブする手順は次のとおりです。
環境変数に Google Cloud プロジェクトを指定します。
export PROJECT_ID=PROJECT_IDPROJECT_ID は、実際のプロジェクト ID に置き換えます。
環境変数に Google Cloud 組織を指定します。
export ORG_ID=ORG_IDORG_ID は、実際の組織 ID に置き換えます。
gcloudコマンドにプロジェクト ID を設定します。gcloud config set project PROJECT_ID通知をパブリッシュする Pub/Sub トピックを作成します。
gcloud pubsub topics create scc-critical-and-high-severity-findings-topic環境変数にトピックを指定します。
export TOPIC=projects/$PROJECT_ID/topics/scc-critical-and-high-severity-findings-topicメッセージがトピックにパブリッシュされたときに、チャット メッセージを送信するように Cloud Run functions に通知するサブスクリプションを作成します。
gcloud pubsub subscriptions create scc-critical-and-high-severity-findings-sub \ --topic scc-critical-and-high-severity-findings-topicトピックに通知をパブリッシュするように、Security Command Center を構成します。ListFindings API に対応するフィルタを使用できます。
次のフィルタでは、
globalロケーションで重要度が「高」と「重大」のアクティブな検出結果に関する通知をパブリッシュします。詳細は、検出結果のフィルタリングをご覧ください。gcloud scc notifications create scc-critical-high-severity \ --pubsub-topic=$TOPIC \ --organization=$ORG_ID \ --location=global \ --filter '(severity="HIGH" OR severity="CRITICAL") AND state="ACTIVE"'
次に、Pub/Sub から通知を受け取るチャットアプリを作成または構成します。
メッセージ アプリの設定
このセクションでは、Pub/Sub と Cloud Run functions または Cloud Run functions(第 1 世代)を使用して、Slack で準リアルタイムの通知を有効にする方法について説明します。
Slack チャンネルに通知を送信する手順は次のとおりです。 * メッセージを公開 Slack チャンネルに投稿するために十分な権限を持つ新しい Slack アプリを作成します。* Pub/Sub からの通知の受信時にチャット メッセージを Slack に投稿する Cloud Run functions の関数を作成してデプロイする。
### 新しい Slack アプリを作成する
このセクションでは、通知を受け取る新しい Slack アプリを作成します。
- Slack API アプリに移動します。ページは新しいタブで開きます。
ログインするか、アカウントを作成します。
[Create New App] を選択します。
アプリ名を「SCC Finding Notifier」に設定します。
Slack Bot でメッセージを投稿する Development Slack Workspace を選択し、[アプリの作成] をクリックします。
ナビゲーション パネルで [OAuth & Permissions] を選択します。
[Scopes] セクションに移動します。スコープは、次の 2 つの種類に分類されます。
- Bot Token Scopes
- User Token Scopes
ここでは、User Token Scopes のスコープを追加する必要はありません。[Bot Token Scopes] で、[Add an OAuth Scope] をクリックし、次の項目を入力します。
chat:writechat:write.public
[OAuth & Permissions] ページの上部までスクロールし、[Install App to Workspace] をクリックします。
確認のダイアログで [許可] をクリックします。
Cloud Functions の関数で使用する Bot User OAuth Access Token をコピーします。
次に、Slack グループに通知を送信する Cloud Run functions の関数をデプロイします。
Slack の Cloud Run functions 関数を作成する
このセクションでは、Slack のアカウントに通知を送信する関数をデプロイします。このセクションのコードサンプルは Python で記述されていますが、Cloud Run functions でサポートされている任意の言語を使用できます。
Google Cloud コンソールで、Cloud Run functions の [サービス] ページに移動します。
Pub/Sub トピックを含むプロジェクトの ID を選択します。
[関数を作成] をクリックし、次のフィールドに入力します。
- [サービス名] に「
slack-chat-high-and-critical-findings」と入力します。 - [リージョン] で、サービスを保存するリージョンを選択します。
- [ランタイム] で、関数の実行に使用する Python バージョンを選択します。
- [サービス名] に「
[トリガーを追加] をクリックし、[Pub/Sub トリガー] を選択します。
Pub/Sub トピックの設定で作成した Pub/Sub トピックの詳細を入力し、[トリガーを保存] をクリックします。
[作成] をクリックします。サービスの詳細が表示されます。
[ソース] タブの [ソース] ペインで、[requirements.txt] をクリックします。
コードエディタで、
requestsとfunctions-framework==3.*を追加します。requests functions-framework==3.*[ソース] ペインで、[main.py] をクリックします。
コードエディタで、コードを次のコードに置き換えます。
import base64 import json import requests import functions_framework TOKEN = "BOT_ACCESS_TOKEN" @functions_framework.cloud_event def send_slack_chat_notification(cloud_event): pubsub_message = base64.b64decode(cloud_event.data["message"]["data"]).decode('utf-8').strip() message_json = json.loads(pubsub_message) finding = message_json['finding'] requests.post("https://slack.com/api/chat.postMessage", data={ "token": TOKEN, "channel": "#SLACK_CHANNEL_NAME", "text": f"A high severity finding {finding['category']} was detected." })次のように置き換えます。
BOT_ACCESS_TOKEN: Slack アプリで作成した Bot User OAuth Access Token。SLACK_CHANNEL_NAME: 通知を送信する Slack チャンネル。
[関数のエントリ ポイント] フィールドに、コードサンプルの関数の名前(
send_slack_chat_notification)を入力します。[保存して再デプロイ] をクリックします。関数名の横に緑色のチェックマークが表示されたら、関数は正常にデプロイされています。この処理には数分かかることがあります。
上記の手順を正常に完了すると、セットアップが終了し、通知を受信し始めます。留意点:
- 重要度が「重大」または「高」の個々の検出結果ごとに個別のチャット メッセージを受け取ります。通知の頻度や数は、組織内のリソースによって変わります。
- 通知は、ほぼリアルタイムでパブリッシュされ、送信されます。ただし、メッセージの即時性は保証されておらず、Slack の問題を含め、さまざまな要因により遅延が発生する可能性があります。
通知ワークフローを変更する方法は、次のとおりです。
- Cloud Run functions の関数を更新することにより、受信者を変更します。
- Pub/Sub トピックのフィルタを更新することにより、通知をトリガーする検出結果を変更します。
通知のテスト
通知が正しく構成されているかどうかをテストするには、次の手順に沿って、重要度「高」の検出の有効 / 無効を切り替えます。
- Security Command Center の [検出結果] ページに移動します。
[検出] ページに移動 - メッセージが表示されたら、組織を選択します。
- [クイック フィルタ] パネルで、[重大度] セクションまで下にスクロールし、[高] または [重大] を選択します。[検出結果クエリの結果] パネルが更新され、選択した重要度のみの検出結果が表示されます。
- [検出結果クエリの結果] パネルで、名前の横にあるチェックボックスをオンにして検出結果を選択します。
- [検出結果クエリの結果] アクションバーの [アクティブ状態を変更] メニューから、[無効] を選択します。現在の検出結果クエリにアクティブな検出結果のみが表示される場合、検出結果はクエリ結果から削除されます。
- [クイック フィルタ] パネルで [状態] セクションまでスクロールし、選択を変更して [無効] のみが選択されるようにします。[検出結果クエリの結果] パネルが更新され、無効な検出結果のみが表示されます。
- [検出結果クエリの結果] パネルで、無効としてマークした検出結果を選択します。
- [検出結果クエリの結果] アクションバーの [アクティブ状態を変更] メニューから、[有効] を選択します。
- Slack メッセージを確認します。次のようなメッセージが表示されます。

トラブルシューティング
チャットのメッセージが送受信されない場合は、次の手順で問題を特定して解決します。
1. Check [Stackdriver
logs](https://console.cloud.google.com/projectselector2/logs/viewer) for
your Cloud Run function to determine whether the function is being
invoked. If it is not being invoked, ensure that notifications are set up
correctly.
1. If the Cloud Run function is being invoked, then it might be
crashing. Check for errors in Cloud Run functions using
[Google Cloud console Error Reporting]
(https://console.developers.google.com/errors).
クリーンアップ
このチュートリアルで使用したリソースについて Google Cloud アカウントに課金されることのないよう、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
- Google Cloud コンソールで [リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
リソースを個別に削除する
通知構成を削除します。
gcloud scc notifications delete scc-critical-high-severity \ --organization=ORG_ID \ --location=globalORG_ID は、実際の組織 ID に置き換えます。
構成を維持したまま、通知を一時停止するには、Cloud Run functions の関数の
sendまたはpostの呼び出しをコメントアウトします。Cloud Run functions 関数を削除する
- Cloud Run functions に移動
Cloud Run functions に移動 - 削除したい関数の隣にあるチェックボックスをクリックします。
- [削除] をクリックします。
- Cloud Run functions に移動
サービス アカウントを削除します。
- [サービス アカウント] ページに移動します。
[サービス アカウント] ページに移動 - プロジェクトを選択します。
- 削除するサービス アカウントを選択して、[削除] をクリックします。
- [サービス アカウント] ページに移動します。
次のステップ
- 通知エラーについて詳細を確認する。
- 通知のフィルタリングについて確認する。
- Web Security Scanner と Security Health Analytics の検出結果を修正する方法を確認する。