我在管理 debian 盒子的流浪环境中使用 ansible。由于具有保险库加密数据(例如数据库根密码)的多个 ansible 供应商,我必须由第一个供应商输入保险库密码一次。目前,此密码存储在/tmp
每个 ansible 供应商中,由脚本读取,并被最后一个供应商覆盖,/dev/null
然后被最后一个供应商删除。
Ansible 能够调用返回保险库密码的脚本。所以这个脚本将在一个单独的 shell 中运行。
如果攻击者设法闯入虚拟机,他就有机会恢复任何临时文件并获得保管库密码。
虽然这些流浪环境将用于生产,但我正在寻找一种更安全的方法。我首先想到的是以某种方式读取和写入内存。因此,VM 重新启动会擦除内存。我知道上面提到的数据可以以某种方式在磁盘上交换。但我认为获取这些数据比临时文件方法更难。
编辑
如果配置程序失败,我忘了提及安全风险。然后最后一个provisioner 将不会被执行,临时文件会保留在文件系统上。
我提供了一个额外的答案,仅针对对导致此问题的起源问题的解决方案感兴趣的任何人显示集成解决方案。
使用以下命令创建 1 MB RAM 磁盘
tmpfs
:ramfs
RAM 磁盘不交换,但在使用 RAM 磁盘时可以关闭和打开交换:tmpfs
和swapoff -a
,swapon -a
如果需要确保在使用tmpfs
RAM 磁盘期间没有发生交换。卸载:也许我错过了一些东西,但我看不到在 ; 中描述 RAM 磁盘的好处
/etc/fstab
;但是,如果需要,以下内容应该足以使 RAM 磁盘root
仅对用户可用(mode=0700
):除了@Christopher 的回答之外,我还想展示我如何将解决方案集成到我的 Vagrantfile 中,以便让它与我的 ansible povisioning 一起工作。
可能会偶然发现这一点。
流浪文件
/vagrant/ansible/scripts/vault-password.sh
虽然它是一个 Debian VM,但我首先运行
ansible
从 Ubuntu 添加 ansible 存储库的 playbook,然后安装最新的ansible
. 这至少对于为Vagrant--vault-id
的调用提供参数是必要的。ansible-playbook
(在这篇文章的时候Debian Stretch
附带了ansible 2.2
不支持这个论点。)然后使用类请求保管库密码
AnsibleVaultPassword
。之后将tmpfs
创建,密码将传递给脚本vault-password.sh
以将其存储在tmpfs
挂载上。然后,ansible 将通过
vault-password.sh
每个提供保险库加密数据的剧本中的脚本来请求密码。最后将首先删除密码,然后
tmpfs
卸载挂载。我认为这是一个非常安全可靠的解决方案,通过临时可擦除内存存储提供 ansible vault 密码。因此,可以配置正在运行的系统,并且不再需要重新启动。