现在才使用 Ansible Vault(2):至少将开发、验证和生产环境的 Vault 密码分开

在上一篇文章中,使用Ansible Vault的基本功能,已经实现了以下要求。

    • 機密情報の変数(パスワードなど)を暗号化する

 

    • ターゲットに配置する機密ファイル(秘密鍵など)を暗号化する

 

    Vault パスワードをスクリプトで管理する

然而,由于Vault密码在所有环境中都是相同的,开发团队的每个成员都可以解密生产环境的机密信息。

所以这次我们将实现以下要求。

    開発 / 検証 / 本番環境で別々の Vault パスワードを使用する

参考:Ansible Vault — Ansible文档

    • 確認環境:

Ansible 2.10.7
Ubuntu 20.04 / Debian 10 (buster)

设定每个环境的 Vault 密码

上一次: Vault 密码只有一个的情况下

因为上一次已经设置了唯一的 Vault 密码,所以不需要指定用于 ansible-vault ansible-playbook 等命令使用的 Vault 密码。

ANSIBLE_VAULT_PASSWORD_FILE="/workspace/.vault_pass.sh"

这次:Vault 密码是多个的情况

然而,当Vault密码变得多个时,需要指定要使用哪个密码进行加密,以及需要使用相同密码进行解密。

将多个保险库密码列在以下列表中,并将其设置为环境变量ANSIBLE_VAULT_IDENTITY_LIST。

ANSIBLE_VAULT_IDENTITY_LIST="dev@/workspace/vault_pass_dev.sh, stg@/workspace/vault_pass_stg.sh, prd@/workspace/vault_pass_prd.sh"

可以指定任意数量的 Vault ID 和脚本对,例如:设置值为 {ID 1}@{脚本 1},{ID 2}@{脚本 2},…

以下是根据上述示例设置的列表内容:

    • 環境ごとに使用する Vault パスワードの ID を「dev」「stg」「prd」とする

 

    それぞれの Vault パスワードを出力するスクリプトは、/workspace/vault_pass_{Vault ID}.sh とする

通过此设置,您可以调用与任何 Vault ID 相关联的脚本来获取 Vault 密码。

参考资料:
– Ansible Vault – Ansible文档中的多个保险库密码
– Ansible 2.4中的保险库ID – Red Hat 学习社区
– Ansible配置设置 – Ansible文档

在使用Docker搭建开发环境时,需要在.env文件中定义环境变量,并在docker-compose.yml中通过env_file指定。如果开发环境不是Docker,则需要在~/.bashrc等文件中通过export来设置环境变量,或者在ansible.cfg中进行设置。

根据每个环境指定Vault ID来进行加密。

可以使用 ansible-vault encrypt 命令的 –encrypt-vault-id 选项,为每个要加密的文件指定 Vault ID。

在以下示例中,将加密名为“vault”的明文文件,该文件被放置在与环境名称(= Vault ID)同名的目录中。

.
├── dev
│   └── group_vars
│       └── all
│           ├── vars
│           └── vault  # 暗号化する
├── stg
│   └── group_vars
│       └── all
│           ├── vars
│           └── vault  # 暗号化する
└── prd
    └── group_vars
        └── all
            ├── vars
            └── vault  # 暗号化する

变量文件vars和vault之间的关系遵循上篇文章中介绍的官方最佳实践原则。

参考:将机密信息的变量(如密码)进行加密

以下是一个例子,使用与环境同名的 Vault ID 在 –encrypt-vault-id 中指定,对每个环境的 vault 文件进行加密。

for id in $(ls .); do
  # 環境ごとのディレクトリ名と Vault ID は同じ(dev|stg|prd)
  find ${id} -name "vault" -exec \
    ansible-vault encrypt --encrypt-vault-id ${id} {} +
done

ansible-vault encrypt 命令会调用与 ANSIBLE_VAULT_IDENTITY_LIST 中关联的 Vault ID 的脚本,并使用获取的 Vault 密码对指定的文件进行加密。

我们要注意不要提交未加密的 vault 文件。

用于解密的 Vault 密码

在对每个文件进行解密时,需要使用与加密时使用的相同的保险库密码,但是在使用命令如ansible-vault edit或ansible-playbook时,不需要指定保险库ID。

实际上,当查看加密文件时,

$ANSIBLE_VAULT;1.2;AES256;dev
34336462316665666231643965643533383165373964323663373036623034626237333361376231
6135346338376464643034376339323461316534323965370a346332343530626436663731333438
(略)

在第一行结束时,记录了用于加密的Vault ID。

ansible-vault ansible-playbook等命令会根据文件中记录的Vault ID和ANSIBLE_VAULT_IDENTITY_LIST的定义,获取使用的加密密码并对其进行解密。

因此,唯一需要区分Vault ID和密码的时候是在首次进行加密时。之后,在执行ansible-vault edit或ansible-playbook时,您无需关心这些差异。

下一次的任务 (xià yī cì de

以上方式使得我们能够针对不同环境设置独立的Vault密码,但我们仍然需要使用PC内部的文件和环境变量来管理Vault密码。

因此下一步是将Vault密码保存到云端,并改进从云端获取Vault密码获取脚本的处理。

上一篇:现在才用Ansible Vault对变量和文件进行加密,并在脚本中管理Vault密码 – Qiita
下一篇:现在才用Ansible Vault (3): 在与AWS帐户相关的SSM参数存储中,管理Vault密码 – Qiita

广告
将在 10 秒后关闭
bannerAds