使用 Chef InSpec 配置文件与 Systems Manager 合规性 - AWS Systems Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

使用 Chef InSpec 配置文件与 Systems Manager 合规性

AWS Systems Manager 与集成Chef InSpec。InSpec 是一个开源的测试框架,您可以使用它创建人工可读的配置文件,以便存储在 GitHub 或 Amazon Spems Simple Storage Service (Amazon S3) 中。然后,您可以使用 Systems Manager 运行合规性扫描并查看合规和不合规的实例。配置文件列出您的计算环境的安全性、合规性或策略要求。例如,您可以使用 AWS Systems Manager 的功能创建配置文件以便在您扫描实例时执行以下检查:

  • 检查特定端口是否处于打开或关闭状态。

  • 检查特定应用程序是否正在运行。

  • 检查某些软件包是否已安装。

  • 检查 Windows 注册表项中的特定属性。

您可以为使用 Systems Manager 管理的 Amazon Elastic Compute Cloud (Amazon EC2) 实例和本地服务器或虚拟机 (VM) 创建 InSpec 配置文件。下面的示例 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) 在 Ruby 中编写这些控件。您还可以使用由大型 InSpec 用户社区创建的配置文件。例如,GitHub 上的 DevSec chef-os-hardening 项目包含许多配置文件,可帮助您保护实例和服务器。您可以在 GitHub 或 Amazon S3 中创作和存储配置文件。

工作原理

下面介绍了 InSpec 配置文件与合规性结合使用的过程:

  1. 要么识别要使用的预定义 InSpec 配置文件,要么创建您自己的配置文件。您可以使用 GitHub 上的预定义配置文件来开始操作。有关如何创建您自己的 InSpec 配置文件的信息,请参阅 Chef InSpec 配置文件

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

  3. 使用 Systems Manager 文档(SSM 文档)对您的 InSpec 配置文件运行合规性检查AWS-RunInspecChecks。您可以使用 Run Command (AWS Systems Manager 的一项功能) 开始合规性扫描,也可以使用 State Manager (AWS Systems Manager) 安排定期合规性扫描。

  4. 使用 Compliance API 或 Compliance 控制台识别不合规的实例。

注意

请注意以下信息。

  • Chef 使用您的实例上的客户端来处理配置文件。您不需要安装客户端。当 Systems Manager 运行 SSM 文档AWS-RunInspecChecks时,系统会检查客户端是否已安装。如果未安装,Systems Manager 会在扫描期间安装 Chef 客户端,然后在扫描完成后卸载客户端。

  • 运行 SSM 文档AWS-RunInspecChecks(如本主题中所述)分配一个符合性条目Custom:Inspec添加到每个目标实例。若要分配此合规性类型,文档将调用PutComplianceItemsAPI 操作。

运行 InSpec 合规性扫描

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

使用状态管理器(控制台)运行 InSpec 合规性扫描

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

  1. 以下网址打开 AWS Systems Manager 控制台:https://console.aws.amazon.com/systems-manager/

  2. 在导航窗格中,选择状态管理器

    -或者-

    如果 AWS Systems Manager 主页首先打开,请选择菜单图标 ( )以打开导航窗格,然后选择状态管理器

  3. 选择创建关联

  4. 提供关联详细信息部分,输入一个名称。

  5. Document (文档) 列表中,选择 AWS-RunInspecChecks

  6. 文档版本列表中,选择运行时的最新版本

  7. 参数部分的源类型列表中,选择 GitHubS3

    如果选择 GitHub,则在源信息字段中输入公有或私有 GitHub 存储库中 InSpec 配置文件的路径。以下是由 Systems Manager 团队从以下位置提供的公有配置文件的示例路径: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 运行脚本

  8. 目标部分,指定标签、手动选择实例或指定资源组以确定要在其中运行该操作的实例。

    注意

    如果未列出您希望看到的 Amazon EC2 实例,请参阅Amazon EC2 托管实例可用性疑难解答了解故障排除提示。

  9. 指定时间表部分,使用计划生成器选项创建计划,该计划指定要运行合规性扫描的时间。

  10. 适用于速率控制

    • 对于并发,请指定要同时运行该命令的实例数或百分比。

      注意

      如果通过指定应用于托管实例的标签或通过指定 AWS 资源组选择了目标,但不确定有多少个实例被定位,则可以通过指定百分比来限制可同时运行此文档的实例的数量。

    • 对于错误阈值,请指定在一定数量或百分比的实例上失败后何时在其他实例上停止运行该命令。例如,如果您指定三个错误,在收到第四个错误时,Systems Manager 会停止发送该命令。仍在处理命令的实例也可能发送错误。

  11. (可选)对于 Output options (输出选项),要将命令输出保存到文件,请选中 Write command output to an S3 bucket (将命令输出写入 S3 存储桶) 框。在框中输入存储桶和前缀(文件夹)名称。

    注意

    授予将数据写入 S3 存储桶的能力的 S3 权限是分配给实例的实例配置文件的权限,而不是执行此任务的 IAM 用户的权限。有关更多信息,请参阅 。为创建 IAM 实例配置文件。此外,如果指定的 S3 存储桶位于不同的 AWS 账户中,请确保与该实例关联的实例配置文件具有写入该存储桶的必要权限。

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

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

  14. 对应的托管实例中,找到合规性类型列为 Custom:Inspec 的实例。

  15. 选择一个实例 ID 来查看不合规状态的详细信息。

使用运行命令 (AWS CLI) 运行 InSpec 合规性扫描

  1. 如果您尚未安装和配置 AWS Command Line Interface (AWS CLI)。

    想要了解有关信息,请参阅安装或升级 AWS 命令行工具

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

    命令使用以下参数:

    • sourceType:GitHub 或 Amazon S3

    • sourceInfo:GitHub 或 S3 存储桶中 InSpec 配置文件文件夹的 URL。该文件夹必须包含基本 InSpec 文件 (*.yml) 和所有相关控件 (*.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.amazonaws.com/DOC-EXAMPLE-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.amazonaws.com/DOC-EXAMPLE-BUCKET/InSpec/PortCheck.yml\"}"]}'
  3. 运行以下命令以查看合规性扫描的摘要。

    aws ssm list-resource-compliance-summaries --filters Key=ComplianceType,Values=Custom:Inspec
  4. 运行以下命令以查看不合规的实例的详细信息。

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