基于Chef InSpec的基础设施测试

2020 年 11 月 09 日

基于Chef InSpec的基础设施测试

1 Chef InSpec 介绍


任何业务都依赖于基础设施环境。近年来,基础设施领域已发生了巨大的变化。从最初的传统数据中心到数据中心托管服务,而如今,基础设施即服务和云平台在企业中更受欢迎。因此,大多数企业正在将其工作负载从本地数据中心迁移到云平台。


为了部署和管理这些复杂的基础设施配置,很多企业使用代码即基础设施(IaC)。当您使用 IaC 在 AWS 云平台上创建成百上千个资源时,如何知道代码按预期方式部署了这些资源?这些资源是否遵守合规性和安全性措施?我们并不确定,因此需要基础设施测试程序。


Chef InSpec 是一个用于测试和审核应用程序和基础设施的开源代码框架。


Chef InSpec 的工作原理是将系统的实际状态与您编写的 Chef InSpec 代码表达的期望状态进行比较。Chef InSpec 可以检测违规并以报告的形式显示。


2 Chef InSpec 入门


下面将主要介绍 Chef InSpec 的安装及环境配置。


2.1 Chef InSpec 安装


Chef InSpec 提供了适配多种操作系统环境的安装包,支持的操作系统类型如下:


  • Amazon Linux

  • Debian GNU/Linux

  • Red Hat Enterprise Linux/CentOS

  • macOS

  • SUSE Linux Enterprise Server

  • Ubuntu Linux

  • Windows


软件包的下载地址如下:


https://downloads.chef.io/products/inspec


本文以 Amazon Linux 环境为例进行说明,下载当前最新的 Chef InSpec 软件包,使用下面的命令进行 Chef InSpec 安装:


rpm -ivh inspec-<version>.x86_64.rpm
复制代码


安装完成后可以看到 inspec 命令可以正常运行,并提示 inspec 命令可以使用的参数帮助信息



2.2 Chef InSpec 配置介绍


使用 Chef InSpec 时主要需要弄清楚下面的三部分:


  • Command-line interface

  • Profile

  • Resource


InSpec CLI 使用 local,SSH,WinRM,Docker 或 AWS 等连接方式,可针对不同基础设施目标运行测试和审核。常用命令说明如下:


命令 说明
archive 将配置文件压缩成tar.gz(默认)或zip文件
check 验证指定路径上的所有测试
exec 针对指定目标运行所有测试文件。加载给定的配置文件,并在需要时获取其依赖项。然后连接到目标并执行配置文件中包含的所有控件。输出测试结果。
help 查看特定命令的帮助信息
shell 打开一个交互式的调试终端
version 打印此工具的版本


Chef InSpec 支持创建复杂的测试和合规性配置文件,每个 profile 文件都是独立的结构,具有自己的执行流程。用户可以自己编写 profile 文件,还可以在社区支持的 Chef Supermarket 和 GitHub 上找到别人写的 profile。


Profile 文件通常具有下面的目录结构:


examples/profile├── README.md├── controls│   ├── example.rb├── libraries│   └── extension.rb└── inspec.yml
复制代码


其中各个文件和目录的说明如下:


  • md是用于解释profile的适用范围和用法

  • controls是所有测试用例所在的目录

  • libraries是用于存放扩展Chef InSpec资源代码的目录

  • yml包含配置文件的描述


Chef InSpec 拥有 80 多种可供使用的资源。如果您需要的资源尚未提供,也可以编写自己的自定义资源。Chef InSpec 支持的资源列表如下:


https://docs.chef.io/inspec/resources/


2.3 使用 Chef InSpec 测试 AWS 资源


典型的使用环境如下图所示,在数据中心内使用 Chef InSpec 对 AWS 进行基础设施资源测试。



从本地数据中心连接 AWS 环境需要使用 Access Key 和 Secret Access Key(AKSK)。在企业环境中,通常会将 IAM User 集中在一个 Master 账号中进行管理,用户使用 IAM User 登陆 AWS 环境,然后再用 Assume Role 的方式操作其它 AWS 账户。


