📨

Security Command Center で検出した脆弱性を Slack に通知してみる

2023/11/15に公開

こんにちは、クラウドエース SRE の佐藤です。
Google Cloud では、組織やフォルダー、プロジェクトレベルで脆弱性や脅威を検出をしてくれる Security Command Center というプロダクトがあります。
検出した情報は Google Cloud コンソールから確認できますが、脆弱性を検出したタイミングでメールや Slack に通知することも可能です。
今回は Security Command Center で検出した脆弱性を Slack に通知する方法をご紹介します。

この記事でやること

Security Command Center で検出した脆弱性情報の通知設定をします。
通知先は Slack ですが、メール通知する方法も少しだけご紹介します。
通知の設定方法は下記公式ドキュメントを参考にしています。
本記事ではフィルター設定や通知内容変更周りも併せてご紹介します。

https://cloud.google.com/security-command-center/docs/how-to-enable-real-time-notifications?hl=ja#slack

使用するプロダクト

  • Security Command Center

  • Cloud Pub/Sub

    • 脆弱性を検知したことを Cloud Functions に通知する
  • Cloud Functions

    • Slack へ通知する仕組みを作る

前提として

設定にあたり必要な条件を記載します。
また、Security Command Center は有効化されているものとします。
設定方法は本記事では割愛しますが、公式ドキュメントを本項下部に載せておきます。

  • 下記 API が通知を設定するプロジェクトで有効化されていること

    • Security Command Center API
    • Pub/Sub API
    • Cloud Functions API
    • Cloud Build API
  • 通知設定を行う IAM アカウントに対して下記ロールが付与されていること

    • 組織
      • 組織管理者
      • セキュリティ センター管理者
      • 請求先アカウント管理者
    • フォルダーまたはプロジェクト
      • セキュリティ管理者
      • オーナーまたは編集者などの serviceusage.services.user 権限をもつロール
      • サービス アカウントの作成
      • Pub/Sub 編集者

https://cloud.google.com/security-command-center/docs/activate-scc-overview?hl=ja
https://cloud.google.com/endpoints/docs/openapi/enable-api?hl=ja
https://cloud.google.com/iam/docs/grant-role-console?hl=ja

設定手順

Cloud Pub/Sub

Security Command Center で脆弱性を検出したら Cloud Functions に通知されるよう設定します。
本記事では、Linux 環境で gcloud コマンドを用いた操作を想定しています。

コマンドの【***】内は環境にあわせて変更してください。

通知を構成するプロジェクトを指定します。

gcloud config set project 【プロジェクト ID】
export PROJECT_ID=【プロジェクト ID】

Pub/Sub トピックを作成し、環境変数に指定します。

gcloud pubsub topics create 【任意のトピック名】

export TOPIC=projects/$PROJECT_ID/topics/【↑で作成したトピック名】

Pub/Sub サブスクリプションを作成します。

gcloud pubsub subscriptions create 【任意の名前】 \
--topic $TOPIC

設定した Pub/Sub トピックに Security Command Center の脆弱性情報が通知されるようにします。
下記、 組織 ID を指定してますが、フォルダーやプロジェクトを指定することも可能です。
また、フィルター設定によって通知される脆弱性情報をある程度コントロールできます。

gcloud scc notifications create 【任意の名前】 \
--pubsub-topic $TOPIC \
--organization 【組織 ID】 \
--filter=”【ここにフィルターを指定する】"

https://cloud.google.com/security-command-center/docs/how-to-api-manage-notifications?hl=ja

フィルター設定について

簡単にフィルターの設定方法について記載します。
フィルターには、Security Command Center の脆弱性情報に含まれる項目を使用します。
項目の確認方法は主に2つあります。

  1. 下記コマンドの実行
gcloud scc findings list 【組織 ID or folders/フォルダ ID or projects/プロジェクト ID】
  1. Google Cloud コンソールから確認

Security Command Center -> 検出結果 -> 脆弱性を選択する
JSONタブから確認

image

フィルターの記述例です。
下記フィルターでは、カテゴリーが OPEN_FIREWALL または PUBLIC_IP_ADDRESS かつ ステータスがアクティブ かつ プロジェクトが特定のプロジェクト ID のみ表示されます。

--filter="(category=\"OPEN_FIREWALL\" OR category=\"PUBLIC_IP_ADDRESS\") \
AND state=\"ACTIVE\" AND resource.project_display_name=【プロジェクト ID】 "

フィルターを設定する前に前述のコマンドで挙動確認をオススメします。

gcloud scc findings list 【組織 ID or folders/フォルダ ID or projects/プロジェクト ID】 \
--filter="(category=\"OPEN_FIREWALL\" OR category=\"PUBLIC_IP_ADDRESS\") \
AND mute!=\"MUTED\" AND resource.project_display_name=\"【プロジェクト ID 】\""

https://cloud.google.com/security-command-center/docs/how-to-api-filter-notifications?hl=ja

Slackアプリを作成する

Slack へ通知を送るためには、Slack API アプリの作成が必要です。

まずはSlack API アプリのページを開きます。

Slack にログインしていない、アカウントがない場合は適宜対応してください。

