静态代码扫描
敏捷办法的主要优点之一是它固有的变更灵活性。您的代码能够根据客户需求不断发展,一起坚持软件质量的高标准。为了适应这种灵活性,一定程度的漏洞和缺点必然会渗透到您的代码中。 静态代码分析东西协助您在开发的初始阶段辨认这些风险,乃至不需要履行,使开发人员能够保护强壮的代码基础。
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无法辨认“可变”装备是过错的。 这是由于tfsec只与Terraform兼容。它不知道Terragrunt文件的内容及其“输入”。
措施1
通常情况下,您会将Terraform和Terragrunt文件放在不同的存储库中。当您运用Terraform注册表中的模块或供给程序时,这种情况变得愈加重要。 在这里,您没有才能在基础设施“源代码”上运转tfsec..由于它存在于远程。 嗯,这不应该是一个担心的原因,由于每逢你第一次运转Terraform方案时,一切的远程Terraform文件都会被提取。你只是在文件夹结构中看不到它们。要拜访这些文件,能够运用ls-a列出途径中的一切隐藏文件
在.terragrunt-cache下,向下几个目录,您将找到您的terraform文件 实际上,您现在能够在terragrunt.hcl文件所在的方位运转tfsec指令。 Tfsec将查找该文件夹级别的一切tf文件,乃至是.terragrunt-cache下的文件 假如您运用作业流来调配基础结构,您能够依照以下过程序列对代码运转安全扫描,即
1.首要运用terraform plan创建方案 2.在同一文件夹级别上运转tfsec
措施2
在上一步中,咱们解决了在terragrunt中运用tfsec的问题。现在,这种办法本身就足以让大多数人开始运用,但它并不能解决“可变”装备带来的问题。 即运用这种办法,tfsec也会告知咱们..
尽管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指令,咱们得到预期的成果。
尽管这个办法有点“老套”,但这是我唯一能想到的办法,在呈现 terragrunt+tfsec生态系统。
本文正在参加「金石方案 . 分割6万现金大奖」