使用 Chef InSpec 连接 AWS 前,首先需要创建 IAM 用户,并生成 AKSK。另外在 UseCase 账号中,需要创建 Assume Role,给予适当的权限并允许 Master 账号中的 IAM User 切换到 Use Case 账号。


在本地数据中心连接 AWS 环境的配置示例如下:


# cat .aws/credentials [default]aws_access_key_id = <Access Key>aws_secret_access_key = <Secret Access Key>
# cat ~/.aws/config [default]region = cn-north-1output = json
[profile usecase]role_arn = <UseCase Account IAM Role Arn>
复制代码


使用如下命令创建示例 profile,该命令会自动生成 profile 目录结构。


# inspec init profile --platform aws example
─────────────────────────── InSpec Code Generator ───────────────────────────
Creating new profile at /root/example • Creating file README.md • Creating file attributes.yml • Creating directory controls • Creating file controls/example.rb • Creating file inspec.yml
复制代码


示例代码的测试内容在 controls/example.rb 文件中


# copyright: 2018, The Authors
title "Sample Section"
aws_vpc_id = attribute("aws_vpc_id", value: "", description: "Optional AWS VPC identifier.")
# You add controls herecontrol "aws-single-vpc-exists-check" do # A unique ID for this control. only_if { aws_vpc_id != "" } # Only run this control if the `aws_vpc_id` attribute is provided. impact 1.0 # The criticality, if this control fails. title "Check to see if custom VPC exists." # A human-readable title. describe aws_vpc(aws_vpc_id) do # The test itself. it { should exist } endend
# Plural resources can be inspected to check for specific resource details.control "aws-vpcs-check" do impact 1.0 title "Check in all the VPCs for default sg not allowing 22 inwards" aws_vpcs.vpc_ids.each do |vpc_id| describe aws_security_group(vpc_id: vpc_id, group_name: "default") do it { should allow_in(port: 22) } end endend
control "aws-vpcs-multi-region-status-check" do # A unique ID for this control. impact 1.0 # The criticality, if this control fails. title 'Check AWS VPCs in all regions have status "available"' # A human-readable title. aws_regions.region_names.each do |region| # Loop over all available AWS regions aws_vpcs(aws_region: region).vpc_ids.each do |vpc| # Find all VPCs in a single AWS region describe aws_vpc(aws_region: region, vpc_id: vpc) do # The test itself. it { should exist } # Confirms AWS VPC exists it { should be_available } # Confirms AWS VPC has status "available" end end endend
复制代码


该测试的主要内容包含:


  • 如果传入指定的VPC ID,则检查指定的VPC是否存在

  • 检查所有VPC的安全组内是否包含允许22端口访问的策略

  • 检查所有区域内的状态为available的VPC


执行如下命令运行该 profile 对 AWS 环境进行测试:


# inspec exec example -t aws://cn-north-1/usecase
Profile: AWS InSpec Profile (example)Version: 0.1.0Target: aws://cn-north-1
↺ aws-single-vpc-exists-check: Check to see if custom VPC exists. ↺ Skipped control due to only_if condition. ✔ aws-vpcs-check: Check in all the VPCs for default sg not allowing 22 inwards ✔ EC2 Security Group ID: sg-01d67dds39bcffe17 Name: default VPC ID: vpc-032cdd155d561c7bf is expected to allow in {:port=>22} ✔ aws-vpcs-multi-region-status-check: Check AWS VPCs in all regions have status "available" ✔ VPC vpc-032cdd155d561c7bf in cn-north-1 is expected to exist ✔ VPC vpc-032cdd155d561c7bf in cn-north-1 is expected to be available
Profile: Amazon Web Services Resource Pack (inspec-aws)Version: 1.31.0Target: aws://cn-north-1
No tests executed.
Profile Summary: 2 successful controls, 0 control failures, 1 control skippedTest Summary: 3 successful, 0 failures, 1 skipped
复制代码


