部署 ChatOps 解决方案,通过使用聊天应用程序中的 Amazon Q 开发者版自定义操作和 CloudFormation 来管理 SAST 扫描结果 - AWS Prescriptive Guidance

部署 ChatOps 解决方案,通过使用聊天应用程序中的 Amazon Q 开发者版自定义操作和 CloudFormation 来管理 SAST 扫描结果

Anand Bukkapatnam Tirumala,Amazon Web Services

摘要

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

在当今快节奏的软件开发环境中,高效管理 SAST 扫描结果对于保持代码质量和安全性至关重要。但是,许多组织面临着以下重大挑战:

  • 由于通知系统效率低下,对关键漏洞的感知有所延迟

  • 审批工作脱节导致决策过程缓慢

  • 无法对 SAST 扫描失败做出即时、可行的响应

  • 围绕安全调查发现的沟通和协作断断续续

  • 为安全工具手动设置基础设施既耗时又容易出错

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

该解决方案的主要特征包括:

  • 自定义通知 – 实时提醒和通知直接发送到团队聊天频道,确保及时了解 SAST 扫描漏洞或失败并对此采取措施。

  • 对话式审批 – 利益攸关方可以在聊天界面中无缝启动和完成 SAST 扫描结果的审批工作流,从而加速决策过程。

  • 自定义操作 – 团队可以根据 SAST 扫描结果定义和执行自定义操作,例如在质量门失败时自动触发电子邮件,从而增强对安全问题的响应能力。

  • 集中式协作 – 所有与 SAST 扫描相关的讨论、决策和操作都在统一的聊天环境中进行,从而促进团队成员之间的协作和知识共享。

  • 基础设施即代码(IaC)– 整个解决方案采用 AWS CloudFormation 模板封装,从而实现更快速、更可靠的基础设施预调配,同时减少手动设置错误。

先决条件和限制

先决条件

  • 一个活跃的 AWS 账户。

  • 一个 AWS Identity and Access Management(IAM)角色,具有创建和管理与工具中列出的 AWS 服务 相关的资源的权限。

  • 一个 Slack 工作区。

  • 聊天应用程序中的 Amazon Q 开发者版已作为插件添加到所需的 Slack 工作区。有关更多信息,请参阅 Slack 文档中的将应用程序添加到 Slack 工作区。请记下成功注册后 AWS 管理控制台 上显示的 Slack 工作区 ID。

  • 聊天应用程序客户端中配置的 Amazon Q 开发者版,其中工作空间 ID 随时可在 CloudFormation 控制台中输入。有关说明,请参阅《聊天应用程序中的 Amazon Q 开发者版管理员指南》中的配置 Slack 客户端

  • 在 Amazon Simple Email Service(Amazon SES)中创建并验证的源电子邮件账户,用于发送审批电子邮件。有关设置说明,请参阅 Amazon Simple Email Service 开发人员指南中的创建和验证电子邮件身份

  • 用于接收审批通知的目标电子邮件地址。此地址可以是共享收件箱,也可以是特定团队分发列表。

  • 一个可从您的AWS 账户 访问的正在运行的 SonarQube 实例。有关更多信息,请参阅 SonarQube 安装说明

  • 一个 SonarQube 用户令牌,具有通过管道触发和创建项目的权限。

限制

  • 在此解决方案中,创建自定义操作按钮是一个手动过程。

  • 部分 ‭AWS 服务在有些 ‭AWS 区域不可用。有关区域可用性,请参阅按区域划分的 AWS 服务。有关特定端点,请参阅服务端点和配额,然后选择相应服务的链接。

架构

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

