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

举报
kaliarch 发表于 2022/11/12 22:06:12 2022/11/12
【摘要】 静态代码扫描敏捷方法的主要好处之一是它固有的变更灵活性。您的代码可以根据客户需求不断发展,同时保持软件质量的高标准。为了适应这种灵活性,一定程度的漏洞和缺陷必然会渗透到您的代码中。静态代码分析工具帮助您在开发的初始阶段识别这些风险,甚至不需要执行,使开发人员能够维护强大的代码基础。 tfsecTfsec就是这样一种静态分析工具,它可以帮助您识别Terraform代码中的错误配置和安全风险。...

静态代码扫描

敏捷方法的主要好处之一是它固有的变更灵活性。您的代码可以根据客户需求不断发展,同时保持软件质量的高标准。为了适应这种灵活性,一定程度的漏洞和缺陷必然会渗透到您的代码中。
静态代码分析工具帮助您在开发的初始阶段识别这些风险,甚至不需要执行,使开发人员能够维护强大的代码基础。

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生态系统。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。