django - 与管理 git checkout for ansible 中使用的 key 相关的最佳实践有哪些?

标签 django deployment travis-ci ansible

目前我正在编写一个剧本来部署我的 Django 应用程序。它没有什么特别革命性或 secret 的地方,所以我决定开源它。我唯一想保密的当然是我用于部署的 ssh key 。

  1. 有哪些策略可以解决这个问题?
  2. 我还想使用 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/

相关文章:

python - settings.py 中的命名空间问题

javascript - 表单数据未发送到服务器

r - Travis CI 无法在 pkg-config 搜索路径中找到包

python - Django 动态过滤器集

Django 全文搜索优化 - Postgres

postgresql - Postgres 和 Sequelize 的 Heroku 部署问题

maven - travis-ci 中构建的 Github Gradle 项目如何访问通常在我的本地 Maven 存储库中找到的依赖项?

ruby - psql : could not connect to server error on "travis-ci"

django - mod_deflate与Django GZipMiddleware,哪个用于部署?

python - Django 和 Deployment 中的私有(private)设置