Terraform:可以查看私钥更改的部分差异或任何其他信息吗?

Terraform:可以查看私钥更改的部分差异或任何其他信息吗?

目标: 将 Terraform 项目重新初始化到另一个工作站。

问题: Terraform 想要重新创建我的一个 TLS 密钥,因为它认为私钥存在差异。但是由于它是一个敏感文件,我无法看到差异,所以我很困惑。


  • 我公司的Terraform repo 安装 TLS/SSL 证书/密钥进入 AWS 负载均衡器。
  • 我必须将 Terraform 项目恢复到新的工作站(旧工作站已退役)。
  • 证书和链存储在 repo 中。
  • 私钥本身不会被签入到 git repo 中,但我们保留了多个安全备份。

证书声明如下:

resource "aws_iam_server_certificate" "test1_cert_renewed" {
  name              = "test1_cert_renewed"
  certificate_body  = file("${path.cwd}${var.test1_cert_renewed_cert}")
  private_key       = file("${path.cwd}${var.test1_cert_renewed_key}")
  certificate_chain = file("${path.cwd}${var.test1_cert_renewed_chain}")

  lifecycle {
    create_before_destroy = true
  }
}

一切都进展顺利,Terraform 项目在新工作站上恢复正常运行。但是,它想重新创建我的证书安装,因为它认为私钥不同。

在计划中,它只是说它会因为以下原因而重新创建:

~ private_key = (sensitive value)

这仅影响 5 个不同证书包中的一个这是关于这个文件的一些具体内容。

  1. 是否可以在 Terraform 输出中看到更多详细信息,以便我至少可以看到部分差异片段?

  2. 关于如何区分状态中的内容和文件中的内容,有什么建议吗?

我试过了terraform state pull,确实看到了输出,但这是一个编码字符串。不太确定如何解码(如果可能的话)。

    {
      "mode": "managed",
      "type": "aws_iam_server_certificate",
      "name": "<<SCRUBBED>>",
      "provider": "provider.aws",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "arn": "arn:aws:iam::<<SCRUBBED>>",
            "certificate_body": "<<SCRUBBED>>",
            "certificate_chain": "<<SCRUBBED>>",
            "id": "ASCA4DNFUOPYAQICRDU7O",
            "name": "<<SCRUBBED>>",
            "name_prefix": null,
            "path": "/",
            "private_key": "<<SCRUBBED string that was here (looked like encoded string), but it wasn't private key text>>"
          },
          "private": "<<SCRUBBED 5 character string SCRUBBED>>"
        }
      ]
    }

更多细节:

我已经检查了一些明显的事情,例如文件末尾/开头的换行符:

-----END PRIVATE KEY-----

相对

-----END PRIVATE KEY-----

答案1

如果 TF 存在差异,那是因为状态中被认为重要的字段与资源呈现的基础设施不同步。

AWS 中的此资源可能存在一些不同之处 - 也许它是在 TF 之外更改的?这可以解释为什么这个证书资源存在问题。

除此之外,请备份您的 TF 状态,然后使用以下命令从状态中删除此资源:

terraform state rm <resource path>

删除后,使用资源路径和 AWS 对象 ID(在您发布的状态文件中,该 ID 为 ASCA4DNFUOPYAQICRDU7O)导入所需的资源。这将使用 AWS 中描述的状态更新 TF,从而有效地将更改推向相反方向。如果您想要有关导入命令应该是什么样子的提示,请提供与此资源相关的清单代码,或通过以下方式显示已创建资源的当前路径:

terraform state list | grep test1_cert_renewed

通常,您需要导入路径和 ID。如果您未在此清单中使用任何子模块结构,则以下内容可能足以提示您:

terraform import aws_iam_server_cerificate.test1_cert_renewed ASCA4DNFUOPYAQICRDU7O

答案2

如您所见,正常terraform plan输出隐藏了资源类型架构中标记为“敏感”的任何属性的实际值。

但是,隐藏该值纯粹是为了避免该值被保存在 Terraform 运行的日志等中。如果您将计划保存到计划文件中,然后要求 Terraform 将其呈现为 JSON,则可以查看它:

terraform plan -out=tfplan
terraform show -json tfplan

JSON 计划输出默认没有人类可读的布局,因此您可能希望通过类似的工具将其jq解释为可读的形状,并且可能 - 如果您熟悉jq表达式语法 - 仅提取您关心的特定部分。

请注意,tfplan第一个命令创建的文件是二进制文件,其格式仅对 Terraform 有意义,但它包含您的密钥值,因此您应该小心谨慎,仅在文件位于磁盘上不会导致值被泄露的系统上运行此命令。同样,JSON 计划输出将包含未隐藏的敏感值,因此如果您打算在终端中查看它,则应确保没有人“偷看”您的屏幕。

相关内容