在Ansible中运行Azure Playbooks时避免存储凭据的文件

109次阅读
没有评论

问题描述

在使用Ansible管理Azure基础架构时,面临一个问题:他希望在不将Ansible Vault和Azure凭据存储在文件中的情况下,确保他的Playbooks能够访问这些凭据。在现有的安全准则下,他不希望将Vault密码存储在~/.vault_pass或任何本地文件中,也不希望将Azure凭据存储在~/.azure/credentials中,甚至不希望将安全信息存储在.bashrc中。目前他已经尝试了一个包装脚本的方法,但希望有更优雅、更简化、更符合”Ansible”的解决方案。

解决方案

在这个问题的讨论中,我们将介绍两种主要的解决方案:一种是使用可执行的Vault密码脚本,另一种是使用环境变量来存储Azure凭据。我们还将讨论如何使用GPG来加强安全性,并提供了一种更灵活的凭据管理方式。

请注意以下操作可能涉及版本差异,务必根据具体情况进行调整。

方案1:使用可执行的Vault密码脚本

  1. 首先,了解Vault密码文件可以是一个可执行脚本。Ansible会执行这个脚本,并期望从脚本的输出中获取密码。你可以使用gpg-agentkeychain来存储实际密码,并在需要时解锁它。详情可参考这篇博文
  2. 如果你比较谨慎,可以在密码脚本被调用时发送通知,这样你就能知道密码被使用了。例如,你可以创建一个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凭据

  1. 创建两个文件:secure_envset_env
  2. secure_env(使用Vault加密):
    bash
    export AZURE_SECRET=xxx;
    export AZURE_SUBSCRIPTION_ID=xxx;
  3. set_env(明文):
    bash
    echo -n "Setting secure vars... "
    eval $(ansible-vault view secure_env)
    echo "done."
  4. 当你打开新的终端来执行自动化任务时,运行:
source set_env

这个命令会在当前shell中解析set_envsecure_env(通过ansible-vault解密)。这样,Azure凭据就被定义在当前shell中,你可以像往常一样执行Playbooks。

通过这两种方法,你可以将key.gpgsecure_env存储在代码库中,并在新的终端会话中调用source set_env一次,只需一次输入gpg密码(解锁后续使用的key.gpg),然后可以无需密码地多次调用ansible-playbook等工具。

这两种方案中,使用GPG(或在MacOS或Linux上使用keychain)的主要好处是,每个团队成员都有自己的身份验证,以解锁一个对他们唯一的私钥。该私钥用于解锁Ansible Vault密码,这是一个共享的密钥。如果有成员离开团队,你仍然需要轮换所有的密钥,包括Ansible Vault密码,但至少GPG/keychain密码不需要更改。这有助于增强凭据的管理安全性。

正文完