在哪里放置ansible-Vault密码


24

我们计划在项目中使用ansible保管库,以防止git中的密码或密钥泄漏。

想法是将所有敏感数据放入一个普通文件中,然后在推送到git之前使用密码使用ansible-vault对该文件进行加密。

要解密文件,我们必须将Vault密码传递给ansible,我正在考虑3种可能性:

  • 将其存储在服务器环境变量中
  • 将其作为选项传递给ansible-playbook命令
  • 将其存储到未版本控制的文件中。

是否还有其他选择,这是存储ansible-Vault密码的最佳(和安全)方法,而ansible最佳做法文档对此没有说明。



这里有一些很好的答案:devops.stackexchange.com/questions/3806/…–
Vish

Answers:


12

这个想法是把我们所有的敏感数据[...]

在实施您计划的解决方案之前,应非常仔细地分析这句话中“全部”的含义。

Ansible保管库是一个非常有用的工具,但仅应用于存储以下机密:

  1. Ansible部署特别需要
  2. 对于不知道它们的所有者而言,很容易变得毫无用处,但可能会非法“记住”它们(通常是离职的员工)

第二点很关键。

许多人,甚至可能是整个DevOps团队,都将有权使用安全的Vault密码,从而可以访问所有机密信息。

因此,对于存储在金库中的所有机密,应满足以下条件:如果需要,未经授权访问它们的个人或机器应无能力使用它们。

具体来说,如果您使用ansible部署数据库及其用户,则可以将密码存储在Vault中,但是如果可以从Internet获得该服务,则必须非常小心(并且很可能考虑其他解决方案)。而且不需要任何VPN验证!

如果对用户(DevOps)施加了一个安全屏障(例如,撤销了VPN访问),则暴露给该秘密的用户(DevOps)应该不能使用“记住的”密码。除此之外,在更改密码之前,也应撤消对源代码存储库(存储金库的位置)的访问。

在这种情况下,ansible库是非常有用的工具。

试图在保管库中存储Internet上任何人或机器都可以使用的秘密将是一个错误(例如,用户的VPN凭据)。

是否还有其他选择,这是存储ansible-Vault密码的最佳(和安全)方法

在上一段的条件下,我认为一个好的做法是:

  1. 将文件库密码存储在外部安全文件库中(例如HashiCorp的文件库或用于凭据管理的任何SaaS)
  2. 允许访问DevOps的外部保管库项目(他们将需要密码进行测试)以及CI / CD系统或Ansible控制器
  3. 遵守约定使用秘密!您将无法查看对机密的更改,也无法grep机密文件中的ansible变量!因此,从一开始就要彻底。一个好的约定是用一个secret_前缀命名存储在ansible保管库中的所有变量。当您看到如下内容时:

    postgres.yml:

    postgres_password: "{{ secret_postgres_password }}"
    

    您将知道该值存储在ansible保管库中。


有关将Ansible Vault密码存储在更安全的地方(HashiCorp Vault或SaaS保险库(例如AWS Secrets Manager))的要点。但是,如果有人离开了团队,仍然需要轮换(更改),因为即使他们短暂访问了团队。可以通过使用单独的保管库(开发,测试,生产)(即YAML中的机密文件)来缓解这种情况。Ansible 2.4+还允许您使用“文件库ID”为此类文件指定不同的密码- 文档页面
RichVel

Ansible 2.3引入了一项功能,该功能仅加密 YAML文件中的值,而不加密整个文件中的内容-比您在答案末尾的第3点中提到的较早的约定更易于维护。
RichVel

6

我们计划在项目中使用ansible保管库,以防止git中的密码或密钥泄漏。

由于您尚未执行任何操作,因此您可以重新考虑这一点。使用Ansible Vault这样的系统有许多安全方面的缺点:

  • 没有谁访问过它的审核记录
  • 当员工离开时,他们很容易带走秘密商店
  • 当员工离职时,删除其访问权限意味着更改密码并将其重新分发给其他所有人
  • 可以在旧版本的保管库中永久使用已损坏的Ansible保管库密码,该密码存储在版本控制中
  • 秘密必须是静态的

一个没有这些缺点的可能更安全(尽管更复杂)的系统是使用Hashicorp Vault存储您的秘密。然后,您仍然可以使用https://github.com/jhaals/ansible-vault,几乎像从Ansible Vault中一样轻松地从中提取值。

然后,您必须管理对Hashicorp Vault的身份验证,这就是乌龟问题。对于人类而言,我认为最好的解决方案是定期提示输入密码,并在很短的时间后使令牌过期。对于机器,请使用AWS身份验证后端或类似身份验证。您永远无法完全摆脱对某处进行身份验证的需求,但可以使攻击者更难获得对其的访问权限。

现在,如果对您而言设置和管理机密服务器太多了,那么您当然可以使用Ansible保管库。为什么要将密码完全存储在各个计算机上?对于交互式使用,您只需提示输入密码,用户便可以将其存储在所选的密码管理器中。OS X上的iTerm具有与Keychain.app集成的密码管理器,使密码管理器在此特别容易。


1
使用ansible保管库的最佳方法是不使用它。.谢谢您指出这一点!
风暴

对于中小型组织,我建议您考虑使用基于云的秘密管理器(例如AWS Secrets Manager),这比为HashiCorp Vault运行高可用性集群要少得多,但是可以大大改善Ansible的安全性保险柜,包括审核和精细的访问控制。当然,您最终会依赖于该服务,但是可以通过一些应用程序编码和Ansible工作将其封装。主要好处是,某些机密根本不需要由Ansible进行管理,例如DB密码-只需让该应用从机密管理器中获取机密即可。
RichVel

3

这很大程度上取决于您在处理敏感数据方面的内部政策。

我想告诉您我的处理方法,并说明我认为的利弊。我将Ansible Vault密码保存在控制机器上的文件中,并有一个指向它的环境变量:

export ANSIBLE_VAULT_PASSWORD_FILE=/deep/dark/place

我在工作站上有该设备(因为我需要测试和开发剧本),一些同事也有,当然我们也将其安装在主要的Ansible控制机器上。

优点:

  • 不在共享的位置/存储库中(如您所说,这是非版本文件)
  • 无需知道您的Ansible保管库密码即可运行播放(这是在您拥有CI工具(例如Jenkins)的条件下,您可以在其中轻松启动剧本)

缺点:

  • 不容易旋转密码
  • 每个在您的剧本上工作的人都需要将其放在工作站上

缺点确实可以缓解,但还是取决于您在日常运营中采用的政策和规则。


1
不错的组合..检查其他答案,尽管您可能会感兴趣。
暴风雨

0

看看这个项目来管理您的ansible Vault加密密码https://github.com/Smile-SA/ansible-vault-manager

它使用插件处理多个密钥环存储平台(目前仅实现AWS SSM)。将Morehover与当前的Ansible项目集成非常容易。


如果您更轻松地将其具体化,而不是添加一般性的内容,将会有所帮助。我阅读了github页面的自述文件,但是您能否更改答案,所以它包含一个清晰的示例?我想尝试一下。
030
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.