

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 部署 ChatOps 解决方案来管理 SAST 扫描结果，方法是在聊天应用程序中使用 Amazon Q Developer 自定义操作和 CloudFormation
<a name="deploy-chatops-solution-to-manage-sast-scan-results"></a>

*Anand Bukkapatnam Tirumala，Amazon Web Services*

## Summary
<a name="deploy-chatops-solution-to-manage-sast-scan-results-summary"></a>

这种模式提供了一个全面的解决方案，它在聊天应用程序中使用 Amazon Q Developer 来简化对报告的静态应用程序安全测试 (SAST) 扫描失败的 SonarQube管理。这种创新的方法将自定义操作和通知集成到一个对话界面中，从而在开发团队内部实现高效的协作和决策流程。

在当今快节奏的软件开发环境中，高效管理 SAST 扫描结果对于保持代码质量和安全性至关重要。但是，许多组织面临着以下重大挑战：
+ 由于通知系统效率低下，对关键漏洞的感知有所延迟
+ 审批工作脱节导致决策过程缓慢
+ 无法对 SAST 扫描失败做出即时、可行的响应
+ 围绕安全调查发现的沟通和协作断断续续
+ 为安全工具手动设置基础设施既耗时又容易出错

这些问题通常会导致安全风险增加、发布延迟和团队工作效率降低。为了有效地应对这些挑战，需要一种能够简化 SAST 结果管理、增强团队协作和自动执行基础设施预调配的解决方案。

该解决方案的主要特征包括：
+ **自定义通知** – 实时提醒和通知直接发送到团队聊天频道，确保及时了解 SAST 扫描漏洞或失败并对此采取措施。
+ **对话式审批** – 利益攸关方可以在聊天界面中无缝启动和完成 SAST 扫描结果的审批工作流，从而加速决策过程。
+ **自定义操作** – 团队可以根据 SAST 扫描结果定义和执行自定义操作，例如在质量门失败时自动触发电子邮件，从而增强对安全问题的响应能力。
+ **集中式协作** – 所有与 SAST 扫描相关的讨论、决策和操作都在统一的聊天环境中进行，从而促进团队成员之间的协作和知识共享。
+ **基础设施即代码 (IaC)** — 整个解决方案采用 AWS CloudFormation 模板封装，可实现更快、更可靠的基础架构配置，同时减少手动设置错误。

## 先决条件和限制
<a name="deploy-chatops-solution-to-manage-sast-scan-results-prereqs"></a>

