使用 Snyk IaC 以避免在 HashiCorp Terraform 中发生云配置错误
这篇文章是对Jim Armstrong于2021年3月13日发布的英语博客《使用Snyk IaC防止HashiCorp Terraform的云配置错误》进行的日语翻译。

我們將介紹 Snyk基礎設施即代碼(Snyk IaC)的新功能,這個功能是為了支援Terraform配置文件的創建、計劃和應用而設計的。通過使用Snyk IaC,您可以在編碼配置的同時即時獲得關於安全配置的指導。此外,您可以在部署流程中掃描Terraform計劃文件,以確保變更和整個配置的安全性。我們還進行了大量的性能改進,特別是在處理數千個文件時,並進行了安全改進,以保護憑據等敏感信息。
通过生命周期来防止Terraform的配置错误。
通过 Snyk IaC 的新功能,现在可以像处理其他形式的代码一样处理 Terraform,从而实现了平稳迁移。您可以将 IaC 安全性嵌入到 Terraform 的整个生命周期中。Snyk IaC 可在代码编写时发现配置错误。此外,它基于云端和行业最佳实践以及组织策略提供反馈和指导给工程师。当 Terraform 模块被提交并启动自动测试时,Snyk IaC 将测试 Terraform 的计划文件并显示有关变更的综合列表。同时,通过在部署时确保环境的安全性,可以防止部署后的错误和回归。
对于云端配置错误,扫描有效的 Terraform plan 文件。
在 Snyk CLI 中,您可以扫描本地或 CI/CD 中的 Terraform 或 Kubernetes 文件,并在编写配置时或在代码存储库中立即提供反馈。这对于每个单独的更改都有效。然而,如果您想查看包括包含的模块或变量的影响在内的计划的所有更改,那么您可以扫描 Terraform 的计划文件。
在这个版本中,Snyk CLI 工作流支持扫描 Terraform plan (tf-plan) 文件,并且能够检测计划结果是否会给当前的云基础架构带来新的安全漏洞。为了展示 Snyk IaC 如何在整个 Terraform 工作流中使用,我们将运行一个示例,使用 Hashicorp 的 “Use Application Load Balancers for Blue-Green and Canary Deployments” 教程的代码,并查看 Snyk IaC 提供的简单的本地 “编写、测试、计划、测试、应用” 工作流。
您可以阅读更多关于蓝绿部署策略的内容。
对于包含在TERRAFORM源代码中的云设置错误的测试
在测试环境中,已安装了Terraform,并且Terraform的代码被Git管理。然而,由于引入了Snyk IaC,我们希望确认是否存在任何问题,因此决定将Snyk与GitHub仓库进行集成,并在Snyk控制台上查看其结果。

没有严重性高的问题。但是,当点击main.tf时,我注意到负载均衡器的配置是使用HTTP而不是HTTPS。默认情况下,这是中等风险的问题,但是我的安全团队并不满意。Snyk UI会显示出我的代码存在的问题,其影响以及解决方法。

