集中式补丁合规性报告
什么是补丁合规性?
补丁合规性是确保所有计算资源根据组织策略安装了最新安全更新和错误修复的过程。当补丁基线中定义的所有必需补丁都已成功应用时,系统被视为"补丁合规"。不合规的系统可能缺少关键安全更新,从而使您的组织面临可能被恶意行为者利用的安全漏洞。
在跨越多个 AWS 账户和区域的现代云环境中,分散的补丁管理带来了重大挑战,包括可见性差距、报告不一致、对漏洞的响应延迟、复杂的审计流程以及跨团队的重复工作。这些挑战可能导致安全暴露时间延长和整个组织资源利用效率低下。
集中式补丁合规性报告通过将所有账户和区域的数据整合到一个位置来解决这些挑战,提供安全态势的全面视图。这种方法带来诸多好处:合规状态的单一事实来源、漏洞的实时感知、跨环境的一致指标、简化的审计、趋势分析能力、提高的资源效率,以及自动化修复工作流的基础。
AWS Systems Manager 通过以下组件为这种集中化提供基础:Patch Manager 用于自动化补丁流程,资源数据同步将合规数据聚合到中央 S3 存储桶中,以及 AWS Glue、Amazon Athena 和 Amazon QuickSight 等分析服务用于转换、查询和可视化数据。本方案中描述的解决方案利用这些组件创建了一个适用于整个 AWS 组织的综合报告系统,从而实现更高效的运营和更快速的漏洞修复。
资源数据同步以 JSON 文件的形式提供清单和补丁合规性元数据。作为使用 Athena 和 QuickSight 的替代方案,您可以使用任何能够从 S3 存储桶提取数据的 BI 或分析工具。
目的
本方案的目的是提供示例 CloudFormation 模板,可用于配置集中式补丁合规性报告所需的资源。本方案不涉及部署补丁扫描或安装操作。
有关如何准备对托管节点进行补丁的更多信息,请参阅使用 AWS Systems Manager 和标签对托管节点进行补丁。
前提条件
在开始部署之前,请确保您具备以下条件:
- AWS Organizations 设置:正确配置的 AWS Organization,包含管理账户和成员账户。
- 已配置的托管节点:Amazon Elastic Compute Cloud (EC2) 实例、AWS Internet of Things (IoT) Greengrass 核心设备、本地服务器、边缘设备和虚拟机必须是 Systems Manager 托管节点,才能执行补丁操作并报告补丁合规性。
- 已实施补丁操作:至少必须配置并执行一次补丁扫描操作。否则,将没有合规数据可供报告。有关不同类型的补丁及如何实施补丁的更多信息,请参阅补丁管理最佳实践指南和不同类型的补丁部分。
- IAM 权限:具有适当的权限,可以在中央报告账户和成员账户中部署 CloudFormation 模板并创建所需资源。
- Amazon QuickSight:为了使用 QuickSight 可视化补丁合规性信息,您必须注册 QuickSight。
- Amazon QuickSight 对 S3 的权限:您必须确保 QuickSight 对阶段 1:中央账户设置中创建的 S3 存储桶具有权限。更多信息请参阅部署 QuickSight CloudFormation 模板前需完成的前提条件。
注意事项
资源数据同步
目前,AWS CloudFormation 中的 AWS::SSM::ResourceDataSync 资源不支持 S3Destination 属性中的 DestinationDataSharing 属性,而该属性是创建支持简化 S3 存储桶策略的清单资源数据同步所必需的。
因此,本方案在组织资源数据同步示例 CloudFormation 模板部 分使用自定义 CloudFormation 资源,通过 Lambda 函数创建资源数据同步。
使用自定义资源创建资源数据同步的替代方案:
- 使用 CloudFormation 支持的标准资源数据同步。
- 为此,您必须创建并使用基于 AWS 账户 ID 授予权限的存储桶策略。有关更多信息和示例 S3 存储桶策略,请参阅 Before you begin。
- 更新使用 Athena 进行中央报告的示例 CloudFormation 模板中的 S3 存储桶策略,使用列出 AWS 账户 ID 的新策略。
- 使用 CloudFormation StackSets 部署
AWS::SSM::ResourceDataSync资源。有关示例 CloudFormation 资源代码片段,请参阅 Create a SyncToDestination resource data sync。
- 使用替代方法创建组织资源数据同步,例如通过 AWS CLI 或其他 SDK 编写脚本。
成本考虑
实施集中式补丁合规性报告涉及多项 AWS 服务,每项服务都有相关成本:
- Amazon S3 定价:
- 清单和补丁合规数据的标准存储费用
- 从多个账户和区域同步数据的数据传输费用
- 成本随托管节点数量和扫描频率线性增长
- AWS Glue 定价:
- 爬网程序费用
- 默认配置(每天运行一次爬网程序)
- Amazon Athena 定价:
- 查询费用
- 成本因查询复杂度和频率而异
- 使用分区和过滤可以显著降低成本
- AWS Lambda 定价:
- 自定义资源 Lambda 函数的成本极低
- 对于大多数实施,免费套餐通常可以覆盖此用量
- Amazon QuickSight 定价(可选):
- 作者许可证和读者许可证
架构概述
中央报告账户
在下图中,中央报告账户是 AWS Organization 中专门用于存储补丁和清单元数据以及查询或可视化的 AWS 账户。
不建议将 AWS Organization 管理账户用作中央报告账户。管理账户的 AWS 最佳实践建议您仅将管理账户及其用户和角色用于必须由该账户执行的任务。将所有 AWS 资源存储在组织中的其他 AWS 账户中,不要放在管理账户中。