使用 Amazon Q 开发者版为发布管理部署自动代码质量保证的工作流。

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

  1. 代码准备和上传:

    • 开发人员将代码库压缩为 .zip 文件。

    • 开发人员将该 .zip 文件手动上传到指定的 Amazon Simple Storage Service(Amazon S3)存储桶。

  2. Amazon S3 事件触发器和 AWS Step Functions 编排:

    • Amazon S3 上传事件触发 Step Functions 工作流。

    • Step Functions 使用 SonarQube 编排 SAST 扫描。

    • 该工作流会监控 AWS CodeBuild 任务状态,以确定后续操作。如果 CodeBuild 成功(质量门通过),则工作流会终止。如果 CodeBuild 失败,则会 调用AWS Lambda 函数进行诊断。有关更多详细信息,请参阅本部分后面的 AWS Step Functions 逻辑

  3. AWS CodeBuild 执行:

    • CodeBuild 任务会对上传的代码库执行 SonarQube 扫描。

    • 扫描构件存储在单独的 Amazon S3 存储桶中,以供审计和分析之用。

  4. 失效分析(Lambda 函数):

    • CodeBuild 失败后,会触发 CheckBuildStatus Lambda 函数。

    • CodeBuild 成功后,该过程会终止且无需进一步操作。

  5. Lambda 函数分析失效原因(质量门失败或其他问题)

    • CheckBuildStatus 函数创建包含详细失效信息的自定义有效载荷。

    • CheckBuildStatus 函数将自定义有效载荷发布到 Amazon Simple Notification Service(Amazon SNS)主题。

  6. 通知系统:

    • Amazon SNS 将有效载荷转发给聊天应用程序中的 Amazon Q 开发者版,以实现 Slack 集成。

  7. Slack 集成:

    • 聊天应用程序中的 Amazon Q 开发者版在指定的 Slack 频道中发布通知。

  8. 审批流程:

    • 审批者会在 Slack 通知中查看失败详细信息。

    • 审批者可以使用 Slack 中的审批按钮启动审批。

  9. 审批处理程序:

    • 审批 Lambda 函数可处理来自 Slack 的审批操作。

    • 审批函数会将自定义消息发布到 Amazon SES。

  10. 消息已生成:

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

  11. 开发人员通知:

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

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

AWS Step Functions 逻辑

如前面的架构图所示,如果 SonarQube 的质量门检查失败,则工作流将转到 CheckBuildStatus Lambda 函数。CheckBuildStatus 函数会在 Slack 频道上触发通知。每个通知都包含有关建议的后续步骤的信息。以下是通知类型:

  • 应用程序代码安全扫描失败 – 当上传的代码未通过 SonarQube 安全扫描时,用户会收到此通知。用户可以选择审批来接受构建。但是,该通知建议用户注意代码质量可能不佳和安全风险等情况。这些通知包含以下详细信息:

    • 后续步骤:错误:质量门状态:失败 – 通过提供的 URL 查看详细信息。

    • 按照提供的 URL 上的文档所述对漏洞进行分类。

    • CodeBuild 详细信息可在提供的 URL 中找到。

  • 应用程序扫描管道因某些其他原因而失败 – 当管道因代码安全扫描失败以外的其他原因而失败时,用户会收到此通知。这些通知包含以下详细信息:

    • 有关后续步骤,请转到提供的链接,以进一步排查问题。

要查看通知在 Slack 频道中显示的屏幕截图,请转到 GitHub chatops-slack 存储库中的资产文件夹

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

未通过质量门检查后 AWS Step Functions 步骤状态的工作流。

工具

AWS 服务

  • 聊天应用程序中的 Amazon Q 开发者版 使您可以使用 Amazon Chime、Microsoft Teams 和 Slack 聊天渠道来监控和响应 AWS 应用程序中的操作事件。终止支持通知:AWS 将于 2026 年 2 月 20 日终止对 Amazon Chime 服务的支持。2026 年 2 月 20 日之后,您将无法再访问 Amazon Chime 控制台或 Amazon Chime 应用程序资源。有关更多信息,请访问该博客文章。这不会影响 Amazon Chime SDK 服务的可用性。

  • AWS CloudFormation 可帮助您设置 AWS 资源,快速、一致地预调配这些资源,并在资源的整个生命周期内跨 AWS 账户 和 AWS 区域 来管理这些资源。

  • AWS CodeBuild 是一项完全托管式构建服务,可编译源代码、运行单元测试和生成部署就绪的构件。

  • AWS Identity and Access Management(IAM)通过控制验证和授权使用您 AWS 资源的用户,帮助您安全地管理对您 AWS 资源的访问。

  • AWS Key Management Service(AWS KMS)可以创建和控制加密密钥,从而帮助保护您的数据。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

  • AWS Secrets Manager 有助于您通过对 Secrets Manager 的 API 调用来替换代码中的硬编码凭证(包括密码),以编程方式检索密钥。

  • Amazon Simple Email Service(Amazon SES)可帮助您通过使用您自己的电子邮件地址和域发送和接收电子邮件。

  • Amazon Simple Notification Service (Amazon SNS) 可帮助您协调和管理发布者与客户端(包括 Web 服务器和电子邮件地址)之间的消息交换。

  • Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

  • AWS Step Functions 是一项无服务器编排服务,可帮助您将 AWS Lambda 函数与其他 AWS 服务 结合使用,以便构建业务关键型应用程序。