Create an App をクリックします。

image

ポップアップが表示されるので From scratch をクリックします。

image

App Name には任意のアプリ名を入力します。
Pick a workspace to develop your app in: には通知先のワークスペースを選択してください。

image

作成したらサイドバーのFeatures -> OAuth & Permissions をクリックします。

image

ページが遷移したら下へスクロールしていき、Scope -> Bot Token Scopes より
Add an OAuth Scope をクリックします。

image

下記の通りプルダウンが表示されるので chat:writechat:write.public を選択します。
image

image

ページ上部までスクロールして OAuth Tokens for Your WorkspaceInstall to Workspace をクリックします。
image

これまでの内容が設定できていれば実行できる内容に チャンネルと会話でアクションを実行する と表示されます。
問題なければ 許可する をクリックします。

image

自動で元のページに戻り OAuth Tokens for Your WorkspaceBot User OAuth Token にトークンが表示されます。
次の Cloud Functions で使うのでコピーしておきましょう。
※コピーしわすれてもこのページに戻れば確認できます。

image

Cloud Functions

Cloud Functions で Slack へ通知を送るコードを書いていきます。

Google Cloud コンソールで Cloud Functions のページを開き、 ファンクションの作成 をクリックします。

本記事では下記の通り設定しました。

  • 環境: 第1世代
  • 関数名: 任意
  • リージョン: 任意
  • トリガー
    • トリガーのタイプ: Cloud Pub/Sub
    • Cloud Pub/Sub トピックを選択してください: 作成したトピック名

image

コードでは、ファイルリストの requirements.txt をクリックして、下記の通り記述します。

requests

image

次に main.py をクリックして、テキストフィールドの内容を削除後に下記の通り記述します。
テスト環境のため、 Slack アプリのトークンをコードに直書きしてますが Secret Manager を使用した方がセキュリティ的には好ましいです。

https://cloud.google.com/secret-manager/docs?hl=ja

import base64
import json
import requests

TOKEN = "【ここに Slack アプリのトークン】"

def send_slack_chat_notification(event, context):
    pubsub_message = base64.b64decode(event['data']).decode('utf-8')
    message_json = json.loads(pubsub_message)
    finding = message_json['finding']

    requests.post("https://slack.com/api/chat.postMessage", data={
        "token": TOKEN,
        "channel": "【通知を送るチャンネル名】",
        "text": f"【通知したい内容を記載する】"
    })

画面上部 エントリ ポイントsend_slack_chat_notification に変更します。

画面下部 デプロイ をクリックします。

Cloud Functions の関数リストに戻り、作成した関数名の横に緑色のチェックマークが付けば作成完了です。

image

正常に設定できている場合は、Slack に通知がきます。

image

Slack 通知内容について

上記、Slack 通知の画像では公式ドキュメントのコードを使用してますが、通知内容は Security Command Center から Pub/Sub に通知される脆弱性情報を記述できます。

Security Command Center の脆弱性情報は、フィルター設定の項目に記載した下記コマンドを実行すると確認できます。

gcloud scc findings list 【組織 ID or folders/フォルダ ID or projects/プロジェクト ID】

サンプルコードでは脆弱性情報を message_json に持たせてます。
表示したい内容にあわせて下記サンプルコードのように記述できます。

import base64
import json
import requests

TOKEN = "【ここに Slack アプリのトークン】"

def send_slack_chat_notification(event, context):
    pubsub_message = base64.b64decode(event['data']).decode('utf-8')
    message_json = json.loads(pubsub_message)

    requests.post("https://slack.com/api/chat.postMessage", data={
        "token": TOKEN,
        "channel": "【通知を送るチャンネル名】",
        # 通知内容を記述する
        "text": f"セキュリティアラート\nカテゴリ:{message_json['finding']['category']}\nプロジェクト:{message_json['resource']['projectDisplayName']}\n重要度:{message_json['finding']['severity']}\n詳細:{message_json['finding']['description']}"
    })

Slack へ下記内容で通知されます。

image

メールで通知する場合の参考情報

ここまで Slack での通知方法を記載しましたがメールで通知をしたい場合は下記方法を検討してみてください。

  • SendGrid Email API を使用する。
    • Security Command Center の通知構成ドキュメントにも記載がある方法で Google Cloud のマーケットプレイスから有効化できます。サブスクリプション制ですがフリープランもあります。別途、SendGrid 側で送信者認証が必要です。
  • Gmail API を使用する。
    • Google アカウントのメールアドレスを使用してメール通知を構成できます。

https://cloud.google.com/compute/docs/tutorials/sending-mail/using-sendgrid?hl=ja

https://developers.google.com/gmail/api/guides?hl=ja

まとめ

以上、Security Command Center の脆弱性通知を構成する手順になります。
少し手間はかかりますが通知を構成するだけで確認の手間がなくなりますし、リアルタイムに通知してくれるので早急な対応が可能です。
本記事では Slack 通知の設定方法とメール通知方法に少し触れましたが、環境に合わせて柔軟な通知を構成することが可能なので検討してみてはいかがでしょうか。

Discussion