- Glue 爬网程序每天运行一次,爬取托管资源数据同步所提供元数据的 S3 存储桶。
- Glue 爬网程序根据 S3 存储桶中的元数据更新数据库和表。
- Glue 爬网程序完成运行后,向 EventBridge 发送事件。
- EventBridge 规则调用 Lambda 函数。
- Lambda 函数删除 AWS:InstanceInformation 表的重复列。
信息
AWS:InstanceInformation表包含一个名为resourcetype的列,该列也是分区键,这会导致 Athena 查询失败。EventBridge 规则由 Glue 爬网程序执行触发,然后调用 Lambda 函数删除该列。 - Athena 根据您运行的查询查询 Glue 数据库和表。
- (可选)您可以创建 QuickSight 仪表板来可视化补丁合规性信息。注意: QuickSight 未包含在示例 CloudFormation 模板中。
成员账户/区域(包含托管节点)

- 委托管理员账户中的 CloudFormation StackSet 在目标 AWS 账户/区域中创建堆栈实例以创建所需资源。
- 堆栈实例创建 IAM 服务角色、Lambda 函数和自定义 CloudFormation 资源。
- Lambda 函数为 AWS Organizations 创建 Systems Manager 资源数据同步。
- 资源数据同步将清单和补丁合规性元数据发送到中央报告账户中指定的 S3 存储桶。
流程时间线
下图显示了查询托管节点补丁合规性的流程时间线。

