View a markdown version of this page

部署 ChatOps 解决方案来管理 SAST 扫描结果,方法是在聊天应用程序中使用 Amazon Q Developer 自定义操作和 CloudFormation - AWS 规范指引

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

部署 ChatOps 解决方案来管理 SAST 扫描结果,方法是在聊天应用程序中使用 Amazon Q Developer 自定义操作和 CloudFormation

Anand Bukkapatnam Tirumala,Amazon Web Services

Summary

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

在当今快节奏的软件开发环境中,高效管理 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 Developer,工作区 ID 随时可供在 CloudFormation 控制台中输入。有关说明,请参阅《聊天应用程序中的 Amazon Q 开发者版管理员指南》中的配置 Slack 客户端

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

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

  • 可从您的访问的操作 SonarQube 实例 AWS 账户。有关更多信息,请参阅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 使用编排 SAST 扫描。 SonarQube

    • 该工作流会监控 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 Developer 使您能够使用 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 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-s lack 存储库中找到。

最佳实践

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

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

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

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

操作说明

Task说明所需技能

克隆存储库。

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

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

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

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

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

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

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

pre-requisite.yml CloudFormation 堆栈文件会部署在您执行堆app-security.yml栈文件之前所需的初始资源。要执行 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 函数。

AWS DevOps,构建主管, DevOps 工程师,AWS 系统管理员
Task说明所需技能

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

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

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

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

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

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

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

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

测试通知设置。

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

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

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

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

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

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

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

AWS DevOps、AWS 系统管理员、 DevOps 工程师、构建主管
Task说明所需技能

配置自定义 Lambda 操作。

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

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

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

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

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

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

  6. 选择下一步

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

  8. 选择加载 Lambda

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

  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 亚马逊资源名称 (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,请登录,在聊天应用程序控制台中打开 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 文件的名称。