一、背景
随着云计算的普及和企业对基础设施即代码(IaC)的采用增加,确保云基础设施的安全和合规性变得至关重要。Azure作为领先的云服务提供商之一,为企业提供了强大的基础设施和服务,而Terraform作为流行的IaC工具,则为云资源的自动化部署和管理提供了有效的解决方案。
然而,单纯依赖Terraform配置并不足以保证部署的安全性和符合性。因此,利用符合性测试工具对IaC代码进行全面的安全审计和合规性检查显得尤为重要。
terraform-compliance 是一个基于 BDD(行为驱动开发)的开源工具,专门用于执行基础设施即代码的合规性测试。它允许开发团队编写简单易懂的测试场景,来验证Terraform配置是否符合特定的安全和合规性标准。
结合Azure的资源管理和Terraform的强大能力,使用 terraform-compliance 可以有效地确保在云环境中部署的资源配置符合公司政策、安全最佳实践以及法规要求。通过这种方法,企业能够更加自信地管理其云基础设施,减少潜在的安全风险和合规问题。
二、合规性检查
符合性测试是一种非功能性测试技术,用于确定系统是否符合规定的标准。 合规性测试也称为一致性测试。
大多数软件团队会进行分析来检查标准是否得到恰当地采用和实施。 通常,这些团队共同协作来提升标准,这转而又会促进质量的提升。
执行符合性测试时,需要考虑两个主要概念:符合性测试和符合性检查。
- 符合性测试可确保每个开发生命周期阶段的结果符合商定的要求。
- 在项目开始时,应将符合性检查集成到开发周期中。 如果要求本身未得到充分记录,那么尝试在稍后的阶段添加符合性检查会变得愈发困难。
执行符合性检查非常简单。 我们针对开发生命周期的每个阶段制定和记录了一套标准和流程。 每个阶段的结果都与记录的要求进行比较。 测试结果是指不符合预定标准的任何“差距”。 通过检查过程完成符合性测试,评审过程的结果应记录下来。
我们来看一个具体的示例:
一个常见的问题是,当多名开发人员应用不兼容的更改时,环境会崩溃。 假设有个人进行更改并应用了资源,例如在测试环境中创建虚拟机 (VM)。 之后,另一个人应用了不同版本的代码来预配该 VM 的另一版本。 需要在这里进行监督,确保符合设定规则。
要解决此问题,一种方法是定义标记资源的策略,例如使用 role 和 creator 标记。 定义策略后,Terraform-compliance 之类的工具被采用来确保遵循策略。
Terraform-compliance 侧重于负面测试。 负面测试是确保系统可正常处理意外输入或不需要的行为的过程。 模糊处理就是一种负面测试。 通过模糊处理,接收输入的系统会经过测试,以确保它可安全地处理意外的输入。
幸运的是,Terraform 是任何创建、更新或销毁云基础结构实体的 API 的抽象层。 Terraform 还确保本地配置和远程 API 响应处于同步状态。由于 Terraform 主要用于云 API,因此我们仍然需要一种方法来确保针对基础结构部署的代码遵循特定的策略。 Terraform-compliance 是一种免费的开源工具,它为 Terraform 配置提供了此功能。
使用 VM 示例时,符合性策略可能如下所示:“如果要创建 Azure 资源,则它必须包含标记”。
Terraform-compliance 工具提供了一个测试框架,你可在该框架中创建与示例类似的策略。 然后,你可针对 Terraform 执行计划运行这些策略。
通过 Terraform-compliance 可应用 BDD(即行为驱动开发)原则。 BDD 是一个协作过程;在此过程中,所有利益干系人相互协作,共同定义系统应执行的操作。
这些利益干系人通常包括开发人员、测试人员,以及对正在开发的系统有既得利益或将受其影响的任何人。 BDD 的目标是鼓励团队创建具体的示例,来表达对系统行为的共识。
三、安装
pip install terraform-compliance
四、检查符合性测试示例
在本文前面的部分,你了解了为测试环境创建 VM 的符合性测试示例。 本部分介绍如何将该示例转换为 BDD 功能和方案。
首先使用 Cucumber(这是一种用于支持 BDD 的工具)来表示规则:
when creating Azure resources, every new resource should have a tag
上一规则转换如下:
If the resource supports tags Then it must contain a tag And its value must not be null
然后,Terraform HCL 代码遵循以下规则:
resource "random_uuid" "uuid" {} resource "azurerm_resource_group" "rg" { name = "rg-hello-tf-${random_uuid.uuid.result}" location = var.location tags = { environment = "dev" application = "Azure Compliance" } }
第一个策略可编写作为 BDD 功能方案,如下所示:
Feature: Test tagging compliance # /target/src/features/tagging.feature Scenario: Ensure all resources have tags If the resource supports tags Then it must contain a tag And its value must not be null
以下代码显示了针对特定标记的测试:
Scenario Outline: Ensure that specific tags are defined If the resource supports tags Then it must contain a tag <tags> And its value must match the "<value>" regex Examples: | tags | value | | Creator | .+ | | Application | .+ | | Role | .+ | | Environment | ^(prod\|uat\|dev)$ |
五、运行符合性测试示例
前期
terraform init terraform validate terraform plan -out main.tfplan #若要将执行计划转换为符合性步骤的 JSON,请运行 terraform show。 terraform show -json main.tfplan > main.tfplan.json # 下载合规规则 https://github.com/terraform-compliance/user-friendly-features.git # 运行 terraform-compliance -p main.tfplan.json -f ./user-friendly-features
检验结果,根据提升修改tf代码后,再次运行检测。
terraform show -json main.tfplan > main.tfplan.json # 运行 terraform-compliance -f features -p main.tfplan.json
六、Github Action集成
jobs: terraform: name: terraform CI runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: hashicorp/setup-terraform@v1 - name: terraform plan id: plan run: | terraform init && terraform plan -out=plan.out && terraform show -json plan.out > plan.out.json - name: terraform-compliance uses: terraform-compliance/github_action@main with: plan: plan.out.json features: ssh://git@github.com/terraform-compliance/user-friendly-features.git