- 在补丁扫描、安装或清单元数据收集操作之后,托管节点上的 SSM agent 将数据报告回 Systems Manager。
- 资源数据同步根据所采取的操作识别补丁和清单元数据更新。
- 资源数据同步将元数据传送到中央报告账户中指定的 S3 存储桶。
- 然后您可以在操作完成后使用 Athena 查询结果。
如上图所示,您可以注册混合托管节点用于补丁或清单元数据收集,数据将流入与 EC2 实例相同的 S3 存储桶。
部署步骤
部署清单
以下是本方案中包含的部署步骤清单。
中央报告账户任务
- 部署 Athena 资源的 CloudFormation 堆栈
- 记录堆栈输出中的 S3 存储桶名称
- 配置 QuickSight 对 S3 存储桶的权限
- 部署 QuickSight 可视化的 CloudFormation 堆栈
- 验证对 QuickSight 分析的访问权限
成员账户任务(通过 StackSets)
- 部署组织资源数据同步 CloudFormation StackSet
- 验证资源数据同步已在成员账户中创建
阶段 1:中央账户设置
使用 Athena 进行中央报告的示例 CloudFormation 模板
以下是 CloudFormation 模板创建的资源及其用途的详细信息。
使用 Athena 进行中央报告的示例 CloudFormation 模板
| 资源名称 | 用途 |
|---|---|
| KMS 资源 | |
| ManagedInstanceDataEncryptionKey | 客户管理密钥 (CMK),用于加密资源数据同步 S3 存储桶中的托管节点元数据。 |
| ManagedInstanceDataEncryptionKeyAlias | CMK 的别名。 |
| S3 资源 | |
| AthenaQueryResultsBucket | 用于存储 Athena 查询结果的 S3 存储桶。 |
| ResourceSyncBucket | 用于存储资源数据同步提供的托管节点元数据的 S3 存储桶。 |
| ResourceSyncBucketPolicy | 资源数据同步 S3 存储桶的存储桶策略。 |
| Glue 资源 | |
| GlueDatabase | 用于资源数据同步元数据的 Glue 数据库。 |
| GlueCrawler | 用于创建数据库和表的 Glue 爬网程序。 |
| GlueCrawlerRole | Glue 爬网程序使用的 IAM 角色。 |
| DeleteGlueTableColumnFunctionRole | DeleteGlueTableColumnFunction Lambda 函数的 IAM 角色。 |
| DeleteGlueTableColumnFunction | 用于删除重复 resourcetype 分区键的 Lambda 函数。 |
| DeleteGlueTableColumnFunctionEventRule | 用于调用 DeleteGlueTableColumnFunction Lambda 函数的 Amazon EventBridge 规则。 |
| DeleteGlueTableColumnFunctionCloudWatchPermission | 授予 EventBridge 调用 DeleteGlueTableColumnFunction Lambda 函数的权限。 |
| Athena 资源 | |
| AthenaWorkGroup | 用于已命名查询的 Athena 工作组。 |
| AthenaQueryCompliantPatch | 列出补丁合规的托管节点的示例查询。 |
| AthenaQueryNonCompliantPatch | 列出补丁不合规的托管节点的示例查询。 |
| AthenaQueryComplianceSummaryPatch | 提供托管节点补丁合规性摘要的示例查询。 |
| AthenaQueryPatchSummary | 提供托管节点补丁摘要的示例查询。 |
| AthenaQueryInstanceList | 返回未终止的托管节点列表的示例查询。 |
| AthenaQueryInstanceApplications | 返回未终止的托管节点及其已安装应用程序列表的示例查询。 |
| AthenaQuerySSMAgent | 列出托管节点上安装的 SSM Agent 版本的示例查询。 |
| S3 清理资源 | |
| S3CleanupLambdaExecutionRole | 用于清理 S3 存储桶的 IAM 角色 |
| S3BucketCleanup | 用于清理 S3 存储桶的 Lambda 函数 |
| S3Cleanup | 用于清理 S3 存储桶的自定义资源 |
在中央报告账户中部署 Athena CloudFormation 堆栈
- 将使用 Athena 进行中央报告的示例 CloudFormation 模板下载到本地计算机。
- 在中央报告账户和区域中,导航到 AWS CloudFormation 控制台。
- 在左侧导航窗格中,选择 Stacks,然后选择 Create stack。
- 从下拉列表中,选择 With new resources (standard)。
- 在 Create stack 页面上,选择 Upload a template file,选择 Choose file,选择
patch-reporting.yaml文件,然后选择 Next。 - 在 Specify stack details 页面上,执行以下步骤:
- 对于 Stack name,输入描述性名称,例如
patch-reporting。 - 对于 Organization ID,输入您的 AWS Organization 的 AWS Organization ID。例如,
o-abcde12345。
提示有关如何获取 AWS Organization ID 的更多信息,请参阅 Viewing details of an organization from the management account。
- 对于 Enable Glue Crawler Schedule,选择启用或禁用 Glue 爬网程序的计划执行。
- 对于 Glue Crawler Schedule (cron),输入 Glue 爬网程序的 cron 计划表达式。
- 对于 Enable KMS permissions for QuickSight service role,选择启用或禁用 QuickSight IAM 服务角色的 KMS 权限。注意:如果不授予 KMS 权限,您将无法使用 QuickSight 可视化补丁合规数据。
- 选择 Next。
- 对于 Stack name,输入描述性名称,例如
- 在 Configure stack options 页面上,添加任何必 需的标签,选择 I acknowledge that AWS CloudFormation might create IAM resources with custom names,然后选择 Next。
- 在 Review and create 页面上,查看所有信息,然后选择 Submit 创建堆栈。
页面刷新后,堆栈状态应为 CREATE_IN_PROGRESS。当状态变为 CREATE_COMPLETE 时,您就可以部署 QuickSight 可视化了。
请记录 AthenaQueryResultsBucket 和 ResourceDataSyncBucketName 的 Amazon S3 存储桶名称,这些可以在 CloudFormation 堆栈的 Outputs 选项卡中找到。您将在下一节部署 QuickSight 时需要这两个值。

