与管理ansit的git checkout中使用的密钥相关的最佳实践是什么?

时间:2016-05-25 23:11:33

标签: django deployment ansible travis-ci ansible-playbook

目前我正在编写一个Playbook来部署我的Django应用程序。关于它没有特别的革命性或秘密性,所以我决定开源。我唯一想保密的当然是我用于部署的ssh密钥。

  1. 有哪些策略可以解决这个问题?
  2. 我还想用Travis-CI进行测试。当使用Travis测试整个部署时,处理密钥的最佳方法是什么?
  3. 非常感谢一些提示。

1 个答案:

答案 0 :(得分:2)

我最近开始使用加密机密和Travis CI测试(GitHub link)的开源安全基础设施方法。

我使用ansible-vault来加密秘密。对于每个项目Travis creates a key pair,在travis-client的帮助下,您可以使用它在Travis构建环境中安全地设置保管库密码。

您使用ansible-vault方法的案例

在您的特定情况下(您只想部署一个密钥),有两种简单的方法可以使用ansible-vault加密密钥。

第一种方法:加密静态密钥文件

ANSIBLE_VAULT_PASSWORD_FILE=vault_pass ansible-vault encrypt <key_file>

然后,您可以将以下任务复制到节点:

- copy: 
    content={{ lookup('pipe', 'ansible-vault --vault-password-file vault_pass view <key_file>') }}
    dest=/<deploy_user>/.ssh/id_rsa

lookup解决方法是必要的,因为ansible-vault旨在加密/解密.yml变量文件,并且在部署期间不会自动解密静态文件或模板。

第二种方法:将密钥放在变量中并加密var文件

另一种方法是将您的私钥添加到.yml文件(并像上面那样加密),然后可以通过ansible动态解密:

secrets.yml

private_key: |
  <copy-key-here>

然后,您可以在任务中引用该变量。

最后,这两种方法都可以通过以下方式推出:

ANSIBLE_VAULT_PASSWORD_FILE=vault_pass ansible-playbook -i <inventory-file> <playbook-file>

现在您需要与Travis共享您的vault_pass(或解密vault_pass文件的密码)。这在上面的Travis链接中有很好的记录。在上一节中,我提供了一篇文章,其中也解释了如何做到这一点。

深入挖掘

尽管对于您手头的问题可能有点超出范围,但我想就此主题分享更多想法。

安全问题

虽然使用Travis进行测试非常舒服,但一个主要问题是你仍然将你的秘密交给Travis环境(显然如果Travis受到了损害,你的秘密就消失了) - 所以我建议也许它更安全在Travis部署测试中部署/部署虚假数据。我上面提供的项目仍然处于早期阶段,并且不包含任何真实的生产秘密(但是),但我将以一种我可以在Travis部署中轻松部署虚假数据的方式设计我的配置。另外,请确保您不要在Travis中记录太多(因为对于开源repos,travis构建日志也是开源的)。您可以避免在剧本中使用no_log: yes变量进行日志记录。

HashiCorp Vault

另一个处理秘密的非常有趣的项目来自HashiCorp:Vault(不要误以为ansible-vault!)我还没有时间仔细研究它,但它看起来很有前途,对于更大的设置似乎是一个好主意。

外部文章

以下是more detailed article关于将ansible-vault与Travis CI一起使用的情况(也适用于您希望加密敏感模板或其他静态文件的情况,这需要一些小的解决方法,因为ansible-vault是仅用于加密包含变量的.yml个文件。它还简要讨论了与外部服务共享秘密的问题。 (秘密管理是一个非常有趣的话题,我仍在调整我的方法,所以这篇文章仍在制作中,但大部分的想法已经在那里提供了)