其他工具

  • Salesforce 推出的 Slack 是一款人工智能驱动的对话式平台,可提供聊天和视频协作,自动执行无代码流程,并支持信息共享。

  • SonarQube 是一款本地分析工具,旨在检测 30 多种语言、框架和 IaC 平台中的编码问题。

代码存储库

此模式的代码可在 GitHub chatops-slack 存储库中找到。

最佳实践

  • CloudFormation 堆栈管理 – 如果您在 CloudFormation 堆栈执行期间遇到任何故障,我们建议您删除失败的堆栈。然后,使用正确的参数值重新创建。这种方法支持干净利落的部署,并且有助于避免潜在的冲突或部分实施。

  • 共享收件箱电子邮件配置 – 配置 SharedInboxEmail 参数时,请使用所有相关开发人员都可以访问的通用分发列表。这种方法提高了透明度,并且有助于将重要的通知传达给相关的团队成员。

  • 生产审批工作流 – 对于生产环境,限制对用于构建审批的 Slack 频道的访问权限。只有指定的审批者才能成为该频道的成员。这种做法可以维持清晰明确的责任链,并通过限制可审批关键更改的人员来增强安全性。

  • IAM 权限 – 遵循最低权限原则,并授予执行任务所需的最低权限。有关更多信息,请参阅 IAM 文档中的授予最低权限安全最佳实践

操作说明

任务描述所需技能

克隆存储库。

要克隆此模式的 chatops-slack 存储库,请使用以下命令。

git clone "git@github.com:aws-samples/chatops-slack.git"

AWS DevOps、构建主管、DevOps 工程师、云管理员

创建包含 Lambda 代码的 .zip 文件。

CheckBuildStatusApprovalEmail 功能创建 AWS Lambda 函数代码的 .zip 文件。要创建 notification.zipapproval.zip,请使用以下命令。

cd chatops-slack/src
chmod -R 775 *
zip -r approval.zip approval
zip -r notification.zip notification
AWS DevOps、构建主管、DevOps 工程师、云管理员
任务描述所需技能

执行 pre-requisite.yml 堆栈文件。

在您执行 app-security.yml 堆栈文件之前,pre-requisite.yml CloudFormation 堆栈文件会部署所需的初始资源。要执行 pre-requisite.yml 文件,请执行以下操作:

  1. 登录 AWS 管理控制台并打开 CloudFormation 控制台。选择创建堆栈,然后从下拉列表选择使用新资源(标准)

  2. 创建堆栈页面,选择选择现有模板上传模板文件。然后,选择选择文件,并选择 pre-requisite.yml。选择下一步

  3. 指定堆栈详细信息页面上,输入其他信息中所述的参数的值。然后选择下一步

  4. 配置堆栈选项页面,选择先决条件中所述的用于创建资源的 IAM 角色。然后选择下一步

  5. 审查并创建页面上,选择提交

  6. 在堆栈的详细信息页面上,选择资源输出选项卡。记下以下步骤中使用的 S3LambdaCKMSKeyArnCKMSKeyId 参数的值。

AWS 管理员、AWS DevOps、构建主管、DevOps 工程师

将 .zip 文件上传到 Amazon S3 存储桶中。

将之前创建的 notification.zipapproval.zip 文件上传到名为 S3LambdaBucket 的 Amazon S3 存储桶。 app-security.yml CloudFormation 堆栈文件使用 S3LambdaBucket 来预调配 Lambda 函数。

AAWS DevOps、构建主管、DevOps 工程师、AWS 系统管理员
任务描述所需技能

执行 app-security.yml 堆栈文件。

app-security.yml 堆栈文件可为通知和审批系统部署剩余的基础设施。要执行 app-security.yml 文件,请执行以下操作:

  1. 登录 AWS 管理控制台并打开 CloudFormation 控制台。选择创建堆栈,然后从下拉列表选择使用新资源(标准)

  2. 创建堆栈页面,选择选择现有模板上传模板文件。然后,选择选择文件,并选择 app-security.yml。选择下一步

  3. 指定堆栈详细信息页面上,输入其他信息中所述的参数的值。然后选择下一步

  4. 配置堆栈选项页面,选择先决条件中所述的用于创建资源的 IAM 角色。然后选择下一步

  5. 审查并创建页面上,选择提交

AAWS DevOps、AWS 系统管理员、DevOps 工程师、构建主管

测试通知设置。

