如何在避免将凭据存储在文件中的同时运行Ansible Azure剧本?


13

背景

  1. 我们使用Ansible来配置和管理Azure基础结构。目前,我们“手动”运行Ansible,即我们手动执行各种自动化任务的剧本。没有CI基础架构。
  2. 可能不相关,但我们使用动态脚本管理库存azure_rm.py
  3. 我们鼓励我们尽可能地安全,即
    1. 不要~/.vault_pass在任何本地文件中或任何本地文件中存储保险柜密码
    2. 不要在其中存储Azure机密 ~/.azure/credentials
    3. 不要将任何安全的东西存储在中.bashrc

在这种情况下,我很难提出一种连贯的策略来确保我的剧本可以访问Azure机密,同时遵循上述准则。

如何避免在文件上存储Ansible Vault和Azure凭据,同时又确保我的剧本可以访问它们?

我尝试过的

到目前为止,我已经提出了一个包装器脚本

  1. 向用户询问保险柜密码
  2. 用它来解密Vault Shell脚本
  3. 评估脚本,该脚本将Azure环境变量加载到环境中;
  4. 在已设置的环境上运行剧本。

有更好的解决方案(更优雅,更简单,更“ Ansible”)吗?


在此工作流程中,最让您困扰的是什么?
康斯坦丁·苏沃洛夫

1
@KonstantinSuvorov主要是要达到(至少在我看来)在合规性较高的企业中相当普遍的要求,我需要跳的圈数。
Vish

Answers:


8

保险柜密码

首先,您应该熟悉保管库密码文件可以是可执行脚本的事实。在这种情况下,Ansible执行它,并期望接收密码作为其输出。

例如,您可以使用gpg-agentkeychain存储您的实际密码,并在需要时将其解锁。在此博客文章中了解更多信息:https : //benincosa.com/?p=3235

如果您有点偏执,可以在调用密码脚本时添加通知,如下所示:

#!/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用作实际文件库密钥,并且在使用脚本时还显示带有父进程名称的弹出通知(对于MacOS)。Gpg代理会缓存解锁密码一段时间,因此无需每次启动Playbook时都输入密码。

只需设置vault_password_file = ./vault_pass.sh您的ansible.cfg

环境

您说您azure_rm.py用作动态清单脚本。这意味着您必须在启动ansible-playbook之前将凭据设置到环境变量中,以便它能够使用它们。

您可以制作两个文件:

secure_env (使用保管库加密):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (纯文本):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

打开新终端以执行自动化任务时,必须运行:

source set_env

此时,bash会评估set_envsecure_env(通过ansible-vault解密)。执行此命令后,您已为当前shell定义了Azure凭据,因此您可以照常执行剧本:

ansible-playbook provision-my-azure-instances.yml

因此,使用此两种方法,你可以存储key.gpgsecure_env在你的仓库; 然后在新的终端呼叫中,source set_env一次输入gpg密码(以解锁将来对key.gpg的使用);然后ansible-playbook在没有密码的情况下拨打任意次数的电话。


感谢您的答复。让我在一周内尝试一下。
Vish

因此,与我的原始方法相比,主要优点是它使用GPG-带来了缓存优势-对吗?环境方法与我提出的方法类似。
Vish

1
从OP中,我了解到每次运行剧本时都使用包装器。使用source方法,您可以在每个终端会话中设置一次环境,并且可以分别使用所有工具:ansible-playbook,清单脚本,azure cli,而无需任何包装。
康斯坦丁·苏沃洛夫

啊,明白了。不好对我的团队。接受您的答复是更方便的解决方案。感谢您的研究和解释!另外,我也喜欢您的博客:)
Vish

使用GPG(或macOS或Linux上的钥匙串)的主要好处是,每个团队成员都有自己的身份验证来解锁他们唯一的私钥。然后,此密钥用于解锁Ansible Vault密码,这是一个共享密钥。如果有人离开了团队,您必须旋转所有秘密,包括Ansible Vault密码,但是至少GPG /钥匙串密码不必更改。
RichVel

2

请阅读https://docs.ansible.com/ansible/2.4/vault.html 由于Ansible 2.4可以使用--vault-id @prompt

使用ansible-vault加密文件:

ansible-vault encrypt /path/to/encrypted/file

运行剧本,它将导致:

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

有多种解密文件的选项,包括@prompt

ansible-playbook some-playbook --vault-id @prompt

将提示:

Vault password (default):

输入保险库密码后,剧本应该会成功。


1
阅读页面看起来确实有一个解决方案,但是无法仅使用链接就知道了。您能详细说明一下吗?
Vish

谢谢您的阐述。我确实需要使用较旧的--ask-vault-pass选项要求用户提供保险库密码。而且我不明白用它替换--vault-id将如何回答更好的工作流程的更大问题。
Vish

当您引荐我访问该链接时,我确实看到了一个有趣的选项:ansible-playbook --vault-id my-vault-password.py。我以为您可能在使用python脚本方面有解决方案:)我也在对此进行一些思考。
Vish
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.