Terraform
验证 Terraform 二进制文件存档
黑客可能会通过诱使你运行包含恶意代码的可执行文件来访问你的关键系统。你可以通过在运行 Terraform 可执行文件之前验证 HashiCorp 创建并签名了该文件来避免这种情况。
在本教程中,你将下载 Terraform 存档版本,并验证自 HashiCorp 创建以来没有人篡改过该存档。
要在你的系统上安装 Terraform,请遵循我们的 安装教程。本教程中的步骤不会替换你系统上的 Terraform 版本(如果有的话)。
先决条件
你需要以下内容才能完成本教程。
- 命令行工具
curl,用于将文件下载到你的本地机器。 - 命令行工具
gpg,用于导入和验证 HashiCorp 的 PGP 密钥。 - 使用 `shasum` 命令行工具来验证您的 Terraform 归档文件的校验和。 `shasum` 命令有时会随
gpg命令一起分发,或者作为 GNU coreutils 的一部分。
创建一个工作目录
创建一个临时目录来保存您的工作。
$ mkdir verify-terraform
进入该目录。
$ cd verify-terraform
创建一个临时的 GPG 配置
创建一个临时的 GPG 配置目录和密钥,以便您可以遵循此教程,而不会影响您的个人 GPG 配置。如果您更希望使用您的真实 GPG 配置来验证 Terraform 归档文件,请跳过此步骤。
首先,配置 gpg 以使用临时目录来保存您的配置和密钥,而不是默认目录。
$ export GNUPGHOME=./.gnupg
接下来,创建一个临时个人密钥,使用空白密码和示例电子邮件地址。您将使用此个人密钥来签署 HashiCorp 的密钥,在下一步中。
$ gpg --quick-generate-key --batch --passphrase "" human@example.com
gpg: directory '/Users/rnorwood/verify-terraform/./.gnupg' created
gpg: keybox '/Users/rnorwood/verify-terraform/./.gnupg/pubring.kbx' created
gpg: /Users/rnorwood/verify-terraform/./.gnupg/trustdb.gpg: trustdb created
gpg: key 33B7139B683F1365 marked as ultimately trusted
gpg: directory '/Users/rnorwood/verify-terraform/./.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/Users/rnorwood/verify-terraform/./.gnupg/openpgp-revocs.d/D17B8E66A0D8DADA4CD8F1E033B7139B683F1365.rev'
下载并导入 HashiCorp 的公钥
HashiCorp 使用公共 PGP 密钥来签署某些文件,包括 Terraform 归档文件的校验和。您可以在 HashiCorp 的安全页面 以及 Keybase 上找到 HashiCorp 的公钥。
从 Keybase.io 下载 HashiCorp 的公钥。
$ curl --remote-name https://keybase.io/hashicorp/pgp_keys.asc
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 7717 100 7717 0 0 30268 0 --:--:-- --:--:-- --:--:-- 30381
将密钥导入您的 GPG 密钥链。
$ gpg --import pgp_keys.asc
gpg: key 34365D9472D7468F: public key "HashiCorp Security (hashicorp.com/security) <security@hashicorp.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
现在,使用上一步创建的临时密钥签署该密钥。您可以将此密钥 ID 与在 HashiCorp 的安全页面 上找到的密钥 ID 进行比较。使用 y 回复确认提示。
$ gpg --sign-key 34365D9472D7468F
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2023-05-12
pub rsa4096/34365D9472D7468F
created: 2021-04-19 expires: 2026-04-18 usage: SC
trust: unknown validity: unknown
sub rsa4096/54422F612379BA9A
created: 2021-04-19 expires: 2026-04-18 usage: E
sub rsa4096/B0B441097685B676
created: 2021-04-19 expires: 2022-04-20 usage: S
sub rsa4096/C820C6D5CD27AB87
created: 2021-04-21 expires: 2026-04-20 usage: S
[ unknown] (1). HashiCorp Security (hashicorp.com/security) <security@hashicorp.com>
pub rsa4096/34365D9472D7468F
created: 2021-04-19 expires: 2026-04-18 usage: SC
trust: unknown validity: unknown
Primary key fingerprint: C874 011F 0AB4 0511 0D02 1055 3436 5D94 72D7 468F
HashiCorp Security (hashicorp.com/security) <security@hashicorp.com>
This key is due to expire on 2026-04-18.
Are you sure that you want to sign this key with your
key "human@example.com" (33B7139B683F1365)
Really sign? (y/N) y
验证 PGP 密钥 ID 和指纹
使用 gpg 验证公钥 ID 和指纹。
$ gpg --fingerprint --list-signatures "HashiCorp Security"
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 1 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: depth: 1 valid: 1 signed: 0 trust: 1-, 0q, 0n, 0m, 0f, 0u
gpg: next trustdb check due at 2023-05-12
pub rsa4096 2021-04-19 [SC] [expires: 2026-04-18]
C874 011F 0AB4 0511 0D02 1055 3436 5D94 72D7 468F
uid [ full ] HashiCorp Security (hashicorp.com/security) <security@hashicorp.com>
sig 3 34365D9472D7468F 2021-04-19 HashiCorp Security (hashicorp.com/security) <security@hashicorp.com>
sig 33B7139B683F1365 2021-05-12 human@example.com
sub rsa4096 2021-04-19 [E] [expires: 2026-04-18]
sig 34365D9472D7468F 2021-04-19 HashiCorp Security (hashicorp.com/security) <security@hashicorp.com>
sub rsa4096 2021-04-19 [S] [expires: 2022-04-20]
sig 34365D9472D7468F 2021-04-20 HashiCorp Security (hashicorp.com/security) <security@hashicorp.com>
sub rsa4096 2021-04-21 [S] [expires: 2026-04-20]
sig 34365D9472D7468F 2021-04-21 HashiCorp Security (hashicorp.com/security) <security@hashicorp.com>
验证指纹(C874 011F 0AB4 0511 0D02 1055 3436 5D94 72D7 468F)和密钥 ID(34365D9472D7468F)是否与 我们的安全页面的 PGP 公钥部分中显示的指纹和密钥 ID 匹配。
下载 Terraform 归档文件和校验和
从 HashiCorp 的发布服务器下载 Terraform CLI 的归档文件。 您可以使用任何 Terraform 版本执行这些步骤,但本教程以 Terraform v0.15.3 的 MacOS(darwin)版本为例。
$ curl --remote-name https://releases.hashicorp.com/terraform/0.15.3/terraform_0.15.3_darwin_amd64.zip
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 31.9M 100 31.9M 0 0 30.6M 0 0:00:01 0:00:01 --:--:-- 30.6M
现在下载此版本的 Terraform 的 SHA 256 校验和。 该文件包含此版本中每个 Terraform 归档文件的校验和。
$ curl --remote-name https://releases.hashicorp.com/terraform/0.15.3/terraform_0.15.3_SHA256SUMS
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1292 100 1292 0 0 11962 0 --:--:-- --:--:-- --:--:-- 11962
同时下载校验和签名文件。 该文件包含使用 HashiCorp 的 PGP 密钥对校验和文件签名的签名。
$ curl --remote-name https://releases.hashicorp.com/terraform/0.15.3/terraform_0.15.3_SHA256SUMS.sig
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 566 100 566 0 0 4376 0 --:--:-- --:--:-- --:--:-- 4387
HashiCorp 为每个版本的 Terraform 二进制归档文件发布这些文件。
验证校验和和签名文件
验证 HashiCorp 是否使用其私有 PGP 密钥创建了签名文件,并且自那时以来没有人篡改过它。
$ gpg --verify terraform_0.15.3_SHA256SUMS.sig terraform_0.15.3_SHA256SUMS
gpg: Signature made Thu May 6 13:08:56 2021 CDT
gpg: using RSA key B36CBA91A2C0730C435FC280B0B441097685B676
gpg: Good signature from "HashiCorp Security (hashicorp.com/security) <security@hashicorp.com>" [full]
请注意以 gpg: Good signature... 开头的行。 该行告诉您签名与从 Keybase 下载的 HashiCorp 的公钥匹配。 由于您之前在本教程中用您的个人密钥签署了 HashiCorp 的密钥,因此 gpg 完全信任 HashiCorp 的密钥。
验证 Terraform 归档文件
验证您下载的 Terraform 归档文件的 SHA 256 校验和。
$ shasum --algorithm 256 --check terraform_0.15.3_SHA256SUMS
terraform_0.15.3_darwin_amd64.zip: OK
shasum: terraform_0.15.3_freebsd_386.zip:
terraform_0.15.3_freebsd_386.zip: FAILED open or read
shasum: terraform_0.15.3_freebsd_amd64.zip: No such file or directory
terraform_0.15.3_freebsd_amd64.zip: FAILED open or read
shasum: terraform_0.15.3_freebsd_arm.zip: No such file or directory
## ...
SHA256SUMS 文件包含针对指示版本中每个 Terraform 发布归档文件的校验和。 对于本教程,您仅下载了 darwin_amd64(MacOS)版本。 shasum 命令为该文件打印出“OK”消息,并为其他文件打印出“没有该文件或目录”。
现在,您已验证自 HashiCorp 创建以来没有人篡改 Terraform 归档文件,因为其校验和与 HashiCorp 提供的校验和匹配。 您还验证了没有人篡改校验和文件本身,因为 HashiCorp 使用了适当的密钥对其进行了签名。
取消设置 GNUPGHOME 环境变量
取消设置先前配置的 GNUPGHOME 环境变量。
$ unset GNUPGHOME
下一步
有关本教程涵盖的主题的更多信息,请查看以下资源。
管理 Terraform 版本作为团队的一部分。
查阅 HashiCorp 的 安全页面,了解有关安全和 HashiCorp 产品的更多信息。