从terraform状态中获取私钥

86次阅读
没有评论

问题描述

在使用terraform时,使用了terraform资源tls_private_key生成了一个私钥,并将其推送到AWS,但是没有给出私钥的使用方法来访问相关资源。用户想知道如何恢复该私钥。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

如果你需要在后续步骤中使用这个私钥,常见的做法是将其作为根模块输出值返回。由于私钥是敏感信息,你可以将其标记为敏感信息,以防止Terraform默认在屏幕上显示它:

output "private_key" {
  value     = tls_private_key.example.private_key_pem
  sensitive = true
}

当你运行terraform apply时,Terraform会对该值进行遮蔽,因为它是敏感信息。然而,你仍然可以通过运行terraform output -raw private_key从脚本中访问它,因为该值仍然存储在状态中,而sensitive选项只是防止它在人类可读的输出中显示。(-raw选项用于脚本中使用。)

方案2

使用terraform state命令可以显示资源,但敏感值不会在屏幕上显示。如果使用-json选项,可以解除此限制,以json格式转储整个状态。
然后,你可以使用jq来解析输出以找到该值。该值将带有引号和转义的换行符,你需要清理它们以获得正确格式的PEM密钥。jq-r选项可以很好地处理这个问题,以原始格式转储该值。

terraform show -json | jq -r '.values.root_module.resources[].values | select(.private_key_pem) |.private_key_pem' > ~/.ssh/terraform_private_key.pem

在上面的jq命令中,有三个部分。第一个部分将过滤到每个资源的值。第二个部分仅选择具有private_key_pem键的值集。第三个部分打印这些特定键的值。select防止对没有private_key_pem键/值对的值集进行打印。

方案3

使用private_key_openssh选项
另一种选择是使用以下命令:

terraform show -json |  jq -r '.values.root_module.resources[] | select(.address=="tls_private_key.ssh").values.private_key_openssh'

这个命令也使用了root_module.resources,因为这是私钥创建的位置。这个地址对应于main.tf中的以下内容:

resource "tls_private_key" "ssh" {
  algorithm   = "ECDSA"
  ecdsa_curve = "P384"
}

在你的情况下,密钥可能有不同的名称和资源。你可以通过以下命令找出它在哪个资源中:

terraform show -json | jq -r | less

我选择不使用PEM格式,因为OpenSSH有自己的密钥格式,在某些情况下与PKCS#9(PEM)不同。例如,目前OpenSSH无法读取PKCS#9(PEM)格式的ed25519密钥。

正文完