使用Terraform代码进行安全扫描
我在Terraform文件中添加了由Snyk IaC指出的更改,并将负载均衡配置为使用HTTPS。由于这还需要创建和使用证书,所以我进一步将其添加到配置中。现在,在推送更改之前,我想做一些简单的检查,以确保在修复HTTPS问题后不会出现新问题。由于这是一个面向互联网的应用程序,我的团队和我不需要查看Snyk IaC中的“负载均衡器对互联网进行公开”的警报。因此,我联系了安全管理员,请求将此配置关闭。在Snyk IaC中,这个配置非常简单。我所做的所有更改都在main.tf文件中,因此在提交更改之前我会在本地进行测试。
$ snyk iac test main.tf
Testing main.tf...
Infrastructure as code issues:
Organization: purple-dobie
Type: Terraform
Target file: main.tf
Project name: learn-terraform-advanced-deployments
Open source: no
Project path: main.tf
Tested main.tf for known issues, found 0 issues
问题已得到解决。HTTPS问题已修复,并且安全团队已将“向互联网公开”检查禁用,至少在main.tf中没有任何问题。我感到非常满意。终于到了我部署我的更改的时候了。
扫描TERRAFORM配置中的管道错误
在应用实际更改之前,需要执行terraform plan命令来了解更改的内容。 Terraform的plan文件包含了所有模块和变量的更改,并可以更详细地了解更改的影响。通过将Snyk IaC与Terraform的生命周期集成,在执行更改时可以确保不会影响其他模块的配置。在下面的示例中,为了简化操作,我们将所有步骤都在本地执行,但是使用CI工具自动化计划和测试以及使用Snyk CLI非常简单。
# generate a Terraform plan in JSON format:
$ terraform plan -out=tfplan.bin
$ terraform show --json tfplan.bin > tfplan.json
# And use Snyk to test the plan to see I caused any issues:
$ snyk iac test tfplan.json
Testing tfplan.json...
Infrastructure as code issues:
Organization: purple-dobie
Type: Terraform
Target file: tfplan.json
Project name: learn-terraform-advanced-deployments
Open source: no
Project path: tfplan.json
Tested tfplan.json for known issues, found 0 issues
我的更改似乎进展顺利,没有任何安全问题。但是,有一件事情让我有点担心。我只测试了资源的更改(Snyk IaC的默认设置),只编辑了一个文件(main.tf)。所以,这个正常的结果是理所当然的。但是,在开始使用Snyk IaC之前,我的Terraform配置已经经过apply并生效了。因此,我想要检查所有计划结果,不仅仅包括新的更改,还包括已经应用的配置细节。
扩展对TERRAFORM状态的导入和云配置错误的检查
Snyk IaC 的新功能 tf-plan 具有检查计划值的功能。要使用此功能,只需通过 -scan=planned-values 选项指定扫描计划值。我们再次建议在 CI 中执行此操作,但为了简单起见,我们将使用 CLI 在此处执行。
$ snyk iac test --scan=planned-values tfplan.json
Testing tfplan.json...
Infrastructure as code issues:
✗ Security Group allows open ingress [High Severity] [SNYK-CC-TF-1] in VPC
introduced by resource > aws_security_group[this_name_prefix] > ingress[0]
.
.
.
✗ Non-Encrypted root block device [Medium Severity] [SNYK-CC-TF-53] in EC2
introduced by aws_instance[blue] > root_block_device > encrypted
.
.
.
Organization: purple-dobie
Type: Terraform
Target file: tfplan.json
Project name: learn-terraform-advanced-deployments
Open source: no
Project path: tfplan.json
Tested tfplan.json for known issues, found 20 issues
哎呀!这次一共有20个问题,其中还夹杂了一些严重程度高的问题(为了简洁起见,在上述输出中省略了一个高级问题和一个中级问题)。
包含模块和变量的TERRAFORM扫描
从这个结果可以看出,除了配置文件之外,还扫描了tf-plan的结果,还有一些有趣的发现。在这个例子中,第一个git仓库的扫描没有检测到这些严重程度为高的问题,即使在编辑main.tf文件后进行单独扫描也没有被检测到。
我将对此进行解释。在本次的结构中,我们使用了多个AWS提供程序的模块和变量,并且在扫描存储库或单个文件时会对文件进行静态检查。因此,您只能了解到文件中明确指定的资源的详细信息,但仅通过单个文件查看,无法确定由模块创建了哪些资源。Terraform的计划文件可以从包含的模块和变量中获取所有逻辑,从而使您能够理解更完整的配置。
Terraform 的 plan 文件具有另一个优点,即可以很容易地与 Snyk IaC 进行集成。一些客户使用 Terraform Cloud、Terragrunt、Atlantis 等工具,由于这些工具都可以输出标准的 Terraform plan 文件,因此可以使用 Snyk IaC 对其进行扫描。在后续的帖子中,我们将介绍这些生态系统工具的示例。
保持私人基础设施数据的机密性,并提高性能。
通过扫描Terraform的计划文件,即可覆盖在基础架构即代码(IaC)常规生命周期中可能出现的许多附加配置错误风险,这一点可以从上述简单的例子中看出。然而,在此阶段进行扫描也意味着将应用于您希望保留在网络中的机密数据。因此,在此次发布中,Snyk CLI现在可以在本地执行IaC测试,并且只有Snyk的认证信息和CLI生成的元数据被发送到Snyk。这项操作不需要任何特殊的步骤或设置,它已经集成在Snyk IaC中,并且是Snyk CLI针对IaC的默认行为。
本地扫描的另一个好处是速度大幅提升。对于一个拥有数百甚至数千个文件的Terraform仓库来说,这对我们的客户尤其具有影响力。根据我们自己的测试结果,当扫描这样庞大的目录时,我们可以看到速度提升了20倍。
可以免费使用Snyk IaC。
这些新功能对所有人开放,甚至包括免费的用户,大家都可以试用。而且,开始使用它们非常简单。
-
- 如果您还没有Snyk帐号,请免费注册。
安装Snyk CLI。如果您已经安装了Snyk CLI,请确保使用CLI 1.594.0或更高版本以使用这些功能。
扫描Terraform和Kubernetes文件。
新機能使って IaC をスキャンするための主なコマンドは以下の通りです。
snyk iac test Snykがサポートする様々なスキャンオプションについては、私たちのドキュメント、または CLI ドキュメントの実行 (snyk iac –help) で知ることができます。
Terraform の plan ファイルをスキャンするには、上記の例や Terraform のドキュメントにあるように、terraform show で取得できるJSONフォーマットの出力を生成する必要があります。
请告诉我们您的意见。如果您是Snyk的现有客户,我们的客户成功团队将成为您提供关于产品的有价值反馈的良好来源。同时,我们也欢迎您在Snyk社区论坛上发表评论。