terraform_plan: 通过 `removed` 块从状态中移除的资源出现假阳性 ('forget' 操作)
描述问题
Checkov 在 terraform_plan 扫描中始终返回 错误的正例 (False Positives),其中计划 JSON 中包含从状态中删除的资源 (没有删除)。 此问题适用于任何 Terraform 资源类型 (只要它们具有更改操作 'forget'),以及针对它们的任何适用的资源/值检查。 这些 False Positives 是由 Terraform 上游的一个 Bug (https://GitHub.com/hashicorp/terraform/issues/38641) 引起的:在 Terraform v1.7.0 中引入 removed {} 块后,出现了一个 Bug,即使用 removed {} 块并配置 lifecycle { destroy = false } 来从状态中删除的资源会错误地被包含在 Terraform 计划 JSON 的 planned_values 部分中,且被剥离了值。 这是一个已确认的上游 Bug,已在 Terraform 1.15.6 及更高版本中修复: - https://GitHub.com/hashicorp/terraform/issues/38641 - https://GitHub.com/hashicorp/terraform/pull/38665 在从状态中删除资源的过程中,Terraform 会删除与该资源相关的所有配置值。 该资源不应出现在 planned_values 中 (因为它正在从 Terraform 管理的状态中删除),但由于上述 Bug,'忘记' 的资源会被包含在 planned_values 中,且配置为空。 由于资源位于 planned_values 中,Checkov 将对其运行检查,但由于检查所查找的值不存在,它将返回多个错误的正例失败。 Checkov 应在其 plan_parser 中过滤这些问题的 'forget' 资源,以便考虑到 Bug,并有效地应用 Terraform 在 https://GitHub.com/hashicorp/terraform/pull/38665 中引入的相同修复。 此问题已在未来版本的 Terraform 中修复,但它在所有先前版本中都存在,其中未进行回滚修复,代表目前大多数公司广泛采用的版本往往落后于最新版本。 可能需要数年时间才能采用修复版本。 Checkov 会扫描这些 Terraform 版本,并且除非 Checkov 在其端引入修复以考虑 Bug,否则它们将继续返回错误的正例。 ## 示例和可重现的步骤 在此部分中,我展示了一个以单个策略 (CKV_AWS_145) 为重点的示例,以简化说明,但 Bug 不是策略特定的,而是框架特定的 (terraform_plan)。 在示例中,我配置了一个 S3 存储桶,并使用 SSE 加密 (CKV_AWS_145: 通过)。 然后,我使用 removed 块将资源从状态中删除,导致 CKV_AWS_145 错误的正例失败。 该资源没有被删除 (仅从状态中删除),且其配置未明确修改以删除加密。 该资源配置实际上被 removed 块完全替换,这就是为什么在正常的 terraform 扫描中,CKV_AWS_145 根本不会运行。 但在 terraform_plan 扫描中,CKV_AWS_145 返回了错误的正例 …
内容来源: bridgecrewio/checkov