**先决条件**
+ 活跃 AWS 账户的.
+ 一个 AWS Identity and Access Management (IAM) 角色，有权创建和管理与[工具](#deploy-chatops-solution-to-manage-sast-scan-results-tools)中 AWS 服务 列出的资源相关联的资源。
+ 一个 Slack 工作区。
+ 聊天应用程序中的 Amazon Q 开发者版已作为插件添加到所需的 Slack 工作区。有关更多信息，请参阅 Slack 文档中的[将应用程序添加到 Slack 工作区](https://slack.com/intl/en-in/help/articles/202035138-Add-apps-to-your-Slack-workspace)。请记下成功注册 AWS 管理控制台 后的 Slack 工作区 ID，如图所示。
+ 聊天应用程序客户端中配置的 Amazon Q Developer，工作区 ID 随时可供在 CloudFormation 控制台中输入。有关说明，请参阅《*聊天应用程序中的 Amazon Q 开发者版管理员指南*》中的[配置 Slack 客户端](https://docs.aws.amazon.com/chatbot/latest/adminguide/slack-setup.html#slack-client-setup)。
+ 在 Amazon Simple Email Service（Amazon SES）中创建并验证的源电子邮件账户，用于发送审批电子邮件。有关设置说明，请参阅 *Amazon Simple Email Service 开发人员指南*中的[创建和验证电子邮件身份](https://docs.aws.amazon.com/ses/latest/dg/creating-identities.html#verify-email-addresses-procedure)。
+ 用于接收审批通知的目标电子邮件地址。此地址可以是共享收件箱，也可以是特定团队分发列表。
+ 可从您的访问的操作 SonarQube 实例 AWS 账户。有关更多信息，请参阅[SonarQube 安装说明](https://docs.sonarsource.com/sonarqube/latest/setup-and-upgrade/install-the-server/introduction/)。
+ 一种 SonarQube[用户令牌](https://docs.sonarsource.com/sonarqube-server/latest/user-guide/managing-tokens/)，具有通过管道触发和创建项目的权限。

**限制**
+ 在此解决方案中，创建自定义操作按钮是一个手动过程。
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)，然后选择相应服务的链接。

## 架构
<a name="deploy-chatops-solution-to-manage-sast-scan-results-architecture"></a>

下图显示了此模式的工作流和架构组件。

![\[使用 Amazon Q 开发者版为发布管理部署自动代码质量保证的工作流。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/198312ed-e379-49a7-b706-8e79e2142f21/images/a977924c-957e-4f91-99d6-ed790e343ea6.png)


此图显示了自动代码质量保证工作流：

1. 代码准备和上传：
   + 开发人员将代码库压缩为 .zip 文件。
   + 开发人员将该 .zip 文件手动上传到指定的 Amazon Simple Storage Service（Amazon S3）存储桶。

1. Amazon S3 事件触发器和 AWS Step Functions 编排：
   + Amazon S3 上传事件触发 Step Functions 工作流。
   + Step Functions 使用编排 SAST 扫描。 SonarQube
   + 该工作流会监控 AWS CodeBuild 作业状态以确定后续操作。如果 CodeBuild 成功（质量门通过），则工作流程终止。如果 CodeBuild 失败，则调用 AWS Lambda 函数进行诊断。有关更多详细信息，请参阅本部分后面的 **AWS Step Functions 逻辑**。

1. AWS CodeBuild 处决：
   + 该 CodeBuild 作业对上传的代码库执行 SonarQube 扫描。
   + 扫描构件存储在单独的 Amazon S3 存储桶中，以供审计和分析之用。

1. 失效分析（Lambda 函数）：
   +  CodeBuild 失败时，会触发 `CheckBuildStatus` Lambda 函数。
   +  CodeBuild 成功后，该过程即告终止，无需采取进一步行动。

1. Lambda 函数分析失效原因（质量门失败或其他问题）
   + `CheckBuildStatus` 函数创建包含详细失效信息的自定义有效载荷。
   + `CheckBuildStatus` 函数将自定义有效载荷发布到 Amazon Simple Notification Service（Amazon SNS）主题。

1. 通知系统：
   + Amazon SNS 将有效载荷转发给聊天应用程序中的 Amazon Q 开发者版，以实现 Slack 集成。

1. Slack 集成：
   + 聊天应用程序中的 Amazon Q 开发者版在指定的 Slack 频道中发布通知。

1. 审批流程：
   + 审批者会在 Slack 通知中查看失败详细信息。
   + 审批者可以使用 Slack 中的**审批**按钮启动审批。

1. 审批处理程序：
   + 审批 Lambda 函数可处理来自 Slack 的审批操作。
   + 审批函数会将自定义消息发布到 Amazon SES。

1. 消息已生成：
   + 审批函数会生成一条用于通知开发人员的自定义消息。

1. 开发人员通知：
   + Amazon SES 会向开发人员发送一封包含后续步骤或所需操作的电子邮件。

该工作流结合了手动代码上传与自动质量检查，通过 Slack 提供即时反馈，并在必要时允许人工干预，从而确保稳健而灵活的代码审查流程。

**AWS Step Functions  ** 逻辑

如前面的架构图所示，如果质量门 SonarQube 失败，则工作流程将转到 `CheckBuildStatus` Lambda 函数。`CheckBuildStatus` 函数会在 Slack 频道上触发通知。每个通知都包含有关建议的后续步骤的信息。以下是通知类型：
+ **应用程序在代码安全扫描中失败** — 当上传的代码未通过 SonarQube 安全扫描时，用户会收到此通知。用户可以选择**审批**来接受构建。但是，该通知建议用户注意代码质量可能不佳和安全风险等情况。这些通知包含以下详细信息：
  + 后续步骤：错误：质量门状态：失败 – 通过提供的 URL 查看详细信息。
  + 按照提供的 URL 上的文档所述对漏洞进行分类。
  + CodeBuild 有关详细信息，请访问所提供的 URL。
+ **应用程序扫描管道因某些其他原因而失败** – 当管道因代码安全扫描失败以外的其他原因而失败时，用户会收到此通知。这些通知包含以下详细信息：
  + 有关后续步骤，请转到提供的链接，以进一步排查问题。

要查看通知在 Slack 频道中显示的屏幕截图，请前往 GitHub chatops-slack [存储库中的资产文件夹](https://github.com/aws-samples/chatops-slack/tree/main/assets)。

下图显示了未通过质量门检查后 Step Functions 步骤状态的示例。

![\[未通过质量门检查后 AWS Step Functions 步骤状态的工作流。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/198312ed-e379-49a7-b706-8e79e2142f21/images/40b7ebf0-2518-4413-9717-0bfb7559adde.png)


## 工具
<a name="deploy-chatops-solution-to-manage-sast-scan-results-tools"></a>

**AWS 服务**
+ [聊天应用程序中的 Amazon Q](https://docs.aws.amazon.com/chatbot/latest/adminguide/what-is.html) Developer 使您能够使用 Amazon Chime、Microsoft Teams 和 Slack 聊天频道来监控和响应应用程序中的操作事件。 AWS *终止支持通知：* AWS 将于 2026 年 2 月 20 日终止对 Amazon Chime 服务的支持。2026 年 2 月 20 日之后，您将无法再访问 Amazon Chime 控制台或 Amazon Chime 应用程序资源。有关更多信息，请访问该[博客文章](https://aws.amazon.com/blogs/messaging-and-targeting/update-on-support-for-amazon-chime/)。这不会影响 [Amazon Chime SDK](https://aws.amazon.com/chime/chime-sdk/) 服务的可用性。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)帮助您设置 AWS 资源，快速一致地配置资源，并在和的整个 AWS 账户 生命周期中对其进行管理 AWS 区域。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一项完全托管式构建服务，可编译源代码、运行单元测试和生成部署就绪的构件。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 通过控制谁经过身份验证并有权使用 AWS 资源，从而帮助您安全地管理对资源的访问权限。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 可帮助您创建和控制加密密钥以帮助保护您的数据。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 可帮助您将代码中的硬编码凭证（包括密码）替换为对 Secrets Manager 进行的 API 调用，以便以编程方式检索此密钥。
+ [Amazon Simple Email Service（Amazon SES）](https://docs.aws.amazon.com/ses/latest/dg/Welcome.html)可帮助您通过使用您自己的电子邮件地址和域发送和接收电子邮件。
+ [Amazon Simple Notification Service（Amazon SNS）](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)可帮助您协调和管理发布者与客户端（包括 Web 服务器和电子邮件地址）之间的消息交换。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)是一项无服务器编排服务，可帮助您组合 AWS Lambda 功能和其他功能 AWS 服务 来构建关键业务应用程序。

**其他工具**
+ Salesforce 推出的 [Slack](https://slack.com/help/articles/115004071768-What-is-Slack-) 是一款人工智能驱动的对话式平台，可提供聊天和视频协作，自动执行无代码流程，并支持信息共享。
+ [SonarQube](https://docs.sonarsource.com/sonarqube/latest/user-guide/user-account/generating-and-using-tokens/)是一款本地分析工具，旨在检测 30 多种语言、框架和 IaC 平台中的编码问题。

**代码存储库**

此模式的代码可在 GitHub [chatops-s](https://github.com/aws-samples/chatops-slack) lack 存储库中找到。

## 最佳实践
<a name="deploy-chatops-solution-to-manage-sast-scan-results-best-practices"></a>
+ **CloudFormation 堆栈管理**-如果您在 CloudFormation 堆栈执行过程中遇到任何故障，我们建议您删除失败的堆栈。然后，使用正确的参数值重新创建。这种方法支持干净利落的部署，并且有助于避免潜在的冲突或部分实施。
+ **共享收件箱电子邮件配置** – 配置 `SharedInboxEmail` 参数时，请使用所有相关开发人员都可以访问的通用分发列表。这种方法提高了透明度，并且有助于将重要的通知传达给相关的团队成员。
+ **生产审批工作流** – 对于生产环境，限制对用于构建审批的 Slack 频道的访问权限。只有指定的审批者才能成为该频道的成员。这种做法可以维持清晰明确的责任链，并通过限制可审批关键更改的人员来增强安全性。
+ **IAM 权限** – 遵循最低权限原则，并授予执行任务所需的最低权限。有关详情，请参阅 IAM 文档中的[授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv)和[安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAMBestPracticesAndUseCases.html)。

## 操作说明
<a name="deploy-chatops-solution-to-manage-sast-scan-results-epics"></a>

### 执行初始设置
<a name="perform-initial-setup"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆存储库。 | 要克隆此模式的 [chatops-slack](https://github.com/aws-samples/chatops-slack) 存储库，请使用以下命令。`git clone "git@github.com:aws-samples/chatops-slack.git"` | AWS DevOps、构建主管、 DevOps 工程师、云管理员 | 
| 创建包含 Lambda 代码的 .zip 文件。 | 为和`ApprovalEmail`功能的 AWS Lambda 函数代码创建.zip 文件。`CheckBuildStatus`要创建 `notification.zip` 和 `approval.zip`，请使用以下命令。<pre>cd chatops-slack/src</pre><pre>chmod -R 775 *</pre><pre>zip -r approval.zip approval</pre><pre>zip -r notification.zip notification</pre> | AWS DevOps、构建主管、 DevOps 工程师、云管理员 | 

### 部署 pre-requisite.yml 堆栈文件
<a name="deploy-the-pre-requisite-yml-stack-file"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 执行 `pre-requisite.yml` 堆栈文件。 | `pre-requisite.yml` CloudFormation 堆栈文件会部署在您执行堆`app-security.yml`栈文件之前所需的初始资源。要执行 `pre-requisite.yml` 文件，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-chatops-solution-to-manage-sast-scan-results.html) | AWS 管理员、AWS DevOps、构建主管、 DevOps 工程师 | 
| 将 .zip 文件上传到 Amazon S3 存储桶中。 | 将之前创建的 `notification.zip` 和 `approval.zip` 文件上传到名为 `S3LambdaBucket` 的 Amazon S3 存储桶。`app-security.yml` CloudFormation 堆栈文件用于`S3LambdaBucket`配置 Lambda 函数。 | AWS DevOps，构建主管， DevOps 工程师，AWS 系统管理员 | 

### 执行 app-security.yml 堆栈文件
<a name="execute-the-app-security-yml-stack-file"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 执行 `app-security.yml` 堆栈文件。 | `app-security.yml` 堆栈文件可为通知和审批系统部署剩余的基础设施。要执行 `app-security.yml` 文件，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-chatops-solution-to-manage-sast-scan-results.html) | AWS DevOps、AWS 系统管理员、 DevOps 工程师、构建主管 | 
| 测试通知设置。 | 要测试通知设置，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-chatops-solution-to-manage-sast-scan-results.html)成功送达测试消息后，您应该会在 Slack 频道上看到一条通知。有关更多信息，请参阅《*Amazon Q 开发者聊天应用程序管理员指南*》中的 “[测试从 AWS 服务 Slack 发送的通知](https://docs.aws.amazon.com/chatbot/latest/adminguide/slack-setup.html#test-notifications-slack)”。 | AWS DevOps、AWS 系统管理员、 DevOps 工程师、构建主管 | 

### 设置审批流程
<a name="set-up-approval-flow"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置自定义 Lambda 操作。 | 要设置自定义 AWS Lambda 操作，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-chatops-solution-to-manage-sast-scan-results.html) | AWS 管理员、AWS DevOps、构建主管、 DevOps 工程师、Slack 管理员 | 
| 验证审批流程。 | 要验证审批流程是否按预期运行，请在 Slack 中选择**审批**按钮。Slackbot 应在消息会话中发送一条通知，其中包含确认字符串**审批电子邮件已成功发送**。 | AWS 管理员、AWS DevOps、 DevOps 工程师、Slack 管理员 | 

## 问题排查
<a name="deploy-chatops-solution-to-manage-sast-scan-results-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| Slack 配置错误 | 有关对与 Slack 配置错误相关的问题进行故障排除的信息，请参阅《*聊天应用程序中的 Amazon Q 开发者版管理员指南*》中的 Amazon Q 开发者版问题排查。 | 
| 扫描因某些其他原因而失败 | 此错误表示代码构建任务已失败。要对问题进行故障排除，请转到消息中的链接。代码构建任务失败可能包含以下原因：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-chatops-solution-to-manage-sast-scan-results.html) | 

## 相关资源
<a name="deploy-chatops-solution-to-manage-sast-scan-results-resources"></a>

**AWS 文档**
+ [配置 Slack 客户端](https://docs.aws.amazon.com/chatbot/latest/adminguide/slack-setup.html#slack-client-setup)
+ [创建自定义操作](https://docs.aws.amazon.com/chatbot/latest/adminguide/custom-actions.html#creating-custom-actions)
+ [创建电子邮件地址身份](https://docs.aws.amazon.com/ses/latest/dg/creating-identities.html#verify-email-addresses-procedure)[程序](https://docs.aws.amazon.com/ses/latest/dg/creating-identities.html#verify-email-addresses-procedure)
+ [教程：开始使用 Slack](https://docs.aws.amazon.com/chatbot/latest/adminguide/slack-setup.html)

**其他资源**
+ [将应用程序添加到 Slack 工作区](https://slack.com/intl/en-in/help/articles/202035138-Add-apps-to-your-Slack-workspace)（Slack 文档）
+ [生成和使用令牌](https://docs.sonarsource.com/sonarqube/latest/user-guide/user-account/generating-and-using-tokens/)（SonarQube 文档）
+ [服务器安装简介](https://docs.sonarsource.com/sonarqube/latest/setup-and-upgrade/install-the-server/introduction/)（SonarQube 文档）

## 附加信息
<a name="deploy-chatops-solution-to-manage-sast-scan-results-additional"></a>

此解决方案强调了聊天应用程序中的 Amazon Q 开发者版自定义操作，可供发布管理之用。但是，您可以根据自己的特定使用案例修改 Lambda 代码并在此基础上进行构建，从而重复使用该解决方案。

** CloudFormation 堆栈文件的参数**

下表显示了 CloudFormation 堆栈文件的参数及其描述`pre-requisite.yml`。


| 
| 
| **键** | **描述** | 
| --- |--- |
| `StackName` |  CloudFormation 堆栈的名称。 | 
| `S3LambdaBucket` | 您上传 Lambda 代码的 Amazon S3 存储桶的名称。此名称必须全局唯一。 | 
| `SonarToken` | [先决条件](#deploy-chatops-solution-to-manage-sast-scan-results-prereqs)中所述的 SonarQube 用户令牌。 | 

下表显示了 CloudFormation 堆栈文件的参数及其描述`app-security.yml`。


| 
| 
| **键** | **描述** | 
| --- |--- |
| `CKMSKeyArn` | 在此堆栈中创建的 IAM 角色和 Lambda 函数中使用的 AWS KMS key 亚马逊资源名称 (ARN)。 | 
| `CKMSKeyId` | 在此堆栈中创建的 Amazon SNS 主题中使用的 AWS KMS key ID。 | 
| `EnvironmentType` | 用于部署应用程序扫描管道的客户端环境的名称。从允许值的下拉列表中选择环境名称。 | 
| `S3LambdaBucket` | 包含 `approval.zip` 和 `notification.zip` 文件的 Amazon S3 存储桶的名称。 | 
| `SESEmail` | 在 Amazon SES 中注册的电子邮件身份的名称，如[先决条件](#deploy-chatops-solution-to-manage-sast-scan-results-prereqs)中所述。此身份是源电子邮件地址。 | 
| `SharedInboxMail` | 扫描通知所发送到的目标电子邮件地址。 | 
| `SlackChannelId` | 您想要向其发送通知的 Slack 频道的频道 ID。要查找频道 ID，请在 Slack 应用程序的**频道详细信息**中右键单击频道名称。频道 ID 位于底部。 | 
| `SlackWorkspaceId` | [先决条件](#deploy-chatops-solution-to-manage-sast-scan-results-prereqs)中所述的 Slack 工作区 ID。**要查找 Slack 工作空间 ID，请登录，在聊天应用程序控制台中打开 Amazon Q Developer，然后选择**已配置的客户端**、Slack、Wor **kspace** ID。 AWS 管理控制台** | 
| `StackName` |  CloudFormation 堆栈的名称。 | 
| `SonarFileDirectory` | 包含 `sonar.project.<env>.properties` 文件的目录。 | 
| `SonarFileName` | `sonar.project.<env>properties` 文件的名称。 | 
| `SourceCodeZip` | 包含 `sonar.project.<env>properties` 文件和源代码的 .zip 文件的名称。 | 