静态代码扫描

敏捷办法的主要优点之一是它固有的变更灵活性。您的代码能够根据客户需求不断发展,一起坚持软件质量的高标准。为了适应这种灵活性,一定程度的漏洞和缺点必然会渗透到您的代码中。 静态代码分析东西协助您在开发的初始阶段辨认这些风险,乃至不需要履行,使开发人员能够保护强壮的代码基础。

tfsec

Tfsec便是这样一种静态分析东西,它能够协助您辨认Terraform代码中的过错装备和安全风险。 tfsec协助您辨认的一些风险示例如下:

  • 可揭露拜访的s3存储桶
  • CIDR块标准中的默许路由(0.0.0.0/0)
  • 资源上缺少加密

Terragrunt

基本上,它是一个包装器,答应您在terraform模板中注入“值”,这样您就能够跨环境重用组件,坚持基础设施代码的枯燥(不要重复!) 因此,对于设置RDS实例的代码片段..

terraform {
  required_providers {
    aws = {
    source  = "hashicorp/aws"
    version = "~> 3.27"
    }
  }
  required_version = ">= 0.14.2"
}
resource "aws_db_instance" "rds_instance" {
  allocated_storage = 20
  identifier = "rds-terraform"
  storage_type = "gp2"
  engine = "mysql"
  engine_version = "8.0.27"
  instance_class = "db.t2.micro"
  name = var.database_name
  username = var.username
  password = var.password
  storage_encrypted  = var.storage_encrypted    
  publicly_accessible    = var.publicly_accessible
  skip_final_snapshot    = true
  tags = {
    Name = "ExampleRDSServerInstance"
  }
}

…相应的terragrunt代码如下所示..

terraform {
  source = "path/to/terraform/file"
}
inputs = {
  database_name = "DATABASE_NAME"
  username = "XXXXXXXXXX"
  password = "XXXXXXXXXX"
  publicly_accessible = true
  storage_encrypted = false
}

tfsec X Terragrunt

当你使你的terraform模板通用时,更多的变量将被引入到你的。tf文件”。因此,您很难辨认过错装备,由于大多数装备都是“可变的”。 在上面的Terragrunt文件中,我故意留下了几个过错的装备..

publicly_accessible = true
storage_encrypted = false

这两者分别是严重和高度的漏洞。 可是假如您在上面的Terraform文件上运转tfsec指令,您将看到如下报告..

结合tfsec与Terragrunt保护基础设施即代码

明显,tfsec无法辨认“可变”装备是过错的。 这是由于tfsec只与Terraform兼容。它不知道Terragrunt文件的内容及其“输入”。

措施1

通常情况下,您会将Terraform和Terragrunt文件放在不同的存储库中。当您运用Terraform注册表中的模块或供给程序时,这种情况变得愈加重要。 在这里,您没有才能在基础设施“源代码”上运转tfsec..由于它存在于远程。 嗯,这不应该是一个担心的原因,由于每逢你第一次运转Terraform方案时,一切的远程Terraform文件都会被提取。你只是在文件夹结构中看不到它们。要拜访这些文件,能够运用ls-a列出途径中的一切隐藏文件

结合tfsec与Terragrunt保护基础设施即代码

在.terragrunt-cache下,向下几个目录,您将找到您的terraform文件 实际上,您现在能够在terragrunt.hcl文件所在的方位运转tfsec指令。 Tfsec将查找该文件夹级别的一切tf文件,乃至是.terragrunt-cache下的文件 假如您运用作业流来调配基础结构,您能够依照以下过程序列对代码运转安全扫描,即

1.首要运用terraform plan创建方案 2.在同一文件夹级别上运转tfsec

措施2

在上一步中,咱们解决了在terragrunt中运用tfsec的问题。现在,这种办法本身就足以让大多数人开始运用,但它并不能解决“可变”装备带来的问题。 即运用这种办法,tfsec也会告知咱们..

结合tfsec与Terragrunt保护基础设施即代码

尽管tfsec与Terragrunt输入不兼容,但它确实为咱们供给了一种运用-tfvars-file选项为变量注入值的办法。 tfvars文件是Terraform答应咱们传递可变装备值的另一种方式。 一个样本terragrunt.tfvars文件如下所示。

database_name = "DATABASE_NAME"
username = "XXXXXXXXXX"
password = "XXXXXXXXXX"
publicly_accessible = true
storage_encrypted = false

请注意,它十分类似于terragrunt的输入块。盐酸.. 假如咱们有办法改变。hcl文件到。tfvars,咱们能够走了.. 您能够运用自己喜爱的编程语言中的脚原本提取这些数据,但我喜爱运用正则表达式.. 匹配正则表达式输入={((.\n))}并捕获组并捕获组1,咱们得到上面提到的.tfvars文件.. 假如咱们运转tfsec。–tfvars-文件terragrunt.tfvars指令,咱们得到预期的成果。

结合tfsec与Terragrunt保护基础设施即代码

尽管这个办法有点“老套”,但这是我唯一能想到的办法,在呈现 terragrunt+tfsec生态系统。

本文正在参加「金石方案 . 分割6万现金大奖」