Amazon QuickSight 可视化示例 CloudFormation 模板
以下是 CloudFormation 模板创建的资源及其用途的详细信息。
Amazon QuickSight 可视化示例 CloudFormation 模板
| 资源名称 | 用途 |
|---|---|
| SSMDataSyncSource | 指向 Athena 工作组 patch-workgroup 的 QuickSight 数据源。 |
| ApplicationDataSet | 应用程序元数据的 QuickSight 数据集 |
| ComplianceItemDataSet | 合规项元数据的 QuickSight 数据集 |
| ComplianceSummaryDataSet | 合规摘要元数据的 QuickSight 数据集 |
| InstanceDetailedInformationDataSet | 实例详细信息元数据的 QuickSight 数据集 |
| InstanceInformationDataSet | 实例信息元数据的 QuickSight 数据集 |
| TagDataSet | 标签元数据的 QuickSight 数据集 |
| JoinedDataSet | 连接 aws_instanceinformation、aws_compliancesummary、aws_tag 的 QuickSight 数据集 |
| ManagedNodeAnalysis | QuickSight 分析仪表板 |
示例 CloudFormation 模板使用 DIRECT_QUERY 方法,允许近实时查询数据源。另一种选择是使用 SPICE 在 QuickSight 中缓存数据。如果使用 SPICE,示例模板还包含第 551-647 行的刷新计划示例。有关选择哪种模式的更多信息,请参阅 Best practices for Amazon QuickSight SPICE and direct query mode。
部署 QuickSight CloudFormation 模板前需完成的前提条件
为了使 QuickSight 能够访问补丁合规性和清单元数据,您必须为在中央报告账户中部署 Athena CloudFormation 堆栈中创建的 S3 存储桶授予 QuickSight 访问权限:ssm-res-sync-athena-query-results-us-east-1-$AccountId 和 ssm-resource-sync-us-east-1-$AccountId。

