使用 PGP、GnuPG和Keybase

Vault 能够兼容 OpenPGP 的程序,例如 GnuPG 以及 Keybase.io 这样的服务进行集成,在执行某些操作时提供额外的安全保护。本节将详细介绍与各种 PGP 集成、操作和使用。

只能通过命令行工具获取 Keybase.io 的支持,而无法通过 Vault HTTP API 使用该服务。在初始化 Vault 服务器时可以通过 Keybase.io 的 API 获取所需的 PGP 公钥来使得初始化过程更安全。

一旦 Vault 被初始化,就可以使用 Keybase 来解密 Shamir 密钥分片并正常执行解封。

使用 PGP 初始化

初始化 Vault 服务早先遇到的一个基本问题是第一个用户(执行初始化的操作员)得到了所有解封密钥的纯文本副本。这违背了 Vault 安全模型的承诺,也使得安全地分发这些密钥变得更加困难。从 Vault 0.3 开始,Vault 可以选择使用 PGP 密钥进行初始化。在这种模式下,Vault 将生成解封密钥,然后立即使用给定用户的 PGP 公钥对其进行加密。只有相应私钥的所有者才能将其解密,从而得到明文解封密钥。

首先,我们必须把适当的密钥创建、获取或导入到正在初始化 Vault 服务的计算机上。本文不会尝试涵盖 PGP 密钥的所有方面,而是提供使用两个流行程序的示例:Keybase 和 GnuPG。

对于初学者,我们建议使用 Keybase.io(“Keybase”),因为它既简单又具有许多与密钥管理相关的有用功能和特性,例如使用许多公共在线服务来验证用户身份。它还让用户能够在他们的服务器上安全地生成、存储和管理 PGP 密钥。我们首先讨论将 Vault 与 Keybase 结合使用,因为这比较简单。

使用 Keybase 初始化

要为 Keybase 用户生成解封密钥,可以在 -pgp-keys 参数的值前面加上 keybase: 前缀:

$ vault operator init -key-shares=3 -key-threshold=2 \
    -pgp-keys="keybase:jefferai,keybase:vishalnayak,keybase:sethvargo"

这将需要比使用传统 PGP 程序(例如使用 gpg)少得多的步骤,因为 Keybase 服务处理了一些繁琐的步骤。输出内容大致如下:

Key 1: wcBMA37rwGt6FS1VAQgAk1q8XQh6yc...
Key 2: wcBMA0wwnMXgRzYYAQgAavqbTCxZGD...
Key 3: wcFMA2DjqDb4YhTAARAAeTFyYxPmUd...
...

与通常的解封密钥相比,这里的输出应该更加长。因为这些密钥被加密了,只有持有相应私钥的用户才能解密该值。密钥按照 -pgp-keys 属性中指定的顺序加密。因此,密钥属于 jeffraivishalnayaksethvargo 各自的 Keybase 帐户。这些密钥可以使用任意媒介进行分发,但建议也需要使用常识进行判断。加密的密钥经过了 base64 编码后被返回。

使用 Keybase 解封

作为解封密钥的拥有者,得到解封密钥明文的最简单方法是使用 Keybase 命令行工具。我们可以从 Keybase.io 下载页面下载。下载并配置 Keybase 命令行工具后,下面的任务是输入解封密钥。要获得解封密钥的明文,必须解密 Vault 初始化程序返回的值。请运行以下命令获取纯文本明文:

$ echo "wcBMA37..." | base64 --decode | keybase pgp decrypt

请把 wcBMA37... 替换成实际得到的密文。

命令行此时会提示用户输入 Keybase 密码,输入后得到的输出就是明文形式的解封密钥文本:

6ecb46277133e04b29bd0b1b05e60722dab7cdc684a0d3ee2de50ce4c38a357101

这就是只属于用户个人知晓的解封密钥的明文,应该与日常密码进行同等级的保护。现在我们可以使用它来解封 Vault 服务了:

$ vault operator unseal
Key (will be hidden): ...

使用 GnuPG 初始化

GnuPG 是 OpenPGP 标准的一个开源实现,可以运行在几乎所有平台上。可以通过 GnuPG 手册了解更多细节。

要创建一个新的 PGP 密钥,运行一下命令:

$ gpg --gen-key

要导入一个现存的密钥,下载它的公钥后运行以下命令:

$ gpg --import key.asc

导入用户的公钥之后,我们需要将公钥的值以 base64 编码或是二进制形式保存到一个密钥文件:

$ gpg --export 348FFC4C | base64 > seth.asc

这些密钥文件必须以 base64(“标准”的 base64 字符集,不能启用 ASCII 加固)或二进制的格式保存在磁盘上。一旦成功存盘,可以用 -pgp-keys 参数指定这些密钥文件:

$ vault operator init -key-shares=3 -key-threshold=2 \
    -pgp-keys="jeff.asc,vishal.asc,seth.asc"

命令的输出类似这样过:

Key 1: wcBMA37rwGt6FS1VAQgAk1q8XQh6yc...
Key 2: wcBMA0wwnMXgRzYYAQgAavqbTCxZGD...
Key 3: wcFMA2DjqDb4YhTAARAAeTFyYxPmUd...
...

与通常的解封密钥相比,这里的输出应该更加长。因为这些密钥被加密了,只有持有相应私钥的用户才能解密该值。密钥按照 -pgp-keys 属性中指定的顺序加密。因此,第一把钥匙属于 jeff,第二把属于 vishal,第三把属于 seth。这些密钥可以使用任意媒介进行分发,但建议也需要使用常识进行判断。加密的密钥经过了 base64 编码后被返回。

使用 GnuPG 解封

假设用户得到了一条使用他的 PGP 公钥加密的解封密钥,现在用户要用它来解封 Vault 服务。为了获得解封密钥的明文,用户必须解密 Vault 初始化程序返回的值。运行以下命令以获取解封密钥的明文:

$ echo "wcBMA37..." | base64 --decode | gpg -dq

请把 wcBMA37... 替换成实际得到的密文。

如果用户使用密码保护了自己的 PGP 私钥,那么这时用户会被要求输入该密码。输入正确密码后,就可以得到明文的解封密钥:

6ecb46277133e04b29bd0b1b05e60722dab7cdc684a0d3ee2de50ce4c38a357101

这就是只属于用户个人知晓的解封密钥的明文,应该与日常密码进行同等级的保护。现在我们可以使用它来解封 Vault 服务了:

$ vault operator unseal
Key (will be hidden): ...

results matching ""

    No results matching ""