结合tfsec与Terragrunt保护基础设施即代码
静态代码扫描
敏捷方法的主要好处之一是它固有的变更灵活性。您的代码可以根据客户需求不断发展,同时保持软件质量的高标准。为了适应这种灵活性,一定程度的漏洞和缺陷必然会渗透到您的代码中。
静态代码分析工具帮助您在开发的初始阶段识别这些风险,甚至不需要执行,使开发人员能够维护强大的代码基础。
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生态系统。
- 点赞
- 收藏
- 关注作者
评论(0)