首页 > 解决方案 > Ansible - 正确加密/解密和使用文件内容(不是 YAML)

问题描述

所以我使用ansible-vault create my.key.

然后我将它用作var:

my_key: "{{ lookup('file','{{ inventory_dir }}/group_vars/my.key') }}"

然后在运行我的剧本时,像这样:

- name: Create My Private Key
  ansible.builtin.copy:
    content: "{{ secrets.my_key }}"
    dest: "{{ secrets_key }}"
    no_log: true

它确实在远程主机上正确创建了密钥,然后未加密。但我在想这是否是正确的做法?它是否在正确的时间解密并且我没有将敏感数据暴露在不应该出现的地方?

我认为加密变量也必须!vault指定关键字。但是,如果我为我的 执行此操作,则会my_key收到此错误:

fatal: [v14-test]: FAILED! => {"msg": "input is not vault encrypted data. "}

所以这让我很担心,该文件在错误的时间未加密,或者消息可能具有误导性或其他原因。

这是正确的方法吗?或者我应该做不同的事情?

标签: encryptionansibleansible-vault

解决方案


首先,关于这种方法是否合适的明确答案与您希望通过加密实现的目标直接相关。因此,这里的所有答案都是讨论 Vault 的工作原理,然后您可以决定它是否适合您的要求。

从根本上说,您所做的是对 Ansible Vault 的“正确”使用,尽管我以前没有看到它在这个工作流程中使用过(通常我见过create用于加密 vars 的 YAML 文件)。

使用您的方法,您的秘密将变成密文并存储在my.key其中(可以使用基本的文本工具,如catless或来确认more)。您将看到文件的第一行,其中包含一堆元数据,这些元数据允许 Ansible 理解文件内容并按需解密。

在运行时,Ansible 将使用加密文件的密码/密钥(通过多种方法访问)将文件内容解密为纯文本,然后将其存储在变量my_key中以供播放期间使用。

在确定 Ansible Vault 是否适合您时要考虑的事项的非详尽列表:

  • Ansible Vault 加密纯粹是为了保护静态机密(即当它们存储在硬盘上时)
  • 在运任何人都无法通过查看my.key文件内部来查看明文。但是,根据他们的访问级别、技能以及您的 Ansible 任务正在做什么,他们可能能够从正在运行的进程中访问明文。)
  • 在进程内部,数据只是纯文本,很容易泄漏(例如,通过将内容写入日志文件 - 签出 Ansible no_log选项)
  • 在运行时,Ansible 需要某种方式来访问解密密文所需的密钥。它提供了多种方法,包括提示用户、从存储在磁盘上的文件访问它、从 Env var 访问它、使用脚本/集成从另一个秘密管理工具中提取它。需要仔细考虑选择哪个选项,相对于您希望通过加密实现的目标(例如,如果您的目标是在您的笔记本电脑被盗时保护您的数据,那么将密钥存储在相同的系统,使整个操作毫无意义)。很多时候,使用更复杂的方法,您仍然可能最终陷入“鸡与蛋”的境地,这再次与您使用加密的目标有关
  • 我可能是在谈论完整的鞋匠,或者是一个试图散布虚假信息的邪恶个体,所以如果秘密的价值对你很重要,请仔细阅读文档:)

不幸的是,一般来说,良好的安全性比良好的安全性更难实现:|


推荐阅读