将 Chef InSpec 配置文件与 Systems Manager Compliance 结合使用
AWS Systems Manager 与 Chef
InSpec
-
检查特定端口是否处于打开或关闭状态。
-
检查特定应用程序是否正在运行。
-
检查某些软件包是否已安装。
-
检查 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)
工作方式
下面演示了 InSpec 配置文件与 Compliance 结合使用的过程:
-
要么识别要使用的预定义 InSpec 配置文件,要么创建您自己的配置文件。您可以使用 GitHub 上的预定义配置文件
来开始操作。有关如何创建自己的 InSpec 配置文件的信息,请参阅 ChefChef InSpec 配置文件 。 -
将配置文件存储在公有或私有 GitHub 存储库或者 S3 存储桶中。
-
使用 Systems Manager 文档(SSM 文档)
AWS-RunInspecChecks
,借助您的 InSpec 配置文件运行 Compliance。您可以使用 AWS Systems Manager 的功能 Run Command 开始按需合规性扫描,也可以使用 AWS Systems Manager 的功能 State Manager 计划定期合规性扫描。 -
使用 Compliance API 或 Compliance 控制台识别不合规的节点。
注意
请注意以下信息。
-
Chef 使用节点上的客户端来处理配置文件。您不需要安装客户端。当 Systems Manager 运行 SSM 文档
AWS-RunInspecChecks
时,系统将检查是否已安装客户端。如果未安装,Systems Manager 会在扫描期间安装 Chef 客户端,然后在扫描完成后卸载该客户端。 -
运行 SSM 文档
AWS-RunInspecChecks
(如本主题中所述)会将类型为Custom:Inspec
的合规性条目分配到每个目标节点。要分配此合规性类型,该文档将调用 PutComplianceItems API 操作。
运行 InSpec 合规性扫描
本节包含有关如何使用 Systems Manager 控制台和 AWS Command Line Interface (AWS CLI) 运行 InSpec 合规性扫描的信息。控制台过程介绍了如何配置 State Manager 来运行该扫描。AWS CLI 过程介绍了如何配置 Run Command 来运行该扫描。
使用 State Manager 运行 InSpec 合规性扫描(控制台)
使用 AWS Systems Manager 控制台通过 State Manager 运行 InSpec 合规性扫描
访问 https://console.aws.amazon.com/systems-manager/
,打开 AWS Systems Manager 控制台。 在导航窗格中,选择 State Manager。
-
选择 Create association(创建关联)。
-
在提供关联详细信息部分,输入一个名称。
-
在 Document (文档) 列表中,选择
AWS-RunInspecChecks
。 -
在文档版本列表中,选择运行时的最新版本。
-
在参数部分的源类型列表中,请选择 GitHub 或 S3。
如果选择 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 运行脚本。
在 Targets(目标)部分中,通过指定标签、手动选择实例或边缘设备或指定资源组,选择要在其上运行此操作的托管式节点。
提示
如果未列出您希望看到的托管式节点,请参阅 排除托管式节点可用性的问题 以获取故障排除技巧。
-
在 Specify schedule (指定计划) 部分中,使用计划生成器选项创建计划,该计划将指定您希望运行合规性扫描的时间。
对于 Rate control(速率控制):
-
对于 Concurrency(并发),请指定要同时运行该命令的托管式节点的数量或百分比。
注意
如果您通过指定应用于托管式节点的标签或指定 AWS Resource Groups 来选择目标,但不确定有多少个托管式节点已被设为目标,则可通过指定百分比来限制可同时运行该文档的目标的数量。
-
对于 Error threshold(错误阈值),请指定当命令在一定数量或百分比的节点上失败后,何时在其他托管式节点上停止运行该命令。例如,如果您指定三个错误,Systems Manager 将在收到第四个错误时停止发送该命令。仍在处理该命令的托管式节点也可能发送错误。
-
(可选)对于 输出选项,要将命令输出保存到文件,请选中 将命令输出写入 S3 存储桶 框。在输入框中输入存储桶和前缀(文件夹)名称。
注意
授予将数据写入 S3 存储桶的能力的 S3 权限,是分配给实例的实例配置文件(适用于 EC2 实例)或 IAM 服务角色(混合激活的计算机)的权限,而不是执行此任务的 IAM 用户的权限。有关更多信息,请参阅配置 Systems Manager 所需的实例权限或为混合环境创建 IAM 服务角色。此外,如果指定的 S3 存储桶位于不同的 AWS 账户 中,请确保与该托管式节点关联的实例配置文件或 IAM 服务角色具有写入该存储桶的所需权限。
-
选择创建关联。系统将创建关联并自动运行合规性扫描。
-
等待几分钟,以完成扫描,然后在导航窗格中选择合规性。
-
在对应的托管式实例中,找到 Compliance Type(合规性类型)列为 Custom:Inspec 的节点。
-
选择一个节点 ID 来查看不合规状态的详细信息。
使用 Run Command (AWS CLI) 运行 InSpec 合规性扫描
安装并配置 AWS Command Line Interface(AWS CLI)(如果尚未执行该操作)。
有关信息,请参阅安装或更新 AWS CLI 的最新版本。
-
运行以下命令之一,从 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.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\"}"]}' -
-
运行以下命令以查看合规性扫描的摘要。
aws ssm list-resource-compliance-summaries --filters Key=ComplianceType,Values=Custom:Inspec
-
运行以下命令以查看不合规的节点的详细信息。
aws ssm list-compliance-items --resource-ids
node_ID
--resource-type ManagedInstance --filters Key=DocumentName,Values=AWS-RunInspecChecks