

• AWS Systems Manager CloudWatch 控制面板在 2026 年 4 月 30 日之后将不再可用。客户可以像现在一样继续使用 Amazon CloudWatch 控制台来查看、创建和管理其 Amazon CloudWatch 控制面板。有关更多信息，请参阅 [Amazon CloudWatch 控制面板文档](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html)。

# 将 Chef InSpec 配置文件与 Systems Manager Compliance 结合使用
<a name="integration-chef-inspec"></a>

AWS Systems Manager 与 [https://www.chef.io/products/chef-inspec](https://www.chef.io/products/chef-inspec) 集成。Chef InSpec 是一个开源的测试框架，使您可以创建要存储在 GitHub 或 Amazon Simple Storage Service（Amazon S3）中的人类可读配置文件。然后，您可以使用 Systems Manager 运行合规性扫描，并查看合规和不合规的节点。*配置文件*列出您的计算环境的安全性、合规性或策略要求。例如，您可以使用 Compliance（AWS Systems Manager 中的一项工具），创建将在您扫描节点时执行以下检查的配置文件：
+ 检查特定端口是否处于打开或关闭状态。
+ 检查特定应用程序是否正在运行。
+ 检查某些软件包是否已安装。
+ 检查 Windows 注册表项中的特定属性。

您可以仅为使用 Systems Manager 管理的 Amazon Elastic Compute Cloud (Amazon EC2) 实例创建 InSpec 配置文件。不支持本地服务器和虚拟机 (VM)。以下示例 Chef InSpec 配置文件将检查端口 22 是否处于打开状态。

```
control 'Scan Port' do
impact 10.0
title 'Server: Configure the service port'
desc 'Always specify which port the SSH server should listen to.
Prevent unexpected settings.'
describe sshd_config do
its('Port') { should eq('22') }
end
end
```

InSpec 包含一组资源，可帮助您快速编写检查和审计控制。InSpec 使用 [InSpec 域特定语言 (DSL)](https://docs.chef.io/inspec/7.0/reference/glossary/#dsl) 在 Ruby 中编写这些控件。您还可以使用由大型 InSpec 用户社区创建的配置文件。例如，GitHub 上的 [DevSec chef-os-hardening](https://github.com/dev-sec/chef-os-hardening) 项目包含许多配置文件，可帮助保护节点。您可以在 GitHub 或 Amazon S3 中创作和存储配置文件。

## 工作原理
<a name="integration-chef-inspec-how"></a>

下面演示了 InSpec 配置文件与 Compliance 结合使用的过程：

1. 要么识别要使用的预定义 InSpec 配置文件，要么创建您自己的配置文件。您可以使用 GitHub 上的[预定义配置文件](https://github.com/search?p=1&q=topic%3Ainspec+org%3Adev-sec&type=Repositories)来开始操作。有关如何创建自己的 InSpec 配置文件的信息，请参阅 [ChefChef InSpec 配置文件](https://www.inspec.io/docs/reference/profiles/)。

1. 将配置文件存储在公有或私有 GitHub 存储库或者 S3 存储桶中。

1. 使用 Systems Manager 文档（SSM 文档）`AWS-RunInspecChecks`，借助您的 InSpec 配置文件运行 Compliance。您可以使用 Run Command（AWS Systems Manager 中的一项工具）开始按需进行合规性扫描，也可以使用State Manager（AWS Systems Manager 中的一项工具）按计划定期进行合规性扫描。

1. 使用 Compliance API 或 Compliance 控制台识别不合规的节点。

**注意**  
请注意以下信息。  
Chef 使用节点上的客户端来处理配置文件。您不需要安装客户端。当 Systems Manager 运行 SSM 文档 `AWS-RunInspecChecks` 时，系统将检查是否已安装客户端。如果未安装，Systems Manager 会在扫描期间安装 Chef 客户端，然后在扫描完成后卸载该客户端。
运行 SSM 文档 `AWS-RunInspecChecks`（如本主题中所述）会将类型为 `Custom:Inspec` 的合规性条目分配到每个目标节点。要分配此合规性类型，该文档将调用 [PutComplianceItems](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_PutComplianceItems.html) API 操作。

## 运行 InSpec 合规性扫描
<a name="integration-chef-inspec-running"></a>

本节包含有关如何使用 Systems Manager 控制台和 AWS Command Line Interface (AWS CLI) 运行 InSpec 合规性扫描的信息。控制台过程介绍了如何配置 State Manager 来运行该扫描。AWS CLI 过程介绍了如何配置 Run Command 来运行该扫描。

### 使用 State Manager 运行 InSpec 合规性扫描（控制台）
<a name="integration-chef-inspec-running-console"></a>

**使用 AWS Systems Manager 控制台通过 State Manager 运行 InSpec 合规性扫描**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **State Manager**。

1. 选择 **Create association（创建关联）**。

1. 在**提供关联详细信息**部分，输入一个名称。

1. 在 **Document (文档)** 列表中，选择 **`AWS-RunInspecChecks`**。

1. 在**文档版本**列表中，选择**运行时的最新版本**。

1. 在**参数**部分的**源类型**列表中，请选择 **GitHub** 或 **S3**。

   如果选择 **GitHub**，则在**源信息**字段中输入公有或私有 GitHub 存储库中 InSpec 配置文件的路径。以下是由 Systems Manager 团队从以下位置提供的公有配置文件的示例路径：[https://github.com/awslabs/amazon-ssm/tree/master/Compliance/InSpec/PortCheck](https://github.com/awslabs/amazon-ssm/tree/master/Compliance/InSpec/PortCheck)。

   ```
   {"owner":"awslabs","repository":"amazon-ssm","path":"Compliance/InSpec/PortCheck","getOptions":"branch:master"}
   ```

   如果您选择 **S3**，请在 **Source Info (源信息)** 字段中输入 S3 存储桶中 InSpec 配置文件的有效 URL。

   有关 Systems Manager 如何与 GitHub 和 Amazon S3 集成的更多信息，请参阅 [从 GitHub 运行脚本](integration-remote-scripts.md)。

1. 在 **Targets**（目标）部分中，通过指定标签、手动选择实例或边缘设备或指定资源组，选择要在其上运行此操作的托管式节点。
**提示**  
如果未列出您希望看到的托管式节点，请参阅 [排除托管式节点可用性的问题](fleet-manager-troubleshooting-managed-nodes.md) 以获取故障排除技巧。

1. 在 **Specify schedule (指定计划)** 部分中，使用计划生成器选项创建计划，该计划将指定您希望运行合规性扫描的时间。

1. 对于 **Rate control（速率控制）**：
   + 对于 **Concurrency**（并发），请指定要同时运行该命令的托管式节点的数量或百分比。
**注意**  
如果您通过指定应用于托管式节点的标签或指定 AWS Resource Groups 来选择目标，但不确定有多少个托管式节点已被设为目标，则可通过指定百分比来限制可同时运行该文档的目标的数量。
   + 对于 **Error threshold**（错误阈值），请指定当命令在一定数量或百分比的节点上失败后，何时在其他托管式节点上停止运行该命令。例如，如果您指定三个错误，Systems Manager 将在收到第四个错误时停止发送该命令。仍在处理该命令的托管式节点也可能发送错误。

1. （可选）对于 **输出选项**，要将命令输出保存到文件，请选中 **将命令输出写入 S3 存储桶** 框。在输入框中输入存储桶和前缀（文件夹）名称。
**注意**  
授予将数据写入 S3 存储桶的能力的 S3 权限，是分配给实例的实例配置文件（适用于 EC2 实例）或 IAM 服务角色（混合激活的计算机）的权限，而不是执行此任务的 IAM 用户的权限。有关更多信息，请参阅[配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)或[为混合环境创建 IAM 服务角色](hybrid-multicloud-service-role.md)。此外，如果指定的 S3 存储桶位于不同的 AWS 账户 中，请确保与该托管式节点关联的实例配置文件或 IAM 服务角色具有写入该存储桶的所需权限。

1. 选择**创建关联**。系统将创建关联并自动运行合规性扫描。

1. 等待几分钟，以完成扫描，然后在导航窗格中选择**合规性**。

1. 在**对应的托管式实例**中，找到 **Compliance Type**（合规性类型）列为 **Custom:Inspec** 的节点。

1. 选择一个节点 ID 来查看不合规状态的详细信息。

### 使用 Run Command (AWS CLI) 运行 InSpec 合规性扫描
<a name="integration-chef-inspec-running-cli"></a>

1. 安装并配置 AWS Command Line Interface（AWS CLI）（如果尚未执行该操作）。

   有关更多信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

1. 运行以下命令之一，从 GitHub 或 Amazon S3 运行 InSpec 配置文件。

    命令使用以下参数：
   + **sourceType**：GitHub 或 Amazon S3
   + **sourceInfo**：GitHub 或 S3 存储桶中 InSpec 配置文件文件夹的 URL。该文件夹必须包含基本 InSpec 文件 (\$1.yml) 和所有相关控件 (\$1.rb)。

   **GitHub**

   ```
   aws ssm send-command --document-name "AWS-RunInspecChecks" --targets '[{"Key":"tag:tag_name","Values":["tag_value"]}]' --parameters '{"sourceType":["GitHub"],"sourceInfo":["{\"owner\":\"owner_name\", \"repository\":\"repository_name\", \"path\": \"Inspec.yml_file"}"]}'
   ```

   见下列。

   ```
   aws ssm send-command --document-name "AWS-RunInspecChecks" --targets '[{"Key":"tag:testEnvironment","Values":["webServers"]}]' --parameters '{"sourceType":["GitHub"],"getOptions":"branch:master","sourceInfo":["{\"owner\":\"awslabs\", \"repository\":\"amazon-ssm\", \"path\": \"Compliance/InSpec/PortCheck\"}"]}'
   ```

   **Amazon S3**

   ```
   aws ssm send-command --document-name "AWS-RunInspecChecks" --targets '[{"Key":"tag:tag_name","Values":["tag_value"]}]' --parameters'{"sourceType":["S3"],"sourceInfo":["{\"path\":\"https://s3.aws-api-domain/amzn-s3-demo-bucket/Inspec.yml_file\"}"]}'
   ```

   见下列。

   ```
   aws ssm send-command --document-name "AWS-RunInspecChecks" --targets '[{"Key":"tag:testEnvironment","Values":["webServers"]}]' --parameters'{"sourceType":["S3"],"sourceInfo":["{\"path\":\"https://s3.aws-api-domain/amzn-s3-demo-bucket/InSpec/PortCheck.yml\"}"]}' 
   ```

1. 运行以下命令以查看合规性扫描的摘要。

   ```
   aws ssm list-resource-compliance-summaries --filters Key=ComplianceType,Values=Custom:Inspec
   ```

1. 运行以下命令以查看不合规的节点的详细信息。

   ```
   aws ssm list-compliance-items --resource-ids node_ID --resource-type ManagedInstance --filters Key=DocumentName,Values=AWS-RunInspecChecks
   ```