3 总结


在实际的应用场景中,可以将 Chef InSpec 用于 Terraform 等 IaC 工具进行环境部署之后的测试与审核,另外,还可以将 Chef InSpec 与 Jenkins 等 CI/CD 工具集合使用,以持续测试您部署的基础架构,以确保其符合合规性策略。


作者介绍


卢冲 – 亚马逊 AWS 专业服务团队云架构咨询顾问。负责企业级客户的云架构设计和优化、云上运维咨询和技术实施。曾就职于 Novell、RedHat 等企业,具有多年企业级客户项目实施经验。


本文转载自亚马逊 AWS 官方博客。


原文链接


基于Chef InSpec的基础设施测试


2020 年 11 月 09 日 14:00554

评论

发布
暂无评论
发现更多内容

闲聊胡扯

C语言与CPP编程

随笔杂谈

Elasticsearch初步认识

枫林

Java elasticsearch ES

深挖 Redis 6.0 源码—— SDS

yanglbme

redis 源码 源码分析

关于MySQL参数,这些你要知道

Simon

MySQL 参数

终端传感了解吗?18个知识点为你扫盲

华为云开发者社区

IoT 信息化 传感器 传输协议 无线传输器

话题讨论 | 你的桌面上会放哪些有趣的小摆件?

InfoQ写作平台

工作 话题讨论 办公室

你真的了解 Base64 吗

hepingfly

Java base64 编码

微服务下数据一致性的几种实现方式

xcbeyond

微服务 BASE理论 数据一致性

欢迎观看 AzureShow

亮小猪

云计算 开源 技术社区 azure 视频

Java集合源码学习笔记,Java程序员面试必备基础知识

Java成神之路

Java 程序员 面试 集合 架构师

在Alibaba广受喜爱的“Java突击宝典”简直太牛了

Java成神之路

Java 阿里巴巴 程序员 面试 架构师

区块链usdt支付平台搭建|OTC承兑跑分系统开发

WX13823153201

区块链usdt支付平台搭建

承兑商USDT支付系统平台开发|跑分系统搭建

WX13823153201

还不懂JVM的设计原理与实现?赶紧跟着字节大牛“身临其境”

周老师

Java 编程 程序员 架构 面试

再爆安全漏洞,这次轮到Jackson了,竟由阿里云上报

YourBatman

Jackson Fastjson 安全漏洞 CVE-2020-24616

甲方日常 7

句子

工作 随笔杂谈 日常

《我要进大厂》之mysql夺命连环13问

艾小仙

Java MySQL 面试题 Java 分布式 大厂

AtmoicXXX与AtmoicXXXArray源码分析

Darren

源码 内存布局 CAS java 并发 AtmoicXXX

Docker 安装和简单使用

枫林

Docker

面试官问:Spring Boot中Tomcat是怎么启动的

Java小咖秀

tomcat 面试 springboot

mPaas 厂商push不通排查指南

阿里云金融线TAM SRE专家服务团队

android push

Flink检查点存在的性能影响-16

小知识点

scala 大数据 flink

数字货币交易所系统开发|交易所搭建源码

WX13823153201

跟随美团技术大牛的脚步,感受虚拟机源码及调优所带来的独特魅力

周老师

Java 编程 程序员 架构 面试

浮点数比较的精度问题

C语言与CPP编程

c c++

Docker -快速安装Elasticsearch

枫林

最通俗易懂的 Redis 架构模式详解

哈喽沃德先生

redis 架构模式 redis集群 redis哨兵 redis主从

Pod安装神策SDK报错Remote branch v2.1.3 not found in upstream origin

凌宇之蓝

ios 小程序flutter, 跨平台 CocoaPods pod React Native

oeasy教您玩转linux010203显示logo

o

联盟:互联网时代的人才变革

非著名程序员

互联网 个人成长 人才 人才发展 突破圈层,个体崛起

百度被绿了?

程序员生活志

百度 互联网 头条

基于Chef InSpec的基础设施测试-InfoQ