有关如何授予访问权限的更多信息,请参阅 I can't connect to Amazon S3。
在中央报告账户中部署 QuickSight CloudFormation 堆栈
- 将 Amazon QuickSight 可视化示例 CloudFormation 模板下载到本地计算机。
- 在中央报告账户和区域中,导航到 AWS CloudFormation 控制台。
- 在左侧导航窗格中,选择 Stacks,然后选择 Create stack。
- 从下拉列表中,选择 With new resources (standard)。
- 在 Create stack 页面上,选择 Upload a template file,选择 Choose file,选择
quicksight.yaml文件,然后选择 Next。 - 在 Specify stack details 页面上,执行以下步骤:
- 对于 Stack name,输入描述性名称,例如
quicksight。 - 对于 QuickSightUser,输入要授予 QuickSight 数据源和分析仪表板权限的 QuickSight 用户名称。
- 对于 Workgroup,保留默认值
patch-workgroup。 - 选择 Next。
- 对于 Stack name,输入描述性名称,例如
- 在 Configure stack options 页面上,添加任何必需的标签,然后选择 Next。
- 在 Review and create 页面上,查看所有信息,然后选择 Submit 创建堆栈。
页面刷新后,堆栈状态应为 CREATE_IN_PROGRESS。当状态变为 CREATE_COMPLETE 时,将资源数据同步部署到成员账户/区域。
阶段 2:成员账户配置
组织资源数据同步示例 CloudFormation 模板
以下是 CloudFormation 模板创建的资源及其用途的详细信息。
| 资源名称 | 用途 |
|---|---|
| 资源数据同步资源 | |
| ResourceDataSyncLambdaRole | Lambda 创建组织资源数据同步的 IAM 服务角色 |
| ResourceDataSyncLambdaFunction | 创建组织资源数据同步的 Lambda 函数 |
| ResourceDataSyncCustomResource | 调用 Lambda 函数的 CFN 自定义资源 |
部署 CloudFormation StackSet
以下演练将使用 CloudFormation 的委托管理员账户,通过服务管理权限部署 StackSet,以部署兼容 AWS Organization 的资源数据同步。
- 将组织资源数据同步示例 CloudFormation 模板下载到本地计算机。
- 在 CloudFormation 的委托管理员账户中,导航到 AWS CloudFormation 控制台。
- 在左侧导航窗格中,选择 StackSets,然后选择 Create StackSet。
- 在 Choose a template 页面上,执行以下步骤:
- 对于 Permission model,保留默认选项 Service-managed permissions。
- 对于 Prerequisite - Prepare template,保留默认选项 Template is ready。
- 对于 Specify template,选择 Upload a template file,选择 Choose file,选择
organization-resource-data-sync.yaml文件,然后选择 Next。
- 在 Specify StackSet details 页面上,执行以下步骤:
- 对于 StackSet name,输入描述性名称,例如
org-resource-data-sync。 - 对于 Name of the resource data sync S3 bucket,输入您在上一节中创建的 S3 存储桶名称。
提示在中央报告账户中,您可以在已配置的 CloudFormation 堆栈的 Outputs 中找到 S3 存储桶名称。

- 对于 Prefix for the resource data sync S3 bucket,输入 S3 存储桶前缀的名称,例如
ResourceDataSync。 - 对于 AWS Region for the resource data sync S3 bucket,输入资源数据同步 S3 存储桶的区域。
- 对于 Name of the resource data sync,输入资源数据同步的名称。
- 选择 Next。
- 对于 StackSet name,输入描述性名称,例如
- 在 Configure StackSet options 页面上,添加任何必需的标签,选择 I acknowledge that AWS CloudFormation might create IAM resources,然后选择 Next。
- 在 Set deployment options 页面上,执行以下步骤:
- 对于 Deployment targets,选择部署到组织或特定组织单元 (OU)。
提示建议将资源数据同步部署到所有具有 AWS Systems Manager 托管节点的账户和区域,以确保所有可用的清单和补丁元数据聚合到单个 S3 存储桶中,用于查询、报告和可视化。
- 对于 Specify Regions,选择要部署资源数据同步的区域。
- 保留所有其他选项的默认值,然后选择 Next。
- 在 Review 页面上,查看所有信息,然后选择 Submit 创建 StackSet。
页面刷新后,您将能够看到您的 StackSet。创建完成后,状态将变为 SUCCEEDED。