目前我正在编写一个剧本来部署我的 Django 应用程序。它没有什么特别革命性或 secret 的地方,所以我决定开源它。我唯一想保密的当然是我用于部署的 ssh key 。
- 有哪些策略可以解决这个问题?
- 我还想使用 Travis-CI 进行测试。当使用 Travis 测试整个部署时,处理 key 的最佳方法是什么?
非常感谢一些提示。
最佳答案
我最近开始使用加密 secret 和 Travis CI 测试的开源 ansible 基础设施方法 ( GitHub link )。
我用了ansible-vault来加密 secret 。对于每个项目Travis creates a key pair并在 travis-client 的帮助下您可以使用它在 Travis 构建环境中安全地设置保管库密码。
您使用 ansible-vault 方法的案例
在您的特定情况下(您只想部署一个 key ),有 2 种简单的方法可以使用 ansible-vault
加密 key 。
第一种方法:加密静态 key 文件
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
变量文件,并且它不会自动解密部署期间的静态文件或模板。
第二种方法:将 key 放入变量中并加密 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 进行测试相当舒服,但一个主要问题是你仍然将你的 secret 交给 Travis 环境(显然,如果 Travis 受到损害,你的 secret 就会消失) - 所以我建议也许它更安全在 Travis 推出测试中部署/推出虚假数据。我上面提供的项目仍处于早期阶段,还不包含任何真正的生产 secret ,但我将以一种可以在 Travis 部署中轻松部署虚假数据的方式设计我的配置。另外,请确保您不要在 Travis 中记录太多日志(因为对于开源存储库,travis 构建日志也是开源的)。您可以使用 playbook 中的 no_log: yes
变量来避免记录日志。
HashiCorp Vault
另一个非常有趣的处理 secret 的项目来自 HashiCorp:Vault (不要与 ansible-vault
混淆!)我还没有时间仔细研究它,但它看起来非常有前途,对于更大的设置来说似乎是个好主意。
外部文章
这是一个more detailed article关于将 ansible-vault
与 Travis CI 一起使用(也适用于您希望加密敏感模板或其他静态文件的情况,这需要一些小的解决方法,因为 ansible-vault
只是旨在加密包含变量的 .yml
文件)。它还简要讨论了与外部服务共享 secret 的问题。 ( secret 管理是一个非常有趣的话题,我仍在调整我的方法,所以这篇文章仍在制作中,但大部分想法已经在那里提供了)
关于django - 与管理 git checkout for ansible 中使用的 key 相关的最佳实践有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37449082/