概览
Security Command Center 会在 Google Cloud 控制台中提供发现结果的实时通知。本指南介绍了如何使用 Google Cloud 服务和第三方 API 来扩展该功能,并在电子邮件和聊天应用中接收近乎实时的通知。完成本指南后,您无需登录 Google Cloud 控制台即可在配置的第三方服务中收到有关新发现结果的提醒,从而加快漏洞和威胁的分类。详细了解 Security Command Center 中不同类型的漏洞和威胁。
拓扑
在本指南中,您将创建下图所示的配置。
目标
在本指南中,您将执行以下操作:
- 设置 Pub/Sub 主题。
- 设置 Slack、WebEx Teams 和 SendGrid 电子邮件。
- 在 Cloud Run 函数中编写代码。
- 配置 Pub/Sub 和 Cloud Run 函数,以便在向 Security Command Center 写入新的严重程度为“高”或“严重”的发现结果时向 Slack、WebEx Teams 或 SendGrid 电子邮件发送通知。
- 排查通知问题。
费用
本教程使用 Google Cloud 的以下收费组件:
- Pub/Sub
- Cloud Run functions
- Cloud Build
您可使用价格计算器,根据您的预计使用情况来估算费用。
准备工作
如需完成本指南,您必须拥有以下 Identity and Access Management (IAM) 角色:
- Organization Admin (
roles/resourcemanager.organizationAdmin
) - Security Center Admin (
roles/securitycenter.admin
) - Security Admin (
roles/iam.securityAdmin
) - 具有
serviceusage.services.use
权限的角色,例如 Owner (roles/owner
)、Editor (roles/editor
) 或自定义角色 - Create Service Accounts (
roles/iam.serviceAccountCreator
) - Pub/Sub Editor (
roles/pubsub.editor
) - Billing Account Administrator (
roles/billing.admin
)
Security Command Center 的 IAM 角色可以在组织、文件夹或项目级层授予。您能否查看、修改、创建或更新发现结果、资产和安全来源,取决于您获授予的访问权限级别。如需详细了解 Security Command Center 角色,请参阅访问权限控制。
设置项目
完成以下步骤以创建或选择一个项目。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build API.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build API.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
预计时间:设置和测试单服务通知大约需要一小时。
设置 Pub/Sub 主题
Pub/Sub 是一种实时消息传递服务,可让您在独立的应用之间发送和接收消息。详细了解 Pub/Sub。
在本部分中,您将配置 Security Command Center 以将发现结果发布到 Pub/Sub 主题。
如需设置和订阅 Pub/Sub 主题,请执行以下操作:
在环境变量中指定您的 Google Cloud 项目。
export PROJECT_ID=PROJECT_ID
将 PROJECT_ID 替换为您的项目 ID。
在环境变量中指定您的 Google Cloud 组织。
export ORG_ID=ORG_ID
将 ORG_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 函数在向主题发布消息时发送电子邮件或聊天消息。
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 函数或 Cloud Run 函数(第 1 代)为 SendGrid Email API、Slack 和 WebEx Teams 启用接近实时的通知。
SendGrid 电子邮件
如需启用电子邮件通知,请执行以下操作:
- 创建一个 SendGrid Email API 账号并获取 API 密钥。
- 创建和部署 Cloud Run 函数,以便在收到 Pub/Sub 发出通知时发送电子邮件。
创建 SendGrid Email API 账号
在本部分中,您将创建一个 SendGrid Email API 账号并获取 API 密钥。如果您已启用 SendGrid,请跳至获取 Sendgrid Email API 密钥,并确保现有 API 密钥具有足够的权限。
- 前往 Google Cloud 控制台。
前往 Google Cloud 控制台 - 在页面顶部的搜索框中,搜索 SendGrid Email API。
在下一页中,选择满足您的需求的方案。
- 免费方案每月最多可发送 12000 封电子邮件,足以满足本指南的需求,但大型组织可能需要更多可发送电子邮件的数量。如果您预计收到大量电子邮件通知,请考虑向通知添加其他过滤条件,以排除嘈杂的发现结果。
- 系统可能会要求您选择与 SendGrid 关联的项目。请选择项目以继续。您可能需要具备足够的权限才能管理项目关联的结算账号的购买交易。
查看条款,如果您同意,请点击订阅。
点击注册 SendGrid 激活 SendGrid 服务。
在注册屏幕上,输入用户名、密码和电子邮件地址。接受服务条款,然后点击继续。
在确认对话框中,点击返回 Google。
获取 SendGrid Email API 密钥
点击在 SendGrid 网站上管理 API 密钥。 为 SendGrid 网站打开一个新标签页。
如果系统提示,请填写表单或登录。然后点击开始使用!
在菜单面板中,展开设置并点击 API 密钥。
在下一个屏幕上,点击创建 API 密钥按钮。
在 API 密钥名称下,输入“SCC 电子邮件通知”,选择完整访问权限,然后点击创建和查看按钮。
您将看到 API 密钥。记录该值。您将在下一部分中用到该值。
点击完成。您将看到当前的 API 密钥集。关闭标签页并返回 Google Cloud 控制台。
接下来,您将部署 Cloud Run 函数以向电子邮件地址发送通知。
创建 SendGrid Cloud Run 函数
在本部分中,您将部署一个向您的电子邮件账号发送通知的函数。
前往 Cloud Run functions。
前往 Cloud Run 函数确保您使用的是用于创建 Pub/Sub 主题的 PROJECT_ID。
点击创建函数。
将函数名称设置为 send-high-and-critical-finding-email-notification,并将触发器类型设置为 Pub/Sub。
选择您在设置 Pub/Sub 主题中创建的 Pub/Sub 主题。
点击保存,然后点击下一步。
在下一页中,将运行时设置为 Python 3.8。本部分中的代码示例采用 Python 语言编写,但您可以使用 Cloud Run functions 支持的任何语言。
在文件列表中,点击 requirements.txt 并将以下内容添加到文本字段:
sendgrid
。
点击 main.py 并将内容替换为以下代码段。
import base64 import json from sendgrid import SendGridAPIClient from sendgrid.helpers.mail import Mail def send_email_notification(event, context): """Triggered from a message on a Pub/Sub topic. Args: event (dict): Event payload. context (google.cloud.functions.Context): Metadata for the event. """ pubsub_message = base64.b64decode(event['data']).decode('utf-8') message_json = json.loads(pubsub_message) message = Mail( from_email='noreply@yourdomain.com', to_emails='$EMAIL_ADDRESS', subject='New High or Critical Severity Finding Detected', html_content='A new high or critical severity finding was detected: ' + ''.join(message_json['finding']['category'])) try: sg = SendGridAPIClient('$SENDGRID_EMAIL_API_KEY') response = sg.send(message) print(response.status_code) print(response.body) print(response.headers) except Exception as e: print(e) print(pubsub_message)
替换以下内容:
- 将
noreply@yourdomain.com
更改为您希望从其收到消息的电子邮件地址。 - 将
$EMAIL_ADDRESS
更改为目标收件人的电子邮件地址。注意:此变量可包含一个电子邮件地址数组 (['user1@yourdomain.com', 'user2@yourdomain.com']),或者您可以编写自定义代码来将动态变量设置为随时待命人员的轮换列表。 - 将
$SENDGRID_EMAIL_API_KEY
更改为您已拥有的 API 密钥或您在上一部分中创建的密钥。
- 将
转到入口点字段,然后在代码段中(在此示例中为 send_email_notification)输入函数的名称。
点击部署。您将返回到 Cloud Run 函数列表,您应该会在其中看到新函数。如果函数名称旁显示绿色对勾标记,则表示相应函数已成功部署。此过程可能需要几分钟时间。
Slack
如需向 Slack 渠道发送通知,请执行以下操作:
- 创建一个新的 Slack 应用,该应用拥有向公共 Slack 频道发布消息的权限。
- 创建和部署 Cloud Run 函数,使其在从 Pub/Sub 收到通知时向 Slack 发布聊天消息。
创建一个新的 Slack 应用
在此部分中,您将创建一个新的 Slack 应用来接收通知。
- 导航到 Slack API 应用。该页面将在一个新的标签页中打开。
登录或创建账户。
选择创建应用。
将应用名称设置为“SCC Finding Notifier”。
选择您希望 Slack 聊天机器人要向其发布消息的开发 Slack 工作区,然后点击创建应用。
在导航面板中,选择 OAuth 和权限。
导航到范围部分。范围分为两类:
- 聊天机器人令牌范围
- 用户令牌范围
在本练习中,您无需添加用户令牌范围。在“聊天机器人令牌范围”下,点击添加 OAuth 范围并输入以下内容:
chat:write
chat:write.public
滚动到 OAuth 和权限页面顶部,然后点击将应用安装到工作区。
在确认对话框中点击允许。
复制聊天机器人用户 OAuth 访问令牌,以便在 Cloud Functions 函数中使用。
接下来,您将部署一个 Cloud Run 函数以向 Slack 群组发送通知。
创建 Slack Cloud Run 函数
在本部分中,您将部署一个函数来向 Slack 账号发送通知。
前往 Cloud Run functions。
前往 Cloud Run 函数确保您使用的是创建 Pub/Sub 主题的同一 PROJECT_ID。
点击创建函数。
将函数名称设置为 slack-chat-high-and-critical-findings,并将触发器类型设置为 Pub/Sub。
选择您在设置 Pub/Sub 主题中创建的 Pub/Sub 主题。
点击保存,然后点击下一步。
在下一页中,将运行时设置为 Python 3.8。本部分中的代码示例采用 Python 语言编写,但您可以使用 Cloud Run functions 支持的任何语言。
导航到文件列表。点击 requirements.txt 并添加以下内容:
requests
。点击 main.py 并将其内容替换为以下代码段。
import base64 import json import requests TOKEN = "BOT_ACCESS_TOKEN" 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": "#general", "text": f"A high severity finding {finding['category']} was detected!" })
将
BOT_ACCESS_TOKEN
替换为您使用 Slack 应用创建的聊天机器人用户 OAuth 访问令牌。转到入口点字段,然后在代码段中(在此示例中为 send_slack_chat_notification)输入函数的名称。
点击部署。您将返回到 Cloud Run 函数列表,您应该会在其中看到新函数。如果函数名称旁显示绿色对勾标记,则表示相应函数已成功部署。此过程可能需要几分钟时间。消息会显示在 #general Slack 频道中。
WebEx
如需向 WebEx Teams 账号发送通知,请执行以下操作:
- 创建一个有权从 Security Command Center 中检索资源的新服务账号。
- 创建一个有足够的权限将消息发送到工作区的 WebEx 聊天机器人。
- 创建和部署一个 Cloud Run 函数,用于订阅 Pub/Sub,并在收到 Pub/Sub 主题的通知时向 WebEx 发布聊天消息。
创建服务账号
默认情况下,Cloud Run 函数无法从 Security Command Center 中检索资源。在本部分中,您将预配服务账号,以允许 Cloud Run 函数检索与发现结果关联的资产。
为您的服务账号命名,并将其指定为环境变量。
export SERVICE_ACCOUNT=ACCOUNT_NAME
为您的项目创建服务账号。
gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name "Service Account for SCC Finding Notifier WebEx Cloud Function" \ --project $PROJECT_ID
在组织级层为服务账号授予
securitycenter.assetsViewer
角色。gcloud organizations add-iam-policy-binding $ORG_ID \ --member="serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com" \ --role='roles/securitycenter.assetsViewer'
创建 Webex 聊天机器人
在本部分中,您将创建一个可将消息发布到您的工作区的 WebEx 聊天机器人。
登录您的 WebEx Teams 账号,然后前往新建聊天机器人页面。
将聊天机器人名称设置为“SCC Finding Notifier”。
选择具有描述性但唯一的聊天机器人用户名 (your-name-scc-finding-notifier-demo)。
在图标下,选择默认 1。
在新的严重程度为“高”或“严重”的发现结果发送到 Security Command Center 时,将说明设置为“会通知团队的机器人”。
点击添加聊天机器人。
在确认页面上,复制聊天机器人访问令牌并保存,以在 Cloud Run 函数中使用。
将 Webex 聊天机器人添加到工作区
在本部分中,您可将 WebEx 聊天机器人添加到工作区。
在您希望聊天机器人向其发布通知的 WebEx 空间中,展开活动面板。
选择加人。
在文本字段中键入“SCC Finding Notifier”,然后从下拉菜单中选择您创建的聊天机器人。
选择添加按钮,然后关闭面板。
获取 Cloud Run 函数工作区的聊天室 ID。在台式机上,转到 https://developer.webex.com/docs/api/v1/rooms/list- rooms,然后在必要时登录。本页面使用 WebEx API 来列出您所属的聊天室。
导航到搜索面板。
选择面板顶部标记为试用的标签页。
将所有选项保留为默认值,然后点击运行。
在响应 (Response) 标签页中,您会收到 JSON 格式的响应,其中包含
items
或聊天室列表。找到您要显示通知的聊天室的title
,并记录关联的id
值。
接下来,您将部署 Cloud Run 函数以向 WebEx 工作区发送通知。
创建 WebEx Cloud Run 函数
在本部分中,您将部署一个函数来向您的 WebEx 账号发送通知。
前往 Cloud Run functions。
前往 Cloud Run 函数选择在其中创建 Pub/Sub 主题的 PROJECT_ID。
点击创建函数。
将函数名称设置为 webex-teams-high-and-critical-findings,并将触发器类型设置为 Pub/Sub。
选择您在设置 Pub/Sub 主题中创建的 Pub/Sub 主题。
展开变量、网络和高级设置字段。
在服务账号下,过滤并选择您创建的
webex-cloud-function-sa
服务账号。点击保存,然后点击下一步。
在下一页中,将运行时设置为 Python 3.8。本部分中的代码示例采用 Python 语言编写,但您可以使用 Cloud Run functions 支持的任何语言。
导航到文件列表。点击 requirements.txt 并添加以下内容:
requests==2.25.1
google-cloud-securitycenter==1.1.0
点击 main.py 并将内容替换为以下代码段。
#!/usr/bin/env python3 import base64 import json import requests from google.cloud import securitycenter_v1 WEBEX_TOKEN = "WEBEX_TOKEN" ROOM_ID = "ROOM_ID" TEMPLATE = """ **Severity:** {severity}\n **Asset:** {asset}\n **SCC Category:** {category}\n **Project:** {project}\n **First observed:** {create_time}\n **Last observed:** {event_time}\n **Link to finding:** {finding_link} """ PREFIX = "https://console.cloud.google.com/security/command-center/findings" def get_finding_detail_page_link(finding_name): """Constructs a direct link to the finding detail page.""" org_id = finding_name.split("/")[1] return f"{PREFIX}?organizationId={org_id}&resourceId={finding_name}" def get_asset(parent, resource_name): """Retrieves the asset corresponding to `resource_name` from SCC.""" client = securitycenter_v1.SecurityCenterClient() resp = client.list_assets( securitycenter_v1.ListAssetsRequest( parent=parent, filter=f'securityCenterProperties.resourceName="{resource_name}"', ) ) page = next(resp.pages) if page.total_size == 0: return None asset = page.list_assets_results[0].asset return json.loads(securitycenter_v1.Asset.to_json(asset)) def send_webex_teams_notification(event, context): """Send the notification to WebEx Teams.""" pubsub_message = base64.b64decode(event["data"]).decode("utf-8") message_json = json.loads(pubsub_message) finding = message_json["finding"] parent = "/".join(finding["parent"].split("/")[0:2]) asset = get_asset(parent, finding["resourceName"]) requests.post( "https://webexapis.com/v1/messages", json={ "roomId": ROOM_ID, "markdown": TEMPLATE.format( severity=finding["severity"], asset=asset["securityCenterProperties"]["resourceDisplayName"], category=finding["category"], project=asset["resourceProperties"]["project"], create_time=finding["createTime"], event_time=finding["eventTime"], finding_link=get_finding_detail_page_link(finding["name"]), ), }, headers={"Authorization": f"Bearer {WEBEX_TOKEN}"}, )
替换以下内容:
- 将
WEBEX_TOKEN
替换为创建 WebEx 聊天机器人部分中的聊天机器人访问令牌。 - 将
ROOM_ID
替换为将 WebEx 聊天机器人添加到工作区部分中的聊天室 ID。
- 将
转到入口点字段,然后在代码段中(在此示例中为 send_webex_teams_notification)输入函数的名称。
点击部署。您将返回到 Cloud Run 函数列表,您应该会在其中看到新函数。如果函数名称旁显示绿色对勾标记,则表示相应函数已成功部署。此过程可能需要几分钟的时间。
如果所选服务的上述步骤已正确完成,则说明安装已完成,您可开始接收通知。注意:
- 对于每个关键或高严重性发现,您都会收到单独的电子邮件或聊天消息。通知的频率或数量取决于组织内的资源。
- 系统会近乎实时地发布和发送通知。然而,电子邮件或消息的即时性得不到保证,多种因素可能导致延迟,包括 SendGrid、电子邮件系统、Slack 或 WebEx 的问题。
如需更改通知工作流,您可以执行以下操作:
- 通过更新 Cloud Run 函数来更改收件人。
- 更新 Pub/Sub 主题的过滤条件,以更改发现结果触发通知。
测试通知
如要测试通知是否已正确配置,请按照以下说明将高严重级别的发现结果在活跃状态和非活跃状态之间切换。
- 转到 Security Command Center“发现结果”页面。
转到“发现结果”页面 - 如果出现提示,请选择您的组织。
- 在快速过滤条件面板中,向下滚动到严重级别部分,然后选择高或严重。发现结果的查询结果面板会相应更新,以仅显示所选严重级别的发现结果。
- 在发现结果的查询结果面板中,通过勾选发现结果名称旁边的复选框选中一个发现结果。
- 在发现结果的查询结果操作栏的更改活跃状态菜单中,选择非活跃。如果当前发现结果查询仅显示活跃发现结果,则系统会从查询结果中移除该发现结果。
- 在快速过滤条件面板中,向下滚动到状态部分,然后更改选项,以仅选择非活跃。发现结果的查询结果面板会相应更新,以仅显示非活跃发现结果。
- 在发现结果的查询结果面板中,选择您标记为非活跃的发现结果。
- 在发现结果的查询结果操作栏的更改活跃状态菜单中,选择活跃。
检查您的电子邮件或消息传递服务,您应该会看到类似于下图的消息。
电子邮件:
Slack:
发送到 WebEx(包含本指南中详细信息)的消息,类似于下图。
问题排查
如果未发送或接收电子邮件或聊天消息,请按照以下步骤识别并解决潜在问题。
SendGrid 电子邮件:
- 如要阻止电子邮件发送到垃圾邮件文件夹,请将
from_email
值添加到电子邮件许可名单中或在 SendGrid 上配置发件人身份验证。 - 确保您未超过 SendGrid 方案的速率限制。
- 您可以通过 SendGrid 报告检测失败的电子邮件。
- 您的网域或电子邮件服务提供商的 DMARC 政策可能会阻止来自未经身份验证的发件人的电子邮件。了解 SendGrid 如何管理发件人身份。如果出现错误,请尝试使用
from_email
值中的另一个电子邮件地址。
- 您的网域或电子邮件服务提供商的 DMARC 政策可能会阻止来自未经身份验证的发件人的电子邮件。了解 SendGrid 如何管理发件人身份。如果出现错误,请尝试使用
- 如要阻止电子邮件发送到垃圾邮件文件夹,请将
SendGrid 电子邮件、Slack 和 WebEx:
检查 Cloud Run 函数的 Stackdriver 日志,以确定函数是否被调用。如果未调用,请确保正确设置该通知。
如果调用 Cloud Run 函数,它可能会崩溃。使用 Google Cloud 控制台 Error Reporting 检查 Cloud Run 函数中的错误。
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
逐个删除资源
删除通知配置:
gcloud scc notifications delete scc-critical-high-severity \ --organization=ORG_ID \ --location=global
将 ORG_ID 替换为您的组织 ID。
为了保留配置并暂停通知,您可以在 Cloud Run 函数中注释掉
send
或post
调用。删除 Cloud Run functions 函数:
- 前往 Cloud Run functions。
前往 Cloud Run 函数 - 点击您要删除的函数旁的复选框。
- 点击删除 。
- 前往 Cloud Run functions。
删除服务账号:
- 转到服务账号页面。
转到“服务账号”页面 - 选择一个项目。
- 选择要删除的服务账号,然后点击删除 。
- 转到服务账号页面。
后续步骤
- 详细了解通知错误。
- 了解如何过滤通知。
- 了解如何修复 Web Security Scanner 和 Security Health Analytics 发现结果。