要测试通知设置,请执行以下操作:

  1. 打开 Amazon SNS 控制台。在左侧导航窗格中,选择主题

  2. 选择以 LambdaToAWSSlackChatbot 结尾的主题名称。

  3. 在主题的详细信息页面上,选择发布消息

  4. 发布消息到主题页面上,对于要发送到端点的消息正文,输入以下内容:

    { "version": "1.0", "source": "custom", "content": { "description": ":warning: This is a test notification" } }
  5. 选择发布消息

成功送达测试消息后,您应该会在 Slack 频道上看到一条通知。有关更多信息,请参阅《聊天应用程序中的 Amazon Q 开发者版管理员指南》中的测试从 AWS 服务 到 Slack 的通知

AAWS DevOps、AWS 系统管理员、DevOps 工程师、构建主管
任务描述所需技能

配置自定义 Lambda 操作。

要设置自定义 AWS Lambda 操作,请执行以下操作:

  1. 在 Slack 频道中,选择送达通知底部的垂直省略号按钮。

  2. 管理操作中,选择创建

  3. 输入自定义操作名称,例如审批。此名称是您自定义操作的唯一标识符。

  4. 输入自定义操作按钮的名称,例如审批。此名称会显示在通知上的按钮上。此名称应不超过 20 个字符,并且可以包含表情符号。

  5. 对于自定义操作类型,选择 Lambda 操作

  6. 选择下一步

  7. 选择要部署此操作的 AWS 账户 和 AWS 区域。

  8. 选择加载 Lambda

  9. 定义 Lambda 函数中,选择一个以 ApprovalEmailLambda结尾的 Lambda 函数。然后选择下一步

  10. 要创建审批按钮,请在显示标准页面上,选择保存

AWS 管理员、AWS DevOps、构建主管、DevOps 工程师、Slack 管理员

验证审批流程。

要验证审批流程是否按预期运行,请在 Slack 中选择审批按钮。

Slackbot 应在消息会话中发送一条通知,其中包含确认字符串审批电子邮件已成功发送

AWS 管理员、AWS DevOps、DevOps 工程师、Slack 管理员

故障排除

问题解决方案

Slack 配置错误

有关对与 Slack 配置错误相关的问题进行故障排除的信息,请参阅《聊天应用程序中的 Amazon Q 开发者版管理员指南》中的 Amazon Q 开发者版问题排查。

扫描因某些其他原因而失败

此错误表示代码构建任务已失败。要对问题进行故障排除,请转到消息中的链接。代码构建任务失败可能包含以下原因:

  • 应用程序未正确打包。sonar-scanner 命令找不到 sonar.project.env.properties 文件。

  • SonarFileNameSonarFileDirectorySonarToken 参数的值不正确。检查这些值,然后再次执行堆栈文件。

  • 无法访问 Sonar 主机。

  • 其他可使用日志进行故障排除的问题。

相关资源

AWS 文档

其他资源

其他信息

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

CloudFormation 堆栈文件的参数

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

描述

StackName

CloudFormation 堆栈的名称。

S3LambdaBucket

您上传 Lambda 代码的 Amazon S3 存储桶的名称。此名称必须全局唯一。

SonarToken

先决条件中所述的 SonarQube 用户令牌。

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

描述

CKMSKeyArn

在此堆栈中创建的 IAM 角色和 Lambda 函数中使用的 AWS KMS key Amazon 资源名称(ARN)。

CKMSKeyId

在此堆栈中创建的 Amazon SNS 主题中使用的 AWS KMS key ID。

EnvironmentType

用于部署应用程序扫描管道的客户端环境的名称。从允许值的下拉列表中选择环境名称。

S3LambdaBucket

包含 approval.zipnotification.zip 文件的 Amazon S3 存储桶的名称。

SESEmail

在 Amazon SES 中注册的电子邮件身份的名称,如先决条件中所述。此身份是源电子邮件地址。

SharedInboxMail

扫描通知所发送到的目标电子邮件地址。

SlackChannelId

您想要向其发送通知的 Slack 频道的频道 ID。要查找频道 ID,请在 Slack 应用程序的频道详细信息中右键单击频道名称。频道 ID 位于底部。

SlackWorkspaceId

先决条件中所述的 Slack 工作区 ID。要查找 Slack 工作区 ID,请登录 AWS 管理控制台,打开聊天应用程序中的 Amazon Q 开发者版控制台,然后选择配置的客户端SlackWorkspaceID

StackName

CloudFormation 堆栈的名称。

SonarFileDirectory

包含 sonar.project.<env>.properties 文件的目录。

SonarFileName

sonar.project.<env>properties 文件的名称。

SourceCodeZip

包含 sonar.project.<env>properties 文件和源代码的 .zip 文件的名称。