现在才使用 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文档
根据每个环境指定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 密码
在对每个文件进行解密时,需要使用与加密时使用的相同的保险库密码,但是在使用命令如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