问题描述
在使用Ansible管理Azure基础架构时,面临一个问题:他希望在不将Ansible Vault和Azure凭据存储在文件中的情况下,确保他的Playbooks能够访问这些凭据。在现有的安全准则下,他不希望将Vault密码存储在~/.vault_pass
或任何本地文件中,也不希望将Azure凭据存储在~/.azure/credentials
中,甚至不希望将安全信息存储在.bashrc
中。目前他已经尝试了一个包装脚本的方法,但希望有更优雅、更简化、更符合”Ansible”的解决方案。
解决方案
在这个问题的讨论中,我们将介绍两种主要的解决方案:一种是使用可执行的Vault密码脚本,另一种是使用环境变量来存储Azure凭据。我们还将讨论如何使用GPG来加强安全性,并提供了一种更灵活的凭据管理方式。
请注意以下操作可能涉及版本差异,务必根据具体情况进行调整。
方案1:使用可执行的Vault密码脚本
- 首先,了解Vault密码文件可以是一个可执行脚本。Ansible会执行这个脚本,并期望从脚本的输出中获取密码。你可以使用
gpg-agent
或keychain
来存储实际密码,并在需要时解锁它。详情可参考这篇博文。 - 如果你比较谨慎,可以在密码脚本被调用时发送通知,这样你就能知道密码被使用了。例如,你可以创建一个bash脚本如下:
#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null
这个脚本使用key.gpg
作为实际的Vault密钥,并在脚本被使用时显示弹出通知(适用于MacOS)。gpg-agent
会缓存解锁密码,所以你不必每次启动Playbook都输入密码。
3. 在你的ansible.cfg
中设置vault_password_file = ./vault_pass.sh
。
方案2:使用环境变量来存储Azure凭据
- 创建两个文件:
secure_env
和set_env
。 secure_env
(使用Vault加密):
bash
export AZURE_SECRET=xxx;
export AZURE_SUBSCRIPTION_ID=xxx;set_env
(明文):
bash
echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."- 当你打开新的终端来执行自动化任务时,运行:
source set_env
这个命令会在当前shell中解析set_env
和secure_env
(通过ansible-vault解密)。这样,Azure凭据就被定义在当前shell中,你可以像往常一样执行Playbooks。
通过这两种方法,你可以将key.gpg
和secure_env
存储在代码库中,并在新的终端会话中调用source set_env
一次,只需一次输入gpg密码(解锁后续使用的key.gpg
),然后可以无需密码地多次调用ansible-playbook
等工具。
这两种方案中,使用GPG(或在MacOS或Linux上使用keychain)的主要好处是,每个团队成员都有自己的身份验证,以解锁一个对他们唯一的私钥。该私钥用于解锁Ansible Vault密码,这是一个共享的密钥。如果有成员离开团队,你仍然需要轮换所有的密钥,包括Ansible Vault密码,但至少GPG/keychain密码不需要更改。这有助于增强凭据的管理安全性。