管理保险库密码

如果您为管理保险库密码制定策略,那么管理加密的内容将变得更容易。保险库密码可以是您选择的任何字符串。没有专门的命令来创建保险库密码。但是,您需要跟踪您的保险库密码。每次使用 Ansible Vault 加密变量或文件时,都必须提供密码。当您在命令或剧本中使用加密的变量或文件时,必须提供用于加密它的相同密码。要制定管理保险库密码的策略,请从以下两个问题入手:

  • 您是想使用同一个密码加密所有内容,还是根据不同的需求使用不同的密码?

  • 您想在哪里存储密码?

在单个密码和多个密码之间进行选择

如果您有一个小型团队或很少的敏感值,您可以使用单个密码来加密所有使用 Ansible Vault 加密的内容。将您的保险库密码安全地存储在文件中或秘密管理器中,如下所述。

如果您有一个大型团队或许多敏感值,您可以使用多个密码。例如,您可以为不同的用户或不同的访问级别使用不同的密码。根据您的需求,您可能希望为每个加密的文件、每个目录或每个环境使用不同的密码。您的剧本中可能包含两个 vars 文件,一个用于开发环境,一个用于生产环境,它们使用两个不同的密码加密。在运行剧本时,您可以使用保险库 ID 选择要针对的环境的正确保险库密码。

使用保险库 ID 管理多个密码

如果您使用多个保险库密码,可以使用保险库 ID 区分一个密码与另一个密码。您可以通过三种方式使用保险库 ID:

当您将保险库 ID 作为选项传递给 ansible-vault 命令时,您会在加密内容中添加一个标签(提示或昵称)。此标签记录了您用来加密它的密码。加密的变量或文件在标题中包含纯文本的保险库 ID 标签。保险库 ID 是加密内容之前的最后一个元素。例如

my_encrypted_var: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          30613233633461343837653833666333643061636561303338373661313838333565653635353162
          3263363434623733343538653462613064333634333464660a663633623939393439316636633863
          61636237636537333938306331383339353265363239643939666639386530626330633337633833
          6664656334373166630a363736393262666465663432613932613036303963343263623137386239
          6330

除了标签之外,您还必须提供相关密码的来源。来源可以是提示、文件或脚本,具体取决于您存储保险库密码的方式。模式如下所示

--vault-id label@source

如果您的剧本使用多个加密的变量或文件,这些文件使用不同的密码加密,那么在运行该剧本时,必须传递保险库 ID。您可以使用 --vault-id 作为独立选项,与 --vault-password-file 结合使用,或与 --ask-vault-pass 结合使用。模式与创建加密内容时相同:包含标签和匹配密码的来源。

请参阅以下使用保险库 ID 加密内容和使用使用保险库 ID 加密的示例。 --vault-id 选项适用于任何与保险库交互的 Ansible 命令,包括 ansible-vaultansible-playbook 等。

保险库 ID 的限制

Ansible 不会强制每次使用特定保险库 ID 标签时使用相同的密码。您可以使用相同的保险库 ID 标签但使用不同的密码加密不同的变量或文件。这通常发生在您在提示符处键入密码并犯错误时。有可能有意使用相同的保险库 ID 标签但使用不同的密码。例如,您可以将每个标签用作对一类密码的引用,而不是单个密码。在这种情况下,您必须始终知道在上下文中使用哪个特定密码或文件。但是,您更有可能意外地使用相同的保险库 ID 标签但使用不同的密码加密两个文件。如果您意外地使用相同的标签但使用不同的密码加密了两个文件,则可以 重新设置 一个文件来解决此问题。

强制执行保险库 ID 匹配

默认情况下,保险库 ID 标签只是一个提示,用于提醒您使用哪个密码来加密变量或文件。Ansible 不会检查加密内容的标题中的保险库 ID 是否与您使用 --vault-id 提供的保险库 ID 相匹配。Ansible 会解密您的命令或剧本调用的所有文件和变量,这些文件和变量使用您提供的密码加密。要检查加密的内容,并且仅在加密内容中包含的保险库 ID 与您使用 --vault-id 提供的保险库 ID 相匹配时才解密它,请设置配置选项 DEFAULT_VAULT_ID_MATCH。当您设置 DEFAULT_VAULT_ID_MATCH 时,每个密码仅用于解密使用相同标签加密的数据。这既高效又可预测,并且可以减少使用不同的密码加密不同值的错误。

注意

即使启用了 DEFAULT_VAULT_ID_MATCH 设置,Ansible 也不会强制每次使用特定保险库 ID 标签时使用相同的密码。

存储和访问保险库密码

您可以记住保险库密码,或者从任何来源手动复制保险库密码并将其粘贴到命令行提示符中,但大多数用户会安全地存储它们,并在需要时从 Ansible 内部访问它们。您有两种在 Ansible 内部使用的方法来存储保险库密码:在文件或第三方工具(例如系统密钥环或秘密管理器)中存储。如果将密码存储在第三方工具中,则需要保险库密码客户端脚本从 Ansible 内部检索它们。

将密码存储在文件中

要将保险库密码存储在文件中,请在文件中将密码作为单行字符串输入。确保文件的权限适当。不要将密码文件添加到源代码管理中。

在运行使用存储在文件中的保险库密码的剧本时,请在 --vault-password-file 标志中指定该文件。例如

ansible-playbook --extra-vars @secrets.enc --vault-password-file secrets.pass

使用保险库密码客户端脚本将密码存储在第三方工具中

您可以将保险库密码存储在系统密钥环、数据库或秘密管理器中,并使用保险库密码客户端脚本从 Ansible 内部检索它们。将密码作为单行字符串输入。如果您的密码有保险库 ID,请以适合您的密码存储工具的方式存储它。

要创建保险库密码客户端脚本,请执行以下操作:

  • 创建一个以 -client-client.EXTENSION 结尾的文件

  • 使文件可执行

  • 在脚本本身中,请执行以下操作:
    • 将密码打印到标准输出

    • 接受 --vault-id 选项

    • 如果脚本提示输入数据(例如数据库密码),请将提示显示到 TTY。

在运行使用存储在第三方工具中的保险库密码的剧本时,请在 --vault-id 标志中指定脚本作为来源。例如

ansible-playbook --vault-id dev@contrib-scripts/vault/vault-keyring-client.py

Ansible 使用 --vault-id 选项执行客户端脚本,以便脚本知道您指定的哪个 vault ID 标签。例如,从密钥管理器加载密码的脚本可以使用 vault ID 标签来选择“dev”或“prod”密码。上面的示例命令导致以下客户端脚本的执行

contrib-scripts/vault/vault-keyring-client.py --vault-id dev

有关从系统密钥环加载密码的客户端脚本示例,请参阅 vault